问题描述
我有一个关于在预处理中消除一些无效的决策变量组合的问题。
我有一个用[商品] [弧]索引的二维决策变量X。请参见下面的代码。索引“商品”基于元组“数据”。索引“弧”基于元组“ Arc”元组“ Data”和“ Arc”均基于元组“ TimeNode”。
我不希望该程序迭代所有X组合。我想通过考虑以下条件来删除预处理中的某些决策变量:比较Data元组中的Origin时间和Arc元组中的FromNode时间,如果“ Origin.time> FromNode.time”,X等于0,因此从迭代中消除,不被考虑。因此,问题的大小将减小,并节省了一些内存。我在下面用执行做了一些示例代码。例如,如果我有{Data}商品= { > ...},则1是id,-以1作为起始节点,3是a开始时间。我不需要在开始时间3之前考虑所有X的问题。
但是,由于X是决策变量,因此执行无效。我该怎么办?将条件表述为约束?谢谢。我会提出任何建议。
tuple TimeNode {
int node;
int time;}
{TimeNode} tnodes = { <n,t> | n in Nodes,t in Time };
tuple Data{
int id;
TimeNode Origin;
TimeNode Destination; }
{Data} commodities= {<1 <1 3><2 8>>,<2 <2 5><3 10>>};
tuple Arc {
TimeNode FromNode
TimeNode ToNode; }
{Arc} arcs={<<i,s>,<j,e>> | <i,j> in st_arcs,s in Time,e in Time };
dvar float+ x[commodities][arcs];
execute {
for(var c in commodities){
for(var a in arcs){
if(c.Origin.time>a.FromNode.time)
x[c][a]=0;
}
}
}
“错误:无法在“ x#0#0”中分配决策变量。”
解决方法
您可以将其写在要屏蔽的主题中
subject to
{
forall( c in commodities,a in arcs:c.Origin.time>a.FromNode.time) x[c][a]==0;
}
例如
{int} s={1,2};
dvar int x[s] in 0..10;
maximize sum(i in s) x[i];
subject to
{
forall(i in s:i<=1) x[i]==0;
}
工作正常
并且优于
{int} s={1,2};
dvar int x[s] in 0..10;
execute
{
for(var i in s) if (i<=1) x[i].UB=0;
}
maximize sum(i in s) x[i];
subject to
{
//forall(i in s:i<=1) x[i]==0;
}
看起来像你试图写的东西
但是最好的方法通常是建立一个新集合,然后为有意义的子集设置决策变量:
{int} s={1,2};
{int} s2={i | i in s :i>1};
dvar int x[s2] in 0..10;
maximize sum(i in s2) x[i];
subject to
{
}