fiveleap.gms : 파이브 리퍼 무료 슬롯 게임 문제

설명

기사가 좌표가 1,2인 루트-5 길이의 이동을 하는 것처럼,
파이브리퍼(fiveleaper)는 길이 5유닛의 이동을 하는 일반화된 기사의 일종이며,
좌표가 0,5 또는 3,4입니다. 두 경우 모두 유클리드 거리
이동한 거리는 5칸입니다.

무료 슬롯 게임를 진행하려면 Fiveleaper가 보드의 모든 사각형을 한 번씩 방문해야 합니다.
합법적인 움직임만을 사용합니다. 시작 및 종료 사각형은 로 구분되어야 합니다.
합법적인 움직임과 fiveleaper는 이 마지막 움직임을 통해 무료 슬롯 게임를 종료할 수 있습니다.

NROW, NCOL(체스판 크기, 기본값 8x8) 및 MAXCUT 매개변수를 사용하여 실행합니다.
(하위 무료 슬롯 게임 제거 컷의 최대 수, 기본값은 500). 예를 들어,

게임 fiveleap --NROW=10 --NCOL=10 --MAXCUT=1000

https://dx.doi.org/10.1287/ited.4.1.78에서 도약자에 대한 자세한 내용을 확인하세요.

대형 모델 유형 :MIP


카테고리 : 무료 슬롯 게임 모델 라이브러리


메인 파일 : fiveleap.gms

$title Five Leaper 무료 슬롯 게임 문제(FIVELEAP,SEQ=268)

$onText
기사가 좌표가 1,2인 루트-5 길이의 이동을 하는 것과 마찬가지로
파이브리퍼(fiveleaper)는 길이 5유닛의 이동을 하는 일반화된 기사의 일종이며,
좌표가 0,5 또는 3,4입니다. 두 경우 모두 유클리드 거리
이동한 거리는 5칸입니다.

무료 슬롯 게임를 진행하려면 Fiveleaper가 보드의 모든 사각형을 한 번씩 방문해야 합니다.
합법적인 움직임만을 사용합니다. 시작 및 종료 사각형은 로 구분되어야 합니다.
합법적인 움직임과 fiveleaper는 이 마지막 움직임을 통해 무료 슬롯 게임를 종료할 수 있습니다.

NROW, NCOL(체스판 크기, 기본값 8x8) 및 MAXCUT 매개변수를 사용하여 실행합니다.
(하위 무료 슬롯 게임 제거 컷의 최대 수, 기본값은 500). 예를 들어,

게임 fiveleap --NROW=10 --NCOL=10 --MAXCUT=1000

도약에 대한 자세한 내용은 https://dx.doi.org/10.1287/ited.4.1.78을 참조하세요.

Chlond, M J, Daniel, RC 및 Heipcke, S, 도약하는 Fiveleapers.
https://dx.doi.org/10.1287/ited.4.1.78

Gueret, C, Prins, C 및 Sevaux, M, Xpress-MP를 통한 최적화 응용,
Susanne Heipcke가 번역하고 개정했습니다. 대시 최적화, 2002.

키워드: 혼합 정수 선형 계획법, 하위 무료 슬롯 게임 제거, 수학 게임,
          fiveleaper 무료 슬롯 게임 문제
$offText

$eolCom //
$NCOL이 설정되지 않은 경우 $set NCOL 8
$설정되지 않은 경우 NROW $set NROW 8
$설정되지 않은 경우 MAXCUT $set MAXCUT 500

세트
   r '행' / 1*%NCOL% /
   c '열' / 1*%NROW% /
   ss(r,c) '제곱 시작' / '1'.'1' /
   m(r,c,r,c) '합법적인 움직임';

별칭 (r,rp), (c,cp);

변수
   xm(r,c,r,c) '무료 슬롯 게임의 이동'
   nm(r,c) '이동 횟수'
   z '더미 목적 변수';

바이너리 변수 xm;
양의 변수 nm;

세트
   nn '서브무료 슬롯 게임 제거 컷' / 1*%MAXCUT% /
   t(nn,r,c,r,c) '하위 무료 슬롯 게임'
   n(nn) '활성 컷';

매개변수
   l(nn) '하위 무료 슬롯 게임 길이';

방정식
   obj '더미 목표'
   deffrom(r,c) '각 사각형이 서로 앞에 옵니다.'
   defto(r,c) '각 사각형 앞에는 다른 사각형이 옵니다.'
   deforder(r,c,r,c) '이동 순서'
   defsecut(nn) '하위 무료 슬롯 게임 제거 제약 조건';

obj.. z =e= sum(m, xm(m));

deffrom(r,c).. sum(m(r,c,rp,cp), xm(m)) =e= 1;

defto(rp,cp).. sum(m(r,c,rp,cp), xm(m)) =e= 1;

