我是第一次使用PuLP,上次我做线性编程时,Python语言还不存在。我可以用LibreOffice的solve扩展(它支持LP)解决这个问题。
但我需要用代码来完成。
我想优化一个选股问题。我们需要挑选一定数量的螺丝,比如98颗。螺丝每包25颗和100颗。我将这些包装尺寸命名为'25‘和'100’。挑选的成本需要最小化。挑选每一包都是有成本的,而且挑选的多余数量也有成本。约束条件是>= target_qty挑选的数量
例如,如果每单位超额的成本是0.1,挑选'25‘包装的成本是1,包装' 100’包装的成本是1.1,则挑选的成本是1 x 100包装是
(100 - 98) *.1 + 0*1 + 1*1.1
这比选择4*25‘包更便宜。
假设存在字典pack_cost{}和pack_capacity{},它们都具有密钥pack_name,例如pack_cost = {'25':1,'100':1.1},因此具有list_of_pack_names = ['25','100']
我试试这个:
lp_prob = pulp.LpProblem('PackSizes', pulp.LpMinimize)
packs_used = pulp.LpVariable.dicts("Packs",list_of_pack_names,lowBound=0,cat="Integer")
pack_cost = [pack_costs[pack_name]*packs_used[pack_name] for pack_name in list_of_pack_names]
excess_cost = cost_per_unit * ( sum([pack_sizes[pack_name]*packs_used[pack_name] for pack_name in list_of_pack_names])- original_qty)
lp_prob += pulp.lpSum(pack_cost) + pulp.lpSum(excess_cost) #objective function
# and constraint: total picked >= needed
lp_prob += pulp.lpSum(sum([pack_sizes[pack_name]*packs_used[pack_name] for pack_name in list_of_pack_names]) >= target_qty)结果:
print("Status:",pulp.LpStatus[lp_prob.status])显示最优
lp_prob.objective为10*Packs_10 + 15*Packs_15 + 30*Packs_30 - 16.5
但解决方案是每包大小为0
发布于 2020-03-17 17:27:36
您可以使用以下命令检查您的问题
print(lp_prob)您不需要添加任何必要的约束来防止所有变量变为零。很可能,您在约束语句中打印错误。此约束使问题不是微不足道的(选中括号):
lp_prob += pulp.lpSum(sum([pack_sizes[pack_name]*packs_used[pack_name] for pack_name in list_of_pack_names])) >= target_qtyhttps://stackoverflow.com/questions/60718951
复制相似问题