【问题标题】:AMPL double conditions in constraints约束中的 AMPL 双重条件
【发布时间】:2014-12-14 03:03:17
【问题描述】:

我正在做一个优化项目,为此我正在使用 AMPL 和 CPLEX。 我的问题有点简单,但如果不使用一些额外的“无用”变量,我就无法做到。

所以假设我有以下代码:

set A:= a b c;
set B:= 1 2 3;
var x{A,B} binary;

现在我想在 2 个条件下处理一个约束,例如:

if x[a,1] = 1 and x[a,2] = 1 then (some constraint).

很遗憾,CPLEX 不允许我使用该语法:

s.t const: x[a,1] = 1 and x[a,2] = 1 ==> (some constraint)

它说“逻辑约束 _slogcon[1] 不是指标约束。

现在我的做法是引入一个新变量。

var dummyVar{A,A,B,B} binary;

如果 x[a,1] = 1 和 x[a,2] = 1,则此变量等于 1。

subject to condition: 2*dummyVar[a,a,1,2] <= x[a,1] + x[a,2]

我的问题在于我正在使用的大型模型。就我而言,这个 dummyVar 不仅仅是一个小集合,它包含一组集合。当 AMPL 处理代码(将其转换为由 CPLEX 读取)时,由于内存不足而崩溃。

有什么简单的方法可以写出类似的东西

s.t const: x[a,1] = 1 and x[a,2] = 1 ==> (some constraint)

不引入任何额外的变量?提前致谢。

【问题讨论】:

    标签: optimization conditional-statements mathematical-optimization cplex ampl


    【解决方案1】:

    要有效地对此进行建模,您应该考虑两件事

    1. 'some-constraint' 是线性的或二次的。
    2. 如果 x[a,1] 或 x[a,2] 为 1,则可能违反约束。

    在第 1 点,你的一些约束是形式

    l <= f(x) <= u
    

    其中 f(x) 是线性函数的二次函数,l 和 u 是约束。如果你让 f_max 和 f_min 成为函数 f(x) 在所有 x 的可行值上的上限和下限,那么你可以将条件约束写为

    l - (l - f_min) (x[a,1] + x[a,2]) <= f(x) <= u + (f_max - u)(x[a,1] + x[a,2])
    

    如果 x[a,1] 或 x[a,2] 为 1,则约束变为

    f_min <= f(x) <= f_max
    

    如果 x[a,1] 和 x[a,2] 都为 1,则更宽松。如果均为 0,则强制执行原始约束。

    【讨论】:

    • 谢谢先生,如果 x[a,b1] = 1 和 x[a,b2] = 1 我想应用的约束是 ( abs(b1-b2) >= 2 ) [换句话说,当且仅当 abs(b1-b2) >= 2] 时,我希望 x[a,b1] 和 x[a,b2] = 1],这种技术会起作用吗?另外,如何指定“l”和“u”值?再次感谢您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多