在 CPLEX 中将路径定义为一组边序列

Defining paths as a set of sequences of edges in CPLEX

我有一个道路网络图,由节点集 N={1,2,3,...} 和两对节点之间的边集组成,如 E={(1,3), (1 ,5), (2,3), (2,4).....}。我也想定义一组路径,作为一组边缘序列,这样 Links= {((1,3),(3,2),(2,4)),((1,3), (3,5)), ((2,3),(3,6),(6,5),(5,2)),...}.

下面是我的代码的初始化,作为例子:

int N={1,2,3,4,5,6}
tuple edge
{int i; 
 int j;
 }
{edge} E={<1,3>, <1,5>, <2,3>, <2,4>, <3,2>, <3,4>, <3,5>, <3,6>, <5,6>, <5,4>, <6,4>};

在这里我不知道如何继续将路径集定义为一组边序列。如果您能帮助我,我将不胜感激!提前致谢..

你可以试试集合数组:

{int} N={1,2,3,4,5,6};
tuple edge
{int i; 
 int j;
 }
{edge} E={<1,3>, <1,5>, <2,3>, <2,4>, <3,2>, <3,4>, <3,5>, <3,6>, <5,6>, <5,4>, <6,4>};

{edge} Links[E]= [{<1,3>,<3,2>,<2,4>},{<1,3>, <3,5>}];

execute
{
  writeln(Links);
}

然后如果你需要一个 dvar 布尔数组

{int} N={1,2,3,4,5,6};
tuple edge
{int i; 
 int j;
 }
{edge} E={<1,3>, <1,5>, <2,3>, <2,4>, <3,2>, <3,4>, <3,5>, <3,6>, <5,6>, <5,4>, <6,4>};

{edge} Links[E]= [{<1,3>,<3,2>,<2,4>},{<1,3>, <3,5>}];

execute
{
  writeln(Links);
}

tuple t
{
  edge e;
  int rank;
}

{t} s=union(e in E) {<e,i> | i in 1..card(Links[e])};

execute
{
  writeln(s);
}

dvar boolean x[s];

subject to
{
  
}