PuLP:坚持 objective 函数定义

PuLP: Stuck with objective function definition

我是第一次使用 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

您可以使用

检查您的问题
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