如何线性化包含变量的不等式

2024-05-13 13:21:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究一个应付铜问题,目标函数是在一段时间内使应付铜的总和最大化,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

问题 我创建了一个变量来表示每个仓库、库存的铜浓度。这是一个变量,因为其目的是随着时间的推移对库存进行建模,使模型能够选择何时出售材料,以最大限度地提高应付款:

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

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

在伪代码术语中,它的计算结果如下所示:

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

我不经常用纸浆,所以请耐心等待

感谢大家的帮助


Tags: 数据dfdata客户库存customertierpd
1条回答
网友
1楼 · 发布于 2024-05-13 13:21:30

我想你是在寻找一个线性公式来表达这个含义:

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

δ是另一个二元变量,LUx的上下限,M1M2是常量

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

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

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

要导出这些约束条件,最好远离计算机,使用老式的笔和纸

相关问题 更多 >