CPLEX (Eclipse의 Java와 함께 사용)를 사용하여 표준 차량 라우팅 문제를 해결하고 있습니다. 처음에는 하나의 차량을 모델링 했으므로 추측 할 수있는 TSP가됩니다. 나는 2D Boolean 배열을 사용하여 차량이 i에서 j로 이동하는지 여부를 나타냅니다. 문제가 해결되고 목적 함수의 값을 받지만 2D 배열의 값을 읽을 수 없습니다. I 작성한 끝에Eclipse를 사용하여 CPLEX에서 2D 배열로부터 부울 값 추출하기
try {
IloCplex cplex = new IloCplex();
IloNumVar[][] x = new IloNumVar[n][];
for(int i=0; i<n; i++){
x[i] = cplex.boolVarArray(n);
}
: 여기서
배열을 정의하기위한 코드 가cplex.solve();
System.out.print(cplex.getValue(obj));
//decision matrix
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
System.out.print(cplex.getValue(x[i][j]) + " ");
}System.out.println();
}
cplex.end();
}
catch (IloException e) {
e.printStackTrace();
}
}
}
분명히 문제 수단 표시되는 목표치 해결되지만 다음과 같은 오류 메시지가 나타납니다.
Total (root+branch&cut) = 0.02 sec. (2.23 ticks)
223.62126087689276ilog.cplex.IloCplex$UnknownObjectException: CPLEX Error: object is unknown to IloCplex
at ilog.cplex.IloCplex.getValue(IloCplex.java:6495)
at VRP01k.main(VRP01k.java:144)
IBM ILOG CPLEX Optimization Studio Preview Edition good for 18 more days.
The CPLEX Optimizers will solve problems up to 1000 variables and 1000 constraints.
누군가가 문제를 지적 할 수 있습니까? 배열을 초기화하는 방법과 배열을 초기화하는 방법 사이에 불일치가 있습니까? 감사.
전체 모델입니다. 나는 목적지와 원점으로 저장소를 나눴다.
try {
IloCplex cplex = new IloCplex();
IloNumVar[][] x = new IloNumVar[n][];
for(int i=0; i<n; i++){
x[i] = cplex.boolVarArray(n);
}
//variable definition
IloNumVar[] w = cplex.numVarArray(n, 0, Double.MAX_VALUE); /*arrival time*/
//objective function
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);
//path continuity
for(int i=1; i<n-1; i++){
IloLinearNumExpr expr = cplex.linearNumExpr();
for(int j=1; j<n; j++){
if(j!=i){expr.addTerm(1.0, x[i][j]);};
}
cplex.addEq(expr, 1.0);
}
//origin depot
IloLinearNumExpr expr0 = cplex.linearNumExpr();
for(int j=1; j<n-1; j++){
expr0.addTerm(1.0, x[0][j]);
}cplex.addEq(expr0, 1.0);
//destination depot
IloLinearNumExpr expr1 = cplex.linearNumExpr();
for(int i=1; i<n-1; i++){
expr1.addTerm(1.0, x[i][n-1]);
}cplex.addEq(expr1, 1.0);
for(int j=1; j<n-1; j++){
IloLinearNumExpr expr2 = cplex.linearNumExpr();
for(int i=0; i<n-1; i++){
if(j!=i){
if(i!=0 && i!=n-1){
expr2.addTerm(1.0, x[i][j]);
expr2.addTerm(-1.0, x[j][i]);}
else if(i==0){expr2.addTerm(1.0, x[i][j]);}
else if(i==n-1){expr2.addTerm(-1.0, x[j][i]);}
}
}
}
//time constraints
for(int i=0; i<n; i++){
IloLinearNumExpr expr3 = cplex.linearNumExpr();
expr3.addTerm(1.0, w[i]);
cplex.addGe(expr3, a[i]);
cplex.addLe(expr3, b[i]);
}
//travel time constraints
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(j!=i){
IloLinearNumExpr expr4 = cplex.linearNumExpr();
expr4.addTerm(1.0, w[i]);
expr4.addTerm(1000, x[i][j]);
expr4.addTerm(-1.0, w[j]);
cplex.addLe(expr4, 1000-s[i]-c[i][j]);
}
}
}
cplex.solve();
System.out.print(cplex.getValue(obj));
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
System.out.print(cplex.getValue(x[i][j]) + " ");
}System.out.println();
}
cplex.end();
}
catch (IloException e) {
e.printStackTrace();
}
}
}
Eclipse는 사용중인 개발 환경이며 다양한 프로그래밍 언어를 지원합니다. 어떤 언어입니까? 질문을 편집하고 적절한 언어 태그를 설정하십시오. –
자바를 사용하고 있습니다. –
먼저 문제가 미리보기 에디션 (예 : 1000 병 또는 cst 미만)을 사용할 수있을 정도로 작다고 가정합니다. 두 번째로 콘서트 모델링 레이어는 제약 조건 또는 목표에서 참조되는 변수 만 CPLEX 자체에 넣습니다. 모델을 CPLEX에서 LP 파일로 내보내는 방법을 볼 수 있습니다. – TimChippingtonDerrick