RosettaCodeData/Task/Knapsack-problem-Unbounded/Picat/knapsack-problem-unbounded.picat
2023-07-01 13:44:08 -04:00

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.