【发布时间】:2019-04-28 12:31:17
【问题描述】:
我想在 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 不允许将变量用作索引。那么,如何定义成本函数呢?有什么建议可以解决吗?
提前致谢
【问题讨论】:
-
“CPLEX 不允许使用变量作为索引”。这似乎不太可能。无论您是写
someCall(foo[42])还是n = 42; someCall(foo[n]),someCall 方法都是从数组中查看单个值,而不是某个索引数组表达式。 “这是错误的”以什么方式表现出来? Java 术语中的M是什么? -
@another-dave 很有可能。关键是,这个内部对象是一个变量而不是常量。目前尚未评估/未知。并且相应地转换问题通常会导致非凸性
-
最短路径可以通过多项式大小的 lp 计算。谷歌一些参考。不需要整数编程。不仅会导致您的方法潜在地大幅增加求解时间,而且像这样制定这个本身需要丑陋的指标变量和 co。我强烈建议阅读有关标准方法的信息。你的看起来更像是约束编程而不是数学选择。
标签: cplex