PuLP中的字典乘法-约束实现

时间:2018-12-23 14:30:31

标签: python pulp

我正在创建一个更大的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'类型的非整数”的错误。

有什么建议吗?

1 个答案:

答案 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。您基本上是说,从ij计划的容器数量必须足以容纳从ij计划的所有产品;所以我认为您需要以下条件:

prob += lpSum([x[i][j][k] * container_cap[k] for k in product]) <= z[i][j]