3

CPLEX Java를 사용하여 ILP를 구현하려고했지만 오랫동안 문제가 지속되었습니다. 여기에 ILP의 몇 가지 변수는 다음과 같습니다cplex boolVarArray 이중 값 제공

IloIntVar above = new IloIntVar[numRect][]; 
IloIntVar below = new IloIntVar[numRect][]; 
IloIntVar left = new IloIntVar[numRect][]; 
IloIntVar right = new IloIntVar[numRect][]; 

for (int i = 0; i < numRect; i++) { 
     above[i] = cplex.boolVarArray(numRect); 
     below[i] = cplex.boolVarArray(numRect); 
     left[i] = cplex.boolVarArray(numRect); 
     right[i] = cplex.boolVarArray(numRect); 
} 

numRect의 값은 프로그램 I 출력의 끝에이 값에서 1입니다 : 내가 얻을 출력 여기

for (int i = 0; i < numRect; i++) { 
      for (int j = i + 1; j < numRect; j++) { 
       System.out.println(cplex.getValue(left[i][j])); 
       System.out.println(cplex.getValue(right[i][j])); 
       System.out.println(cplex.getValue(above[i][j])); 
       System.out.println(cplex.getValue(below[i][j])); 
       System.out.println(cplex.getValue(left[i][j]) + 
            cplex.getValue(right[i][j]) + 
            cplex.getValue(above[i][j]) + 
            cplex.getValue(below[i][j])); 
      } 
     } 

된다

0.0 
0.0 
9.313225750491594E-10 
0.9999999990686774 
1.0 

왜 내가 부울 대신 이중 값을 얻는 지 이해할 수 없습니다. 어떤 도움을 주시면 감사하겠습니다. 감사.

답변

1

IloBoolVar는 단순히 0 또는 1로 제한된 IloNumVar입니다. 기본적으로 0 또는 1의 0.00001 내의 모든 항목은 정수로 간주됩니다. 매개 변수를 EpInt으로 설정하여 변경할 수 있습니다. 매개 변수를 0으로 설정할 수 있지만 성능 문제를 초대하고 있습니다. 값을 반올림하는 것이 가장 좋습니다. 사실, 부동 소수점 숫자로 작업 할 때는 항상 이와 같은 반올림 문제를 인식하고 있어야합니다.

+0

감사합니다. 그것은 큰 도움이되었습니다. – user1009285

0

사용중인 언어를 말하지 않았습니다. 어떤 이유로, 콘서트의 C++ 버전

IloCplex.GetIntValue() 

을 가지고 있으며, 당신은 (내가 다른 언어에 대해 알고하지 않습니다)에만 IloCplex.GetValue이 자바와 C# 0 또는 1

콘서트를 얻을 수 있습니다(). 값을 0 또는 1로 반올림해야합니다. 또한 값이 0 또는 1의 작은 값 내에 있는지 먼저 확인하여 실제로 LP가 아닌 MIP를 실제로 확인합니다.

+0

답장을 보내 주셔서 감사합니다. 자바를 사용하고 있습니다. 부울 변수의 값은 출력에서 ​​볼 수 있듯이 0 또는 1에 매우 가깝습니다. 내 변수 중 2 개는 선형이며 4 개는 부울입니다. 나는 이것이 0 또는 1에 매우 가깝기 때문에 내가 말한 것처럼 얻는 이중 값을 무시해야한다고 생각한다. – user1009285

+1

네! David Nehme이 대답으로 말한 것처럼 정수의 EpInt 내에있는 한 모든 것이 좋습니다. 또한 EpInt 또는 기타 공차 매개 변수로 주위를 비웃지 말아야한다는 메모를 작성합니다. – raoulcousins

+0

나는 그 매개 변수를 망치지 않기로 결정했다. 0으로 설정 했더라도, 저에게 맞지 않았습니다. 내 제약 조건 : t1 + d <= t2 + Integer.Max_value * (1-b). 여기서 b는 부울 변수이고, t1과 t2는 정수 변수이고 d는 값이 이미 정의 된 정수입니다. Integer.Max_value가 너무 크기 때문에 cplex는 b를 매우 작게 만들어 (0.9999992와 같이) 조건을 true로 만듭니다. EPInt를 0으로 설정하여 수정하려고 시도했을 때 b에 boolean 변수가 지정되었지만 다른 변수는 제약 조건이 적용되지 않았 음을 나타냅니다. 그래서 Interger.max 값을 다른 정수로 바꿨고 효과가있었습니다. – user1009285