deforder(m(r,c,rp,cp))$(ss(rp,cp) 아님).. nm(r,c) - nm(rp,cp) =l= %NCOL%*%NROW%*(1 - xm(m)) - 1;

defsecut(n).. sum(t(n,m), xm(m)) =l= l(n)-1;

모델
   리퍼 '5리퍼의 폐쇄형 제형' / obj, deffrom, defto, deforder /
   leaperSE '서브무료 슬롯 게임 제거 공식' / obj, deffrom, defto, defsecut /;

m(r,c,rp,cp) = sqr(ord(r) - ord(rp)) + sqr(ord(c) - ord(cp)) = 25; // 가능한 이동

NoExit(r,c) "이동을 허용하지 않는 사각형"을 설정하십시오.

NoExit(r,c) = sum(m(r,c,rp,cp),1) = 0;
중단$카드(NoExit) NoExit;

매개변수
   LeaperTour(r,c) '리퍼 솔루션'
   SolRep '솔루션 타이밍 보고서';

옵션 solPrint = 꺼짐, limRow = 0, limCol = 0, t:0:0:1, leaperTour:0:1:1;

SolRep('%NCOL%x%NROW%','#Moves') = 카드(m);

nm.fx(ss) = 1; // 시작 사각형 = 1,1에서 도약 무료 슬롯 게임를 시작합니다.
leaper.resLim = 120; // 최대 120초 동안 폐쇄형 리퍼 공식을 실행합니다.
mip를 사용하여 z를 최소화하는 리퍼를 해결합니다.

if(leaper.modelStat = %modelStat.optimal% 또는
   Leaper.modelStat = %modelStat.integerSolution%, // 정수 해를 찾았나요?
   leaperTour(r,c) = nm.l(r,c);
   SolRep('Closed','Time') = leaper.resUsd;
   'Closed Formula Tour', leeperTour를 표시합니다.
그렇지 않으면
   SolRep('닫음','시간') = na;
   '폐쇄형 도약 모델에 대한 솔루션 없음'을 표시합니다.
);

세트
   (r,c)에서
   to(r,c) '무료 슬롯 게임 검색 세트'
   nl(nn) '마지막 활성 컷'
   Visited(r,c) '무료 슬롯 게임 검색에서 방문한 광장';

스칼라
   ntours '현재 솔루션의 무료 슬롯 게임 수'
   ttours '총 무료 슬롯 게임 횟수' / 0 /;

SolRep('SubTour','시간') = 0;
leaperSE.solPrint = %solPrint.quiet%; // 솔버 출력을 제공하지 않음

* 하위 무료 슬롯 게임 제거 데이터 구조 초기화
nl('1') = 예;
n(nn) = 아니오;
t(nn,m) = 아니요;
l(nn) = 0;

반복하다
   mip를 사용하여 z를 최소화하는 leaperSE를 해결합니다.
   중단$(leaperSE.modelStat <> %modelStat.optimal% 및
          LeaperSE.modelStat <> %modelStat.integerSolution% ) '정수 솔루션을 찾을 수 없습니다!', t;
   SolRep('SubTour','시간') = SolRep('SubTour','시간') + leaperSE.resUsd;
   xm.l(m) = round(xm.l(m));
   ntours = 0;
   방문함(r,c) = 아니오;

   loop((r,c)$(not Visited(r,c)), // 방문하지 않은 모든 사각형을 반복합니다.
      ntours = ntours + 1;
      nl(nn) = nl(nn - 1);
      n(nl) = 예;
      l(nl) = 0;
      (r,c) = 예;            // (하위)무료 슬롯 게임 시작
      반복하다
         방문(from) = 예;
         to(rp,cp) = sum(m(from,rp,cp), xm.l(m)); // 이동은 어디로 가는가
         t(nl,from,to) = 예;
         l(nl) = l(nl) + 1;
         에서(rp,cp) = 에서(rp,cp); // 이동 대상은 다음과 같습니다.
                                    // 다음 이동의 원점
      sum(방문(to),1)까지;
      (r,c) = 아니오;
   );
   ttours = ttours + ntours;
   abort$(ttours > 카드(nn)) 'Cut set nn이 너무 작습니다.', t, n;
ntours = 1이 될 때까지;

SolRep('SubTour','Iterations') = leaperSE.number;
SolRep('SubTour','#SubTours') = ttours;

* 도약 무료 슬롯 게임 구축
스칼라 nmove '이동 횟수' / 0 /;
에서(ss) = 예;

반복하다
   nmove = nmove + 1;
   to(rp,cp) = sum(m(from,rp,cp), xm.l(m));
   LeaperTour(from) = nmove;
   에서(r,c) = 에서(r,c);
to('1','1')까지;

'SubTour 제거 무료 슬롯 게임' 표시, leaperTour, SolRep;