설명
이 모델은 체스에서 8명의 여왕을 배열하는 가능한 모든 방법을 찾습니다. 두 명의 여왕이 서로를 확인하지 않는 방식으로 탑승하십시오. 루프 내에서 해결을 사용하면 다음까지 연속 솔루션이 차단됩니다. 모델이 실행 불가능해집니다. 이 시점에서 모든 솔루션은 열거되었습니다. 이 문제는 오랜 역사를 가지고 있습니다. 1850년 C.F.에 의해 조사되었습니다. 가우스, 그러나 그는 그것을 풀지 못했다 완전히. 표준 8x8 체스판에는 92가지 가능한 솔루션이 있습니다. 대체 NxN 체스판을 쉽게 사용할 수 있습니다. 아래 numSols를 참조하세요. Dudeney, HE, 수학의 즐거움. 1970년 뉴욕 도버. Beauvais, J, OSL로 최대 퀸즈 체스 문제 해결. IBM 킹스턴, EKKNEWS 2 (1991). 슬롯 게임 모델 라이브러리, queens.103 기고자: Steve Dirkse, 2012년 1월
소형 모델 유형 :MIP
카테고리 : 슬롯 게임 테스트 라이브러리
메인 파일 : mip05.gms
$title 최대 퀸즈 체스 문제 (MIP05,SEQ=549)
$eolCom !
$onText
이 모델은 체스에서 8개의 퀸을 배열하는 가능한 모든 방법을 찾습니다.
두 명의 여왕이 서로를 확인하지 않는 방식으로 탑승하십시오.
루프 내에서 해결을 사용하면 다음까지 연속 솔루션이 차단됩니다.
모델이 실행 불가능해집니다. 이 시점에서 모든 솔루션은
열거되었습니다. 이 문제는 오랜 역사를 가지고 있습니다. 1850년
C.F.에 의해 조사되었습니다. 가우스, 그러나 그는 그것을 풀지 못했다
완전히. 표준 8x8 체스판에는 92가지 가능한 솔루션이 있습니다.
대체 NxN 체스판을 쉽게 사용할 수 있습니다. 아래 numSols를 참조하세요.
Dudeney, HE, 수학의 즐거움. 1970년 뉴욕 도버.
Beauvais, J, OSL로 최대 퀸즈 체스 문제 해결. IBM
킹스턴, EKKNEWS 2 (1991).
슬롯 게임 모델 라이브러리, queens.103
기고자: Steve Dirkse, 2012년 1월
$offText
* 컷 생성 없이 실행하려면 명령줄에서 --SKIPCUTS=1을 사용하세요.
* 이렇게 하면 문제가 해결되지 않고 기본적으로 해결됩니다.
* 하나의 솔루션만 반환
$설정되지 않은 경우 SKIPCUTS $set SKIPCUTS 0
$ifThen %DEMOSIZE% == 1
i '체스판 크기' / 1*6 / 설정;
$else
i '체스판 크기' / 1*8 / 설정;
$endIf
$eval NS 2 * 카드(i) - 3
세트
s '대각선 오프셋' / 1*%NS% / ! 2i-3 대각선
nn '최대 솔루션 수' / s1*s1000 /
n(nn) '해결책을 찾았습니다'
희미한 '알려진 크기' / d1 * d10 /
;
별칭(i,j);
매개변수
sh(s) '대각선 이동 값'
rev(i) '역순'
sols(nn,i,j) '이전에 찾은 컷 생성 솔루션'
numSols(어두움) /
d4 2
d5 10
d6 4
d7 40
d8 92
d9 352
d10 724
/
;
스칼라
nI '체스판의 크기'
nSols '발견된 솔루션 수'
;
sh(s) = ord(s) - 카드(i) + 1 ;
rev(i) = 카드(i) + 1 - 2*ord(i);
sh, rev를 표시합니다.
이진 변수 x(i,j) '사각형은 여왕에 의해 점유됩니다'
변수 tot '퀸이 차지하는 사각형의 수'
방정식
a(i) '두 명의 여왕이 같은 순위에 있을 수 없습니다.'
b(j) '같은 파일에 두 개의 퀸이 있을 수 없습니다'
c(s) '같은 대각선(앞으로)에 두 개의 퀸이 있을 수 없습니다.'
d(s) '같은 대각선(뒤쪽)에는 두 개의 퀸이 있을 수 없습니다.'
obj '객관적 정의'
cut(nn) '제거할 알려진 솔루션'
;
a(i)..sum(j, x(i,j)) =e= 1;
b(j)..sum(i, x(i,j)) =e= 1;
c(s)..sum(i, x(i,i+sh(s))) =l= 1;
d(s).. sum(i, x(i,i+(rev(i)+sh(s)))) =l= 1;
cut(n).. sum(i,j), sols(n,i,j)*x(i,j) =l= 카드(i)-1;
obj..tot =e= sum(i,j), x(i,j);
모델퀸즈 '컷이 있는 모델' / 모두 / ;
n(nn) = 아니오; ! 명확한 컷 세트
솔(nn,i,j) = 0;
옵션 optcr=0;
mip를 사용하여 tot를 최대화하는 퀸을 해결합니다.
$if %SKIPCUTS% == 1 $종료
옵션 limrow=0, limcol=0, solprint=off;
옵션solveLink = %solveLink.loadLibrary%;
루프nn$(queens.solvestat=%solveStat.normalCompletion% 및
queens.modelstat=%modelStat.optimal%),
n(nn) = 예; ! 세트에 요소 추가
sols(nn,i,j) = round(x.l(i,j));
밉을 사용하여 최대화하는 퀸을 해결하세요.
;
abort$[card(n) eq 카드(nn)] 'nn을 너무 작게 설정';
nI = 카드(i);
nSols = 카드(n);
nI, nSols를 표시합니다.
abort$[nSols <> sumdim$(ord(dim) eq nI), numSols(dim)] '잘못된 nSols', nSols, numSols, nI;
Execute_unload 'queensSolsCuts', n, I, sols;