【问题标题】:Dictionary multiplication in PuLP - constraint implementationPuLP中的字典乘法 - 约束实现
【发布时间】:2018-12-23 14:30:30
【问题描述】:

我正在创建一个更大的 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]])

但是,我得到一个“不能将序列乘以'list' 类型的非整数”-错误。

有什么建议吗?

【问题讨论】:

    标签: python pulp


    【解决方案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]])
    

    在这里,您获取项目列表的总和,列表product 中的每个项目k 一个项目@ 您可能已经定义了,然后说该列表需要小于另一个值.

    另外,除非我误解了您的模型,否则不需要第二个 lpSum。您基本上是说从ij 安排的容器数量需要足以容纳从ij 安排的所有产品;所以我认为你想要以下内容:

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

    【讨论】:

    • 非常感谢。现在像魅力一样工作
    • 别担心!如果有帮助,习惯上将答案标记为正确(勾号)和赞成票(箭头)。
    猜你喜欢
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2022-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多