2013-03-11 1 views
0

모든 정수 변수가 바이너리 인 CPLEX의 혼합 정수 문제에 대한 많은 솔루션을 생성하려고합니다. 문제는 대략 2500 개의 선형 제약이있는 약 1000 개의 연속 변수와 1000 개의 2 진 변수를 지표로 사용합니다.CPLEX에서 이진 변수의 다양성 극대화 최적의 제약 조건을 가진 Java API의 채우기 메소드

내 목적 함수는 표시기 변수의 최소화이며 이진 변수에 대해 선택된 값과 관련하여 서로 다른 최적의 솔루션을 많이 생성하려고합니다. 내 현재 코드로 요약 할 수있다 -

IloCplex cplexModel = new IloCplex(); 
---build the problem, set objective--- 
cplexModel.setParam(IloCplex.IntParam.SolnPoolCapacity, N); 
cplexModel.setParam(IloCplex.IntParam.PopulateLim, K*N); 
cplexModel.setParam(IloCplex.IntParam.SolnPoolReplace, 2); 
cplexModel.setParam(IloCplex.DoubleParam.SolnPoolGap, D); 
cplexModel.setParam(IloCplex.IntParam.MIPEmphasis, 0); 
cplexModel.populate(); 

N, K와 D가 원하는 솔루션의 수에 대한 단축 이름은 어디에서 해결하는 동안, 나는 기꺼이하는 계수 생성 솔루션의 수를 확장하고, 상대적인 갭은 각각 최적의 최소화로부터 받아 들일 용의가 있습니다. 또한 문제와 관련이없는 CPLEX 매개 변수를 여러 개 사용합니다.

내 문제는 솔루션의 다양성이 연속 변수를 비롯한 모든 변수에서 측정되는 반면, 필자는 이진 변수 값이 다른 솔루션에만 관심이 있다는 점입니다. 즉, 내가 얻는 결과의 대부분은 이진 변수에 대해 동일한 값을 공유하며 (이진 값에만 관심이 있으므로) 나에게는 구별 할 수 없다는 것을 의미합니다. 나의 현재 해결책은 설정함으로써 인 - T (50)는 통상적 인 후 (희망) 이진 변수 '값이 서로 다를 용액 풀 N 결과와 선택

cplexModel.setParam(IloCplex.IntParam.SolnPoolCapacity, T*N); 
cplexModel.setParam(IloCplex.IntParam.PopulateLim, T*K*N); 

.

각 솔루션 및 레퍼런스 솔루션 사이 대신, 나는 이진 변수 다양성 계산을 제한하는 방법으로 diversity filters을 확인했지만, 나는 솔루션 중 다양성 을 적용하는 방법을 볼 수 없습니다 . 그 외에, 내가 할 수있는 일에 관해서는 단서가 없다.

도움을 주시면 감사하겠습니다. 또한, 이것이 내 첫 번째 질문이기 때문에 잘못 포맷하면 사과드립니다.

답변

0

하는 데 도움이 ... 메모리에서 추측입니다 - link합니다.

솔루션 풀 다양성 대체 전략 인 SolnPoolReplace = 2는 솔루션의 다양성과 관련된 이진 변수 만 계산합니다.

따라서 여러 가지 이유로 인해 내 솔루션이 이진 변수 측면에서 다양하지 않은 것처럼 보입니다. 그럼에도 불구하고이 전략은 올바른 접근 방식입니다.

1

사과,하지만 내 배경이 옛날 일을하고 있고, 나는 보통 C#이나 C++에서 일하고 있었다. 나는이 새로운 fangled "채우는"재료를 사용하려고 시도한 적이 없지만 ... 아마해야합니다! 하지만 어쩌면 제가 과거에 한 일들이 도움이 될 수도 있습니다.

"수동으로"수행 한 방법은 반복적으로 문제를 해결하여 매번 구속 조건을 추가하여 이진 변수 중 일부를 강제로 변경하는 것입니다. 이것은 하나의 변수를 다른 변수로 강제하는 제약 조건을 추가하는 것처럼 간단 할 수 있습니다 (솔루션에서 1 인 경우 제약 조건을 추가하여 0으로 설정하고 반대의 경우도 마찬가지입니다). 또는 좀 더 영리 해지고 적어도 m 개의 변수 중 n 개가 달라야한다는 제약 조건을 추가하십시오. 이 접근법에 대한 좋은 점은 솔루션의 종류와 양을 직접 제어 할 수 있다는 것입니다.

이제 cplex 콜백 중 하나를 통해 제약 조건을 추가하여 "채우기"접근 방식 내에서 유사한 것을 얻을 수 있습니다. 나는 손으로 최근 문서가없는, 그래서 난 그냥

희망이 내가 IBM의 포럼에 필요한 답을 가지고

+0

도와 주셔서 감사합니다. 한 번에 하나씩 반복적으로 솔루션을 생성하는 것이 나의 마지막 수단입니다. 좀 더 나은 해결책이있을지라도 희망을 가지고 있습니다. 아마도 콜백을 포함하고있을 것입니다. (저는 CPLEX 문서에서 그들과 경험이 없으며 명백한 침전을 발견하지 못했습니다.) – Ariel

관련 문제