【问题标题】:Set conditional constraint, Pulp设置条件约束,纸浆
【发布时间】:2020-03-20 18:33:43
【问题描述】:

第一次使用纸浆,我正在尝试对我正在处理的生产问题设置条件约束。不幸的是,我在文档中也找不到有关如何执行此操作的任何示例。

目标函数是通过根据每个产品的预测价格减去成本来告知工厂每月生产哪种产品来最大化收入(当然这里省略了许多其他约束,否则会简单得多)。

对于以下数据,我需要设置以下约束:

  1. 尽管有能力生产多种产品,但工厂每个月只能生产一种产品。

这限制了工厂在一个月内只生产一种产品。我对纸浆很陌生,但尽管查阅了文档和 S.O.我找不到示例实现。

生产数据:

到目前为止我的代码

# omitted data etl logic - it is formatted as per the above images

# Get production info
plants = LpVariable.dicts('plants',
    ((month, plant, product) for month, plant, product in wp_df.index if month >= 4),
    lowBound = 0,
    cat='Integer')

# Get forecast price info by product
forecast_prices =  LpVariable.dicts('price_by_prod',
    ((month, contract) for month, contract in fcst_diffs.index if month >= 4),
    lowBound = 0,
    cat='Integer') 

# Prod costs for each month, plant.
costs = LpVariable.dicts(
    'prod costs',
    ((month, plant) for month, plant in prod_costs_df.index),
    lowBound=0,
    cat='Integer')

# Define problem
model = LpProblem('Revenue Maximising Production Optimisation',
                  LpMaximize)

# Define objective function
model += lpSum(
    [plants[m,w,g] * wp_df.loc[(m,w,g), 'production_output'] for m, w, g in wp_df.index]
    + [costs[m, w] * costs_df.loc[(m,w), 'prod_costs_usd'] for m, w in prod_costs_df.index]
)

我现在省略约束,因为我有很多要设置的。

感谢您的帮助,谢谢。

【问题讨论】:

    标签: python linear-programming pulp


    【解决方案1】:

    引入一组由{植物,产品,月份}索引的二进制变量,它们确定植物i在月份k期间是否被用于制造产品j。如果为真,变量将为1,否则为0

    然后您需要添加约束,以便在 k 月份在工厂 i 中生产的产品 j数量是有限的。通常,这可以通过将 amount 变量约束为 <= b*C 的约束来完成,其中 b 是二进制变量,C 是该工厂生产该产品的能力。

    最后,您需要限制每个工厂每个月只生产一种产品。对于每个月和每个工厂,所有产品中这些二进制变量的总和被限制为<= 0

    祝你好运!

    【讨论】:

    • 此优化的目的是根据约束(仅限 1 个产品)和预测产品溢价做出产品选择,即根据预测价格做出决定?你知道这是否可能吗?谢谢!
    • 是的,这绝对是可能的。我上面的建议是引入二进制变量。这些变量的值将被选为优化的一部分。合并预测只是将预测包含在目标函数中的一种情况 - 根据您的预测类型,您可能还需要决定如何处理预测的不确定性。
    • 谢谢 Kabdulla - 您能否提供一个代码示例?例如,如何设置变量dicts和constraints?
    • 如果您修改您的问题以包含 minimal reproducible example 即生成最小玩具示例的代码,那么我很乐意。
    • @kabulla 我稍微改变了这里的问题并在此处发布:stackoverflow.com/questions/61349492/…,您愿意提供帮助吗?非常感谢您的耐心等待
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    相关资源
    最近更新 更多