变量作为索引? CPLEX

时间:2019-04-28 12:31:18

标签: cplex

我想在Java中使用CPLEX查找最短路径。为此,我有一个包含所有过渡成本的矩阵,如下所示:

M= c(1->1) c(1->2) c(1->3) c(1->4)
   c(2->1) c(2->2) c(2->3) c(2->4)
   c(3->1) c(3->2) c(3->3) c(3->4)
   c(4->1) c(4->2) c(4->3) c(4->4)

我已经定义了一个向量(变量)来计算路径。在约束内,我使X(0)= 1和X(4)= 4告诉我要从位置1开始并最终到达位置4,如下所示:

int[][] M = {{0, 2, 3, 40},
             {2, 0, 3, 2},
             {1, 5, 0, 2},
             {2, 4, 5, 0}};

IloCplex cplex = new IloCplex();

// Variable
IloNumVar[] routingVar = new IloNumVar[4];

for(int i = 0; i < 4; i++)
  routingVar[i] = cplex.intVar(1, 4);

// Objective
IloLinearNumExpr objective = cplex.linearNumExpr();

/* THIS IS WRONG -- Start*/

for(int i = 1; i < 4; i++)
  objective.addTerm(routingVar[i], M[routingVar[i-1]][routingVar[i]]);

/* THIS IS WRONG -- End*/

cplex.addMinimize(objective);

// Constraints
cplex.addEq(routingVar[0], 1);
cplex.addEq(routingVar[3], 4);

cplex.solve();

根据我的发现,CPLEX不允许将变量用作索引。那么,如何定义成本函数?有什么建议可以解决吗?

预先感谢

1 个答案:

答案 0 :(得分:0)

Sascha是正确的,有比混合整数编程更好的算法可以解决最短路径问题...

但是,如果您真的想使用CPLEX,则需要使用indicator constraints或big-M公式。