Python 生成器表达式在具有纸浆的线性规划约束中不按预期工作
我试图用纸浆来解决这个最小化问题 我们有一包一包的芒果,每包都有一个类别、年龄和芒果的数量Python 生成器表达式在具有纸浆的线性规划约束中不按预期工作,python,linear-programming,pulp,Python,Linear Programming,Pulp,我试图用纸浆来解决这个最小化问题 我们有一包一包的芒果,每包都有一个类别、年龄和芒果的数量 # Packet Names and the count, category and age of mangoes in each packet. mango_packs = { "pack_1": { "count": 5, "category": "pack", "age"
# Packet Names and the count, category and age of mangoes in each packet.
mango_packs = {
"pack_1": {
"count": 5,
"category": "pack",
"age": 10
},
"pack_2": {
"count": 9,
"category": "pack",
"age": 10
},
"bag_2": {
"count": 5,
"category": "bag",
"age": 20
},
"sack_1": {
"count": 5,
"category": "sack",
"age": 5
},
}
我们将需要大量芒果。(这将是一个整数)。
我们的目标是以较少残留芒果的方式提供包装。
例如,如果需求量为10,则我们为该包提供10个芒果。如果没有,则提供2包,每包5个芒果。如果我们只有3包,每包5、7和6个芒果,那么我们提供的是5和6个芒果,所以我们只有1个剩余。下面的代码正是我们需要的
对于需求15,它将给出以下输出
状态:最佳
OpenPack\u bag\u 2?对
OpenPack\u pack\u 1?对
OpenPack\u pack\u 2?没有
OpenPack_sack_1?对
TypeError:int()参数必须是字符串、类似字节的对象或数字,而不是“NoneType”
由于某种原因,生成器表达式中的if条件似乎总是返回True。不太确定
如何解决这个问题?我们需要添加新的2个约束
不带2个新约束的工作代码可以从此处运行:
编辑:
相同的数据在这里表示不同,如果它有助于尝试解决方案的人,因为我相信我们需要重新构建模型以找到解决方案
mango_packs_cat = {
"cat_pack": {
"packets": {
"pack_1": {
"name": "pack_1",
"count": 5
},
"pack_2": {
"name": "pack_2",
"count": 9
}
},
"age": 10
},
"cat_bag": {
"packets":{
"bag_1":{
"name": "bag_1",
"count": 5
}
},
"age": 20
},
"cat_sack": {
"packets":{
"sack_1":{
"name": "sack_1",
"count": 5
}
},
"age": 5
}
}
我不认为你可以将集合的大小求和,并将其作为约束条件呈现给解算器……所以这可能是该语句的问题所在 您需要重新格式化模型,并为切换约束添加另一个索引变量。切换约束应为二进制值,按不同类别索引 您应该使用如下内容启用变量:(伪代码)
x[pack,cat]谢谢你的回答。我对纸浆和尝试这种解决方案是新手。但是到目前为止还没有得到正确的解决方案。
prob += len(set([mango_packs[name]["category"] for name in pack_names if lp_pack_vars[name] == 1 ])) <= 2
print("{}? {}".format(v.name, ("no", "yes")[int(v.varValue)]))
mango_packs_cat = {
"cat_pack": {
"packets": {
"pack_1": {
"name": "pack_1",
"count": 5
},
"pack_2": {
"name": "pack_2",
"count": 9
}
},
"age": 10
},
"cat_bag": {
"packets":{
"bag_1":{
"name": "bag_1",
"count": 5
}
},
"age": 20
},
"cat_sack": {
"packets":{
"sack_1":{
"name": "sack_1",
"count": 5
}
},
"age": 5
}
}
x[pack, cat] <= u[pack, cat]*y[cat]
sum(y[cat]) <= 2