xpress04.gms : XPRESS 테스트 스위트 - 솔루션 열거자 예

설명

XPRESS 솔루션 열거자를 테스트하세요. 이 경우에는 다음을 반환해야 합니다.
모든 MIP 솔루션 세트는 다음과 같이 계산됩니다.
자르고 반복해서 해결합니다.

기고자: Steve Dirkse, 2012년 1월

소형 모델 유형 :MIP


카테고리 : 슬롯 머신 테스트 라이브러리


메인 파일 : xpress04.gms

$title XPRESS 테스트 모음 - 솔루션 열거자 예(XPRESS04,SEQ=550)

$onText
XPRESS 솔루션 열거자를 테스트합니다. 이 경우에는 다음을 반환해야 합니다.
모든 MIP 솔루션 세트는 다음과 같이 계산됩니다.
자르고 반복해서 해결합니다.

기고자: Steve Dirkse, 2012년 1월
$offText

$set GAMSlo %슬롯 머신lo%
$if %슬롯 머신ide% == 1 $set GAMSlo 2

$set 플래그 lo=%GAMSlo%
$if %DEMOSIZE% == 1 $set 플래그 --DEMOSIZE=1 %FLAGS%

$존재하지 않는 경우 mip05.gms $call testlib -q mip05

* 먼저 슬롯 머신를 사용하여 모든 솔루션을 생성하고 루프에서 잘라내고 해결합니다.
$call 게임 mip05.gms mip=xpress %FLAGS%
$if errorlevel 1 $abort 잘라내기가 포함된 솔루션 생성에 실패했습니다.
* queensSolsCuts.gdx에 솔루션 정보가 있어야 합니다.

* 다음으로 XPRESS MIP 솔루션 열거자를 사용하여 모든 솔루션을 생성합니다.
$onEcho > xpress.322
solnpool 퀸즈SolsPool.gdx
solnpoolDupPolicy 0
solnpoolPop 2
* 대칭 감소 비활성화
대칭 0

* XPRESS 26.01에서는 92개의 솔루션을 모두 얻으려면 조금 더 많은 작업이 필요합니다.
* 2014년 5월 FICO의 Michael Perregaard가 보낸 이메일에 설명된 대로:
* 옵티마이저가 데이터를 삭제하는 것을 방지하기 위해 설정해야 하는 컨트롤
* 대칭 또는 지배 솔루션은 다음과 같습니다.
* PRESOLVEOPS에서 다음 비트를 지웁니다.
* 0 – 싱글톤 컬럼 제거
* 3 – 이중 감소
* 5 – 중복된 열 축소
* 따라서 PRESOLVEOPS = 438로 설정합니다.
사전 해결 연산 438

* PRESOLVEOPS에서 다음 비트를 지웁니다.
* 비트 4를 지워서 노드 간 사전 해결의 이중 감소를 비활성화합니다.
* MIPPRESOLVE의. 즉, MIPPRESOLVE=-17로 설정합니다.
밉프리졸브 -17

* TREEPRESOLVE = 0으로 설정하여 트리 내 사전 해결을 비활성화합니다.
트리프리졸브 0
$offEcho
$call 슬롯 머신 mip05.gms mip=xpress optfile=322 --SKIPCUTS=1 %FLAGS%
$if errorlevel 1 $abort XPRESS 열거자를 사용하여 솔루션 생성에 실패했습니다.

* 마지막으로 GDX 파일을 읽고 내용이 동일한지 확인합니다.
세트
  '절단으로 생성된 솔루션'을 잘라냅니다.
  풀 '열거자 및 solnpool에 의해 생성된 솔루션'
  p2(풀)
  나는 '체스판의 크기'
  ;
별칭(i,j);
별칭(풀,ppool);
매개변수
  발견(잘라내기)
  solsCuts(cuts,i,j) '절단으로 생성된 솔루션'
  sol(i,j) '열거자 및 solnpool에 의해 생성된 솔루션'
  TMP(i,j)
  ;
스칼라
  nCuts '컷으로 생성된 솔루션 수'
  nPool '열거자 및 solnpool을 사용하여 생성된 솔루션 수'
  완료
  ;
이진 변수 x(i,j) '정사각형은 여왕이 차지합니다';

$gdxIn queensSolsCuts
$로드 컷=n i solsCuts=sols
$gdxIn
$gdxIn queensSolsPool
$로드 풀=인덱스
$gdxIn
nCuts = 카드(컷);
nPool = 카드(풀);
abort$[nPool <> nCuts] '다른 수의 솔루션', nPool, nCuts;

파일 fpool;
발견(잘라내기) = 0;
x.l(i,j) = 0;
루프풀,
  p2(ppool) = 아니요;  p2(풀) = 예;
  put_utility fpool 'gdxin' / pool.te(pool);
  실행_로드포인트;
  sol(i,j) = round(x.l(i,j));
  디스플레이 솔;
* 이제 컷 세트의 솔루션을 반복하여 일치하는 항목을 찾습니다.
  완료 = 0;
  루프컷$[완료되지 않음],
    tmp(i,j) = sol(i,j) - solsCuts(cuts,i,j);
    (0 eq 카드(tmp))인 경우,
* 우리는 경기가 있어요
      abort$[found(cuts)] 'solnpool 솔루션은 이미 일치하는 컷 솔루션과 일치합니다', p2, sol;
      발견(잘라내기) = 1;
      완료 = 1;
    ;
  ;
  abort$[완료되지 않음] 'solsCuts에서 solnpool 솔루션을 찾을 수 없습니다.', p2, sol;
;
abort$[card(found) <> nCuts] '풀에서 찾을 수 없는 컷의 솔루션',found;

* 디버깅을 위해 정리를 건너뛸 수 있습니다. o/w 이 테스트는 엉망이 됩니다.
* $goTo 모두 완료

'rm -f queensSols*.gdx soln_queens_p*.gdx'를 실행합니다.

$label alldone