【问题标题】:PuLP Python - How to linearize an inequality involving a variablePuLP Python - 如何线性化涉及变量的不等式
【发布时间】:2021-02-19 16:23:08
【问题描述】:

我正在研究应付铜问题,其目标函数是最大化一段时间内应付铜的总和,T。

是否可以制定一个约束来动态地比较一个变量与两个常量之间的关系:

lower_bound, operator_1 (>, >=), variable, operator_2(<, <=) up_bound

问题描述

应付吨的总量,即客户将支付的金额取决于销售材料的铜含量。

  1. 根据以下示例数据,每个客户都有许多以铜规范可操作范围表示的应付条款:

客户数据

import io
import pandas as pd

customer_payables = """customer, tier, specvalue_1, specoperator_1, specvalue_2, \
specoperator_2, coeff
    'abc', 1, 0, '>=', 20, '<=', 96.0
    'abc', 2, 20, '>', 24, '<=', 96.5 
    'abc', 3, 24, '>', 100, '<=', 96.65
    'def', 1, 0, '>=', 20, '<=', 96.0
    'def', 2, 20, '>=', 22, '<=', 96.66
    'def', 3, 22, '>=', 100', '<=', 97.0
    """

_cust_data = io.StringIO(customer_payables)
cust_df = pd.read_csv(_cust_data, sep=",")
cust_df = cust_df.set_index('customer')
cust_df
  1. 我有一个可用材料的数据框,以吨为单位,在两个有两个库存的仓库中具有特定的铜含量。请注意,此材料的质量会随着时间而变化:

##库存数据

stockpile_data_dict = {
    'Warehouse 1':{
        'Stockpile 1': {'cu': 27}, 
        'Stockpile 2': {'cu': 18}
        },
        'Warehouse 2': {
            'Stockpile 1':{'cu': 22}, 
            'Stockpile 2': {'cu': 16}}}
  
stockpile_df = pd.concat({k: pd.DataFrame(v).T for k, v in stockpile_data_dict.items()}, axis=0) 
stockpile_df

问题 我创建了一个变量来表示每个仓库的铜浓度,即 stockpile。这被保留为一个变量,因为目的是随着时间的推移对库存进行建模,允许模型选择何时销售材料以最大化应付账款:

cu_spec_of_sale_material = pulp.LpVariable.dicts(
    'Copper spec of sale material',
    ((warehouse, stockpile)
      for warehouse, stockpile in stockpile_df.index),
      cat='Continuous')

如何创建一个线性约束,以返回与此变量的铜浓度 VALUE 相关的正确应付系数?

在伪代码术语中,它评估如下内容:

for customer, effective_tier in effective_payable_coefficient:
  if customer_lower_bound_val < cu_spec_sales_material[warehouse, stockpile] < customer_up_bound_val:
    PULP += effective_payable_coefficient[customer, effective_tier] == 1

我不经常使用 Pulp,所以请多多包涵。

感谢所有帮助,谢谢。

【问题讨论】:

  • 您能否对您的问题进行清晰简明的描述?如果线性不是问题,您将如何制定约束?
  • 我的问题是——考虑到问题的性质,我不确定在这里采取的方法。我有一个整数变量,表示我需要根据应付条款的数据框评估材料的 cu 规格。这可能吗?谢谢。

标签: python optimization linear-programming pulp mixed-integer-programming


【解决方案1】:

我认为您正在寻找暗示的线性公式:

a < x < b => y = 1

其中 a,b 是常数,x 是连续变量,y 是二进制变量。

我们可以这样写:

 x ≤ a + M1 ⋅ δ + M1 ⋅ y
 x ≥ b - M2 ⋅ (1-δ) - M2 ⋅ y
 δ,y ∈ {0,1}
 x ∈ [L,U]
 M1 = U-a
 M2 = b-L

δ 是另一个二进制变量,L,Ux 的下限/上限,M1,M2 是常量。

直觉:这些约束实现了含义:

 y = 0 =>  x ≤ a or x ≥ b

这意味着如果a &lt; x &lt; b 我们必须有y=1

要获得这些限制,最好远离计算机并使用老式的纸笔。

【讨论】:

  • 这看起来正是我想要的,非常感谢。请问有没有可能在问题的内容中显示这些可能代表什么?例如,我可以看到,x 代表铜浓度,ab 代表客户支付的下限/上限?谢谢
  • a &lt; x &lt; b =&gt; y = 1 只是简单的if customer_lower_bound_val &lt; cu_spec_sales_material[warehouse, stockpile] &lt; customer_up_bound_val: PULP += effective_payable_coefficient[customer, effective_tier] == 1
猜你喜欢
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 2020-05-25
  • 2020-06-25
  • 1970-01-01
  • 2022-10-08
相关资源
最近更新 更多