gpt4 book ai didi

java - 使用java cplex解决TSP,getValues of variables报错

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:55:45 26 4
gpt4 key购买 nike

我使用 cplex 来解决旅行商问题 (TSP)。如果 x[i][j]=1,则路径从城市 i 到城市 j,否则这些城市之间没有路径。对应矩阵:

IloNumVar[][] x = new IloNumVar[n][];
for(int i = 0; i < n; i++){
x[i] = cplex.boolVarArray(n);
}

cplex 完成求解时,我想像这样获取 x 的值:

if(cplex.solve()){
double[][] var = new double[n][n];
for(int i = 0; i<x.length; i++){
for(int j = 0 ; j < x[i].length; j ++){
var[i][j] = cplex.getValue(x[i][j]);
if(var[i][j] ==1){
System.out.print(i + " "+ j);
}
}
}
}

但是它给出了一个错误。我将感谢任何可以提供建议的人。错误在:

 var[i][j] = cplex.getValue(x[i][j]);

解释是:

Exception in thread "main"  ilog.cplex.IloCplex$UnknownObjectException: CPLEX Error: object is unknown to IloCplex
at ilog.cplex.IloCplex.getValue(IloCplex.java:6495)

完整代码如下:

import java.io.IOException;
import ilog.concert.*;
import ilog.cplex.IloCplex;

public class TSP {
public static void solveMe(int n) throws IloException, IOException{

//random data
double[] xPos = new double[n];
double[] yPos = new double[n];
for (int i = 0; i < n; i ++){
xPos[i] = Math.random()*100;
yPos[i] = Math.random()*100;
}

double[][] c = new double[n][n];
for (int i = 0 ; i < n; i++){
for (int j = 0 ; j < n; j++)
c[i][j] = Math.sqrt(Math.pow(xPos[i]-xPos[j], 2)+ Math.pow(yPos[i]-yPos[j],2));
}

//model

IloCplex cplex = new IloCplex();

//variables
IloNumVar[][] x = new IloNumVar[n][];

for(int i = 0; i < n; i++){
x[i] = cplex.boolVarArray(n);
}

IloNumVar[] u = cplex.numVarArray(n, 0, Double.MAX_VALUE);

//Objective
IloLinearNumExpr obj = cplex.linearNumExpr();
for(int i =0 ; i <n ; i++){
for (int j = 0; j< n ;j++){
if(j != i){
obj.addTerm(c[i][j], x[i][j]);
}
}
}
cplex.addMinimize(obj);

//constraints
for(int j = 0; j < n; j++){
IloLinearNumExpr expr = cplex.linearNumExpr();
for(int i = 0; i< n ; i++){
if(i!=j){
expr.addTerm(1.0, x[i][j]);
}
}
cplex.addEq(expr, 1.0);
}

for(int i = 0; i < n; i++){
IloLinearNumExpr expr = cplex.linearNumExpr();
for(int j = 0; j< n ; j++){
if(j!=i){
expr.addTerm(1.0, x[i][j]);
}
}
cplex.addEq(expr, 1.0);
}


for(int i = 1; i < n; i++){
for(int j = 1; j < n; j++){
if(i != j){
IloLinearNumExpr expr = cplex.linearNumExpr();
expr.addTerm(1.0, u[i]);
expr.addTerm(-1.0, u[j]);
expr.addTerm(n-1, x[i][j]);
cplex.addLe(expr, n-2);
}
}
}

//solve mode
if(cplex.solve()){
System.out.println();
System.out.println("Solution status = "+ cplex.getStatus());
System.out.println();
System.out.println("cost = " + cplex.getObjValue());
for(int i = 0; i<x.length; i++){
for(int j = 0 ; j < x[i].length; j ++){
System.out.print(cplex.getValue(x[i][j]));
}
}
}

//end
cplex.end();
}
}

最佳答案

查看this page在 IBM 知识中心,getValue() 的参数必须是用于构建您正在求解的模型的参数,如示例 here 中所示。 .由于 varn x n,您可能应该将 x 初始化为 IloNumVar[][] x = new IloNumVar[n][n] ;。在调用 solve() 之前的某个时刻,x每个 元素都应该添加到您的模型中。

在您的设置中,x 的对角元素永远不会被模型引用。您会注意到所有设置循环都有一个条件 if(i != j)。要解决您的问题,请将 else 子句添加到至少一个循环中,或者如果那没有意义(我怀疑是这样),请将您的打印输出与输入保持一致:

for(int i = 0; i<x.length; i++) {
for(int j = 0 ; j < x[i].length; j ++) {
if(i != j)
System.out.print(cplex.getValue(x[i][j]));
else
System.out.print("-");
}
}

关于java - 使用java cplex解决TSP,getValues of variables报错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35062388/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com