我正在尝试做一些在逻辑上应该可以做的事情。但是,我不确定如何在线性规划领域做到这一点。我正在使用 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];
我试图确保变量a
等于b
. u
因此,例如,我确保b == 2
然后尝试设置约束 that 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;