model ModelName uses "mmxprs"; !gain access to the Xpress-Optimizer solver !sample declarations section declarations BINS: set of string ITEMS: set of string BinCapacity: array(BINS) of real ItemSize: array(ITEMS) of real BinAllowed: array(ITEMS) of set of string end-declarations !initialisations BinCapacity:: (["Bin A","Bin B","Bin C"])[10, 20, 30] ItemSize:: (["Item 1", "Item 2","Item 3","Item 4"])[5,8,10,15] BinAllowed("Item 1"):= {"Bin A","Bin B"} BinAllowed("Item 2"):= {"Bin B","Bin C"} BinAllowed("Item 3"):= {"Bin A","Bin C"} BinAllowed("Item 4"):= {"Bin A","Bin B","Bin C"} finalise(BINS) finalise(ITEMS) declarations use_bin: array(BINS) of mpvar item_in_bin: dynamic array(ITEMS,BINS) of mpvar end-declarations !create variables forall(i in ITEMS, j in BINS | j in BinAllowed(i)) do create(item_in_bin(i,j)) item_in_bin(i,j) is_binary end-do forall(j in BINS) do use_bin(j) is_binary end-do !constraints forall(i in ITEMS, j in BINS) do item_in_bin(i,j) <= use_bin(j) end-do forall(i in ITEMS) do sum(j in BINS) item_in_bin(i,j) = 1 end-do forall(j in BINS) do sum(i in ITEMS) ItemSize(i) * item_in_bin(i,j) <= BinCapacity(j) end-do NumBins:= sum(j in BINS) use_bin(j) minimise(NumBins) end-model