59 lines
1.3 KiB
Text
59 lines
1.3 KiB
Text
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.
|