import mip. go => data(Items,Value,Weight,Volume,MaxWeight,MaxVolume), knapsack_problem(Value,Weight,Volume,MaxWeight,MaxVolume, X,Z), println(z=Z), println(x=X), N = Items.len, foreach({Item,Num} in zip(Items,X), Num > 0) printf("Take %d of %w\n", Num,Item) end, print("\nTotal volume: "), println(sum([X[I]*Volume[I] : I in 1..N])), print("Total weight: "), println(sum([X[I]*Weight[I] : I in 1..N])), print("Total cost: "), println(sum([X[I]*Value[I] : I in 1..N])), nl. knapsack_problem(Value,Weight,Volume,MaxWeight,MaxVolume, X,Z) => println([max_weight=MaxWeight,max_volume=MaxVolume,z=Z]), N = Value.length, X = new_list(N), X :: 0..1000, Z #= sum([X[I]*Value[I] : I in 1..N]), foreach(I in 1..N) X[I] #>= 0 end, limit(Weight, X, MaxWeight), limit(Volume, X, MaxVolume), if var(Z) then println(maximize), solve($[glpk,max(Z)], X) else solve($[glpk], X) end. limit(W, Take, WTMax) => sum([W[I]*Take[I] : I in 1..W.length]) #<= WTMax. % data data(Items,Value,Weight,Volume,MaxWeight,MaxVolume) => Items = ["panacea","ichor","gold"], Value = [3000.0, 1800.0, 2500.0 ], Weight = [ 0.3, 0.2, 2.0 ], Volume = [ 0.025, 0.015, 0.002], MaxWeight = 25.0, MaxVolume = 0.25.