我正在创建一个更大的LP模型,该模型需要将生产设备i的产品k分配给客户j。我在实施与在容器中运输产品有关的约束时遇到了麻烦。
z_ij是从位置i运送到j的集装箱数量。
x_ijk是从i运送到j的产品k的数量。
如果一种产品填充了一个容器的1%,那么我需要模型知道,如果我们装运150种产品,则应该分配2个容器。
我正在使用x_ijk决策变量实现约束。对于每个i和每个j,决策变量的总和必须乘以一个因子(乘积占用了多少容器)。
我尝试创建一个名为container_cap的字典,以显示产品占用了多少容器。将其与我的决策变量相乘即可提供所需数量的容器。
#Containers to ship
for i in production:
for j in warehouse:
prob += lpSum([x[i][j][k]] * container_cap[k] for k in product) <= lpSum([z[i][j]])
但是,我收到“无法将序列乘以'list'类型的非整数”的错误。
有什么建议吗?
答案 0 :(得分:1)
上面的代码中出现一个字符错误。您已撰写:
prob += lpSum([x[i][j][k]] * container_cap[k] for k in product) <= lpSum([z[i][j]])
在这种情况下,您尝试将一个元素[x[i][j][k]]
的列表乘以一个潜在的非整数container_cap[k]
。这就是为什么您引发错误。在python中,您可以将列表乘以n,从而将列表重复n次。但是n必须是整数。
我想你想写的是:
prob += lpSum([x[i][j][k] * container_cap[k] for k in product]) <= lpSum([z[i][j]])
在这里,您要汇总一个项目列表,可能已经定义了列表k
中的每个项目product
都有一个项目,然后说该列表需要小于另一个值。
此外,除非我误解了您的模型,否则不需要第二个lpSum
。您基本上是说,从i
到j
计划的容器数量必须足以容纳从i
到j
计划的所有产品;所以我认为您需要以下条件:
prob += lpSum([x[i][j][k] * container_cap[k] for k in product]) <= z[i][j]