2013-04-26 4 views
2

C++에서 IBM ILOG CPLEX 솔버를 사용하여 정수 선형 프로그램 (ILP)을 풀려고합니다. 솔버는 문제가 실행 불가능하며 위반 된 제약 조건의 인덱스를 지적합니다. 제 질문은 C++에서이 제약 조건을 식별하고 분석하는 것과 관련이 있습니다.CPLEX C++ 인터페이스 : 위반 된 제약 조건의 색인을 얻는 방법?

제약 조건을 분석하는 수동 방법은 함수 extractModel을 사용하여 문제를 텍스트 파일로 내 보낸 다음이 파일에서 위반 된 제약 조건을 조회하는 것입니다.

가급적이면 C++에서 위반 된 제약 조건의 인덱스를 얻고 가능한 한이 충돌에 대한 많은 정보를 얻고 싶습니다.

현재 충돌 해결사를 사용하고 있지만 유용한 정보가 없습니다. 특히, 내가 모델에 추가 한 모든 제약 중 IloRangeArray을 유지하고이 배열에 refineConflict을 호출 한 다음 함수 getConflict을 사용하여 위반 된 제약 조건을 쿼리합니다. 결과적으로 내가 추가 한 모든 제약 조건이 위반되고 제약 조건이 위반되는 것으로 입증되지 않을 수 있습니다.

오류 메시지에보고 된 한 가지 제약 조건의 인덱스에 액세스 할 수있는 방법은 문제가 실행 불가능하다는 것입니까?

또한 충돌 인식기를 잘못 사용하고 있습니까? 예 : 내가 별도의 배열에서 모델에 추가하는 제약 조건의 사본을 만들 때 잘못된 것을하고 있습니까? (Cplex의 특정 클래스의 복사 생성자 및 대입 연산자는 이해할 수없는 비표준 동작을하는 것 같습니다.)

도움이 되었습니까?

+0

나는 그것이 오래 전에 알고 있지만 위반 된 제약 조건 목록을 얻는 방법을 찾았습니까? 나는 같은 문제에 붙어있다. 감사! –

답변

1

충돌 해결 도구 API를 사용하려고하지 않았습니다. 아마 그것을 조사해야하지만 ... 독립형 대화식 CPLEX에서 갈등 정제기를 많이 사용합니다. 자신의 코드에 제약 조건의 복사본을 보관하는 문제는 알지 못합니다. 이전에 CPLEX & C++의 콘서트에서 해 보았습니다. 갈등 구체화자가하는 일에 대한 개념상의 오해 일 수 있습니다 ...

식별 할 수없는 단일 불가능한 구속 조건을 갖는 것은 매우 드뭅니다. 함께 만족할 수없는 일련의 제약 조건들이 있지만, 해당 제약 조건 집합 중 하나라도 제거되면 나머지는 실행 가능하다는 것이 훨씬 더 일반적입니다. 이것은 보통 "기약 할 수없는 실행 불가능한 세트"라고 불린다.

a >= b + 1 
b >= c + 1 
c >= a + 1 

분명이 세 가지 제약 조건을 동시에 만족시킬 수는 없지만, 멀리 하나를 가지고, 다른 두 사람은 다음 OK입니다

세 가지 제약 조건의 예를 들어 생각해. 일부 제약 조건을 잘못 결정하는 것은 매우 어려울 수 있으며 실제로 문제와 모델에 대한 더 깊은 이해에 달려 있습니다.

어쨌든 모델을 LP, MPS 또는 SAV 형식 파일로 내보내고 독립 실행 형 CPLEX 최적화 프로그램으로 읽어보십시오. 그런 다음이를 최적화하십시오 -보고 된 실행 불가능 성으로 실패해야합니다. MPS 파일이 문제의 전체 정밀도를 유지에서 더 나은 다른 해법으로 시도 할 아마 더 이식,하지만

read fred.lp 
optimize 
conflict 
display conflict all 

내가 찾을 : 그런 다음 표시 한 후 계산 (돌이킬 수없는) 불가능 세트를 충돌 정제를 실행하고 LP 파일은 사람이 읽을 수있는 파일입니다. SAV 파일 형식은 CPLEX가 메모리에 가지고있는 것 중 가장 정확한 사본이지만 CPLEX에 매우 불투명합니다.문제가 명확하게 실행 불가능한 경우 LP 형식은 아마도 사용하기가 더 좋을 수 있지만, 문제가 경계선 상 불가능한 경우 LP 파일과 다른 동작을 일으킬 수 있습니다. 모든 변수 광고 제약 조건을 너무 많이 지정하면 큰 도움이됩니다. 디버깅 빌드에서 이름을 지정하거나 플래그를 추가하여 추가 이름 지정을 수행할지 여부를 제어 할 수 있습니다.