首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PuLP:坚持使用目标函数定义

PuLP:坚持使用目标函数定义
EN

Stack Overflow用户
提问于 2020-03-17 16:49:40
回答 1查看 129关注 0票数 0

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

我试试这个:

代码语言:javascript
复制
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)

结果:

代码语言:javascript
复制
 print("Status:",pulp.LpStatus[lp_prob.status])

显示最优

lp_prob.objective10*Packs_10 + 15*Packs_15 + 30*Packs_30 - 16.5

但解决方案是每包大小为0

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-17 17:27:36

您可以使用以下命令检查您的问题

代码语言:javascript
复制
print(lp_prob)

您不需要添加任何必要的约束来防止所有变量变为零。很可能,您在约束语句中打印错误。此约束使问题不是微不足道的(选中括号):

代码语言:javascript
复制
lp_prob += pulp.lpSum(sum([pack_sizes[pack_name]*packs_used[pack_name] for pack_name in list_of_pack_names])) >= target_qty
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60718951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档