model "BinPacking" uses "mmxprs" parameters NUMBINS = 4 NUMITEMS = 8 OUTFILE = "BinPackingSolution.txt" end-parameters declarations BINS = 1..NUMBINS ITEMS = 1..NUMITEMS BinCapacity: array(BINS) of integer ItemSize: array(ITEMS) of integer Status: boolean use_bin: array(BINS) of mpvar item_in_bin: array(ITEMS, BINS) of mpvar end-declarations BinCapacity:= [10,10,20,20] ItemSize:= [6,2,12,1,5,6,7,6] forward function CheckFeasibility: boolean forward procedure PrintSolution Status:= CheckFeasibility if Status = true then NumBins:= sum(j in BINS) use_bin(j) forall(i in ITEMS, j in BINS) do BinRestriction(i,j):= item_in_bin(i,j) <= use_bin(j) end-do forall(i in ITEMS) do ItemInBinOnce(i):= sum(j in BINS) item_in_bin(i,j) = 1 end-do forall(j in BINS) do Capacity(j):= sum(i in ITEMS) ItemSize(i) * item_in_bin(i,j) <= BinCapacity(j) end-do forall(j in BINS) do use_bin(j) is_binary forall(i in ITEMS) do item_in_bin(i,j) is_binary end-do end-do minimise(NumBins) PrintSolution fopen(OUTFILE, F_OUTPUT) PrintSolution fclose(F_OUTPUT) end-if !*****START OF PROCEDURES function CheckFeasibility: boolean !note: this is necessary, but not sufficient declarations TotalBinCap: integer TotalItemSize: integer Result: boolean end-declarations TotalBinCap:= sum(j in BINS) BinCapacity(j) TotalItemSize:= sum(i in ITEMS) ItemSize(i) if TotalItemSize <= TotalBinCap then Result:= true else Result:= false end-if returned:= Result end-function procedure PrintSolution forall(j in BINS) do if getsol(use_bin(j)) > 0 then write("Bin ", j, "(", BinCapacity(j), "):") forall(i in ITEMS | getsol(item_in_bin(i,j)) > 0) do write(i, "(", ItemSize(i), ") ") end-do writeln else writeln("Bin ", j, " is not used.") end-if end-do end-procedure end-model