CPLEX OPL:强制一组决策变量相等



有什么更聪明的方法可以强制一组决策变量相等吗?

(如果不能随意使用解决方案(

声明

给定以下集合:

ID1     | ID2
------- | -------
A       | AA
B       | AA
C       | BB
C       | AA
C       | CC
D       | CC

例如,在 OPL 中初始化

//Set ID
tuple ObjectID{
string ID1;
string ID2;
}
{ObjectID} ID = {
<"A", "AA">,
<"B", "AA">,
<"C", "BB">,
<"C", "AA">,
<"C", "CC">,
<"D", "CC">,
};

以及要在 OPL中声明

dvar int+ x[ID]

问题所在

如果所有 ID2 的 ID1 相等,则决策变量x[ID]应相等。

例:

x[<"C", "BB">] == x[<"C", "AA">] == x[<"C", "CC">]

当前解决方案

具有相同ID1和不同ID2的所有dvar的成对比较。

forall(
id_1 in ID, id_2 in ID:
id_1.ID1 == id_2.ID1 &&
id_1.ID2 != id_2.ID2
)
x[id_1] == x[id_2];

第一个改进是使用有序将相等约束的数量除以 2:

forall(ordered id_1,id_2 in ID :id_1.ID1 == id_2.ID1 )
x[id_1] == x[id_2];

第二个改进可能是从 (n-1(*n/2 约束转向 (n-1( 约束

//Set ID
tuple ObjectID{
string ID1;
string ID2;
}
{ObjectID} ID = {
<"A", "AA">,
<"B", "AA">,
<"C", "BB">,
<"C", "AA">,
<"C", "CC">,
<"D", "CC">
};
dvar int+ x[ID];
{string} Id1s={i.ID1 | i in ID};
{string} Id2PerId1[id1 in Id1s]={i.ID2 | i in ID : i.ID1==id1};

subject to
{

forall(id1 in Id1s) forall(id2 in Id2PerId1[id1] diff     {last(Id2PerId1[id1])})
x[<id1,id2>] == x[<id1,next(Id2PerId1[id1],id2)>];

}

'

最新更新