python - 纸浆:卡在目标函数定义上
问题描述
我是 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
解决方案
你可以检查你的问题
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
推荐阅读
- google-cloud-storage - 如何衡量每个用户在谷歌云存储上的带宽使用情况?
- python - 平均列表中的数字
- python - list=[] 和从列表中删除所有元素之间的区别
- php - Symfony/doctrine 消耗大量内存,内存不足错误
- android - TextView 中的白屏
- rust - 使用 Diesel 的 `belongs_to` 属性时“使用未声明的类型或模块”
- python - run.font.italic 和 run.font.bold 返回 None 而不是 True
- java - Java:如何不仅按名称,而且按大小和内容搜索文件夹中的重复文件?
- c++ - 如何自动创建字符串的编译时容器
- git - Azure DevOps - 我应该将代码从源合并到我的分支并提交吗?