【问题标题】:How to write constraints to check whether a variable is bounded between two values如何编写约束来检查变量是否在两个值之间有界
【发布时间】:2018-12-14 10:07:06
【问题描述】:

有谁知道什么是指示模型变量是否在某些值之间有界的好方法?例如,当 0

其中一个用例是计算与重量相关的运费,例如如果货物重量小于 200 磅,则成本为 $z/lb;如果货物重量超过 200 磅且低于 300 磅,则成本为 y/lb。

最小化 W1*z + W2*y

重量 = W1 + W2

0

200*X2

X1+ X2 = 1

X1、X2 二进制

重量,W1,W2 >= 0

以上是我针对这种情况提出的表述。但是,现在我有超过 200 个值要检查,所以这个公式似乎不够有效。我想知道是否有更好的方法来对此进行建模?

【问题讨论】:

  • 这个公式没有任何问题:它的性能可能比您想象的要好(前提是您使用功能强大的 MIP 求解器)。

标签: linear-programming pyomo integer-programming


【解决方案1】:

这个问题也可以建模为广义析取程序 (GDP)。它更冗长,但更具描述性。

from pyomo.environ import *
from pyomo.gdp import *
m = ConcreteModel()
m.total_weight_cost = Var(domain=NonNegativeReals)
m.weight = Var(domain=NonNegativeReals)
m.weight_buckets = RangeSet(2)
m.weight_bucket_lb = Param(m.weight_buckets, initialize={1: 0, 2: 200})
m.weight_bucket_ub = Param(m.weight_buckets, initialize={1: 200, 2: 300})
m.weight_bucket_cost = Param(m.weight_buckets, initialize={1: z, 2: y})
m.weight_bucket_disjunction = Disjunction(expr=[
    [m.total_weight_cost == m.weight_bucket_cost[bucket] * m.weight,
     m.weight_bucket_lb[bucket] <= m.weight,
     m.weight <= m.weight_bucket_ub[bucket]
    for bucket in m.weight_buckets]
])
TransformationFactory('gdp.bigm').apply_to(m)
SolverFactory('gurobi').solve(m, tee=True)
m.display()

【讨论】:

    猜你喜欢
    • 2022-03-30
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多