PuLP 中的字典乘法 - 约束实现
Dictionary multiplication in PuLP - constraint implementation
我正在创建一个更大的 LP 模型,它需要将产品 k 从生产设施 i 分配给客户 j。我在实施与用集装箱运输产品相关的约束时遇到问题。
z_ij 是从位置 i 到 j 的集装箱数量。
x_ijk是产品k从i运到j的数量。
如果一个产品占了一个容器的 1%,我需要模型知道它应该分配 2 个容器,如果我们运送 150 个产品。
我正在使用 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]])
但是,我得到一个 "Can't multiply sequence by non-int of type 'list'"-错误。
有什么建议吗?
您在上面的代码中有一个字符错误。您写了:
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]])
在这里,您要对项目列表求和,列表 product
中的每个项目 k
可能已经定义,然后说该列表需要小于另一个值。
此外,除非我误解了您的模型,否则第二个 lpSum
不是必需的。您基本上是说从 i
到 j
安排的容器数量需要足以容纳从 i
到 j
安排的所有产品;所以我想你想要以下内容:
prob += lpSum([x[i][j][k] * container_cap[k] for k in product]) <= z[i][j]
我正在创建一个更大的 LP 模型,它需要将产品 k 从生产设施 i 分配给客户 j。我在实施与用集装箱运输产品相关的约束时遇到问题。
z_ij 是从位置 i 到 j 的集装箱数量。
x_ijk是产品k从i运到j的数量。
如果一个产品占了一个容器的 1%,我需要模型知道它应该分配 2 个容器,如果我们运送 150 个产品。
我正在使用 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]])
但是,我得到一个 "Can't multiply sequence by non-int of type 'list'"-错误。
有什么建议吗?
您在上面的代码中有一个字符错误。您写了:
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]])
在这里,您要对项目列表求和,列表 product
中的每个项目 k
可能已经定义,然后说该列表需要小于另一个值。
此外,除非我误解了您的模型,否则第二个 lpSum
不是必需的。您基本上是说从 i
到 j
安排的容器数量需要足以容纳从 i
到 j
安排的所有产品;所以我想你想要以下内容:
prob += lpSum([x[i][j][k] * container_cap[k] for k in product]) <= z[i][j]