PuLP:卡在目标函数定义中

问题描述 投票:0回答:1

我是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.objective10*Packs_10 + 15*Packs_15 + 30*Packs_30 - 16.5

但是解决方案是每个包装尺寸为0

python pulp
1个回答
1
投票

您可以通过]检查您的问题>

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_qty
© www.soinside.com 2019 - 2024. All rights reserved.