CPLEX OPL:强制一组决策变量相等
CPLEX OPL: Force a set of decision variables to be equal
强制一组决策变量相等的任何更聪明的方法?
(如果不能随意使用解决方案)
声明
给定以下集合:
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">,
};
还有一个决策变量x[ID]
在 OPL 中声明为
dvar int+ x[ID]
问题
如果 ID1 对所有 ID2 都相等,则决策变量 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];
第一个改进是使用 ordered 除以 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)>];
}
`
强制一组决策变量相等的任何更聪明的方法?
(如果不能随意使用解决方案)
声明
给定以下集合:
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">,
};
还有一个决策变量x[ID] 在 OPL 中声明为
dvar int+ x[ID]
问题
如果 ID1 对所有 ID2 都相等,则决策变量 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];
第一个改进是使用 ordered 除以 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)>];
}
`