Переменная как индекс? CPLEX - PullRequest
0 голосов
/ 28 апреля 2019

Я хочу найти кратчайший путь, используя CPLEX в Java. Для этого у меня есть матрица со всеми переходными затратами следующим образом:

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 голосов
/ 30 апреля 2019

Саша прав, что для решения задачи кратчайшего пути гораздо лучше подходят алгоритмы, чем смешанно-целочисленное программирование ...

Но если вы действительно хотите использовать CPLEX, вам нужно использовать индикатор ограничения или формулировки Big-M.

...