gny*_*his 5 linear-programming
我正在尝试做一些逻辑应该可行的事情.但是,我不确定如何在线性编程领域内做到这一点.我使用的是ZMPL/SCIP,但这对大多数人来说应该是可读的.
set I := {1,2,3,4,5};
param u[I] := <1> 10, <2> 20, <3> 30, <4> 40, <5> 50;
var a;
var b;
subto bval:
b == 2;
subto works:
a == u[2];
#subto does_not_work:
# a == u[b];
Run Code Online (Sandbox Code Playgroud)
我试图确保变量a等于索引b中的值u.因此,例如,我确保b == 2然后我尝试设置约束a == u[b],但这不起作用.它抱怨我试图用变量索引.a == u[2]然而,我能够做到,这a等于20.
有没有办法轻松访问u变量指定的索引?感谢您的帮助/指导.
编辑:我认为共识是不可能的,因为它不再成为LP.在这种情况下,任何人都可以想到另一种方式来写这个,以便,根据价值b,我可以从集合中获得一个相关的值u?这必须避免直接索引它.
解决方案:根据Ram的反应,我能够尝试一下,发现它绝对是一个可行的线性解决方案.谢谢,拉姆!以下是ZMPL中的示例解决方案代码:
set I := {1,2,3,4,5};
param u[I] := <1> 10, <2> 20, <3> 30, <4> 40, <5> 50;
var a;
var b;
var y[I] binary;
subto bval:
b == 4;
subto only_one:
sum <i> in I : y[i] == 1;
subto trick:
b == (sum <i> in I : y[i] * i);
subto aval:
(sum <i> in I : u[i]*y[i]) == a;
Run Code Online (Sandbox Code Playgroud)
是的,您可以通过引入一些额外的 0/1 变量(指示变量)来重写和线性化您的约束。这些技巧在整数规划中并不罕见。
英语的限制
b可以采用 1 到 5 之间的值。b = {1..5}
根据 b 的值,变量a应该变成u[b]
指示变量
让我们引入 5 个Y变量 - Y1..Y5(一个对应 b 的每个可能值)
在任何给定时间,只有其中之一是正确的。
Y1 + Y2 + Y3 + Y4 + Y5 = 1
All Y's are binary {0,1}
Run Code Online (Sandbox Code Playgroud)
这就是窍门。我们引入一个线性约束来确保仅当 b 为该值时,相应的 Y 变量才会取值 1。
b - 1xY1 - 2xY2 - 3xY3 - 4xY4 - 5xY5 = 0
Run Code Online (Sandbox Code Playgroud)
(例如,如果 b 为 3,则上述约束将强制 Y3 为 1。)
现在,我们想要a取值 u[b]。
a = u[1]xY1 + u[2]xY2 + u[3]xY3 + u[4]xY4 + u[5]xY5
Run Code Online (Sandbox Code Playgroud)
由于 u[1] ...u[5] 是预先已知的常数,因此上面的约束也是线性的。
这是关于整数编程中此类 IF-THEN 条件的参考资料。其中许多技巧都涉及 Big-M,尽管在本例中我们不需要它。
希望能帮助您前进。