import java.io.*; import java.util.*; import java.util.Arrays; import java.util.Collections; import org.chocosolver.util.tools.ArrayUtils; import org.chocosolver.solver.Model; import org.chocosolver.solver.Solver; import org.chocosolver.solver.variables.IntVar; import org.chocosolver.solver.constraints.IIntConstraintFactory.*; import org.chocosolver.solver.constraints.Constraint; import org.chocosolver.solver.search.strategy.Search; public class BinPack { int[] data; // the data to be packed Model model; // the model :) Solver solver; // a solver object, to attach variables and constraints IntVar inBin[][]; // inBin[i][j] = 1 iff jth number is in ith bin IntVar load[]; // load[i] is sum of the numbers in ith bin IntVar binUsed[]; // binUsed[i] = 1 iff load[i] > 0 IntVar totBinsUsed; // total number of bins used int c; // the capacity of each bin int n; // number of items to pack int m; // number of bins you have String id; // an identification for the problem public BinPack(String fname,int numberOfItems,int numberOfBins,int capacity) throws Exception { n = numberOfItems; m = numberOfBins; c = capacity; id = fname; data = new int[n]; model = new Model(id); solver = model.getSolver(); inBin = model.intVarMatrix("inBin",m,n,0,1); load = model.intVarArray("load",m,0,c); binUsed = model.intVarArray("binUsed",m,0,1); totBinsUsed = model.intVar("totBinsUsed",0,m); Scanner sc = new Scanner(new File(fname)); for (int j=0;j",0); Constraint c2 = model.arithm(binUsed[i],"=",1); model.ifThen(c1,c2); model.ifThen(c2,c1); } // // constrain binUsed[i] to be 1 if and only if there are some // items stacked in the ith bin, i.e. load[i] > 0 // for (int i=0;i=",load[i+1]).post(); // // symmetry breaking consistent with first fit decreasing // heaviest bins are low index // // EDIT // model.lexChainLessEq(inBin).post(); // // symmetry breaking such that inBin[i] lex< inBin[i+1] // } public void swap(int[] a,int i,int j){ int temp = a[i]; a[i] = a[j]; a[j] = temp; } public void reverse(int[] a,int lwb,int upb){ if (lwb