perm1.gms : 다양한 순열 테스트

설명

기고자: Michael Bussieck

  1부

소형 모델 유형 :슬롯 나라


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


메인 파일 : perm1.gms

$title 다양한 순열 테스트(PERM1,SEQ=556)

$onText
기여자: Michael Bussieck
$offText

* 1부
i / i1*i3 / 설정;
* 세트 i는 i1 i2 i3으로 구성됩니다. 세트는 재정렬될 수 있으므로 두 번째 인덱스가 필요합니다.
* 순열을 나타냄
perm1(i,i) / i1.i2, i2.i1, i3.i3 / 설정;
* 이 세트는 주기 표기법으로 나타냅니다: (1 2)(3)

* 계승을 사용하면 가능한 모든 수를 계산할 수 있습니다.
* i의 순열: 3! = 3*2*1 = 6
$eval pmax 사실(카드(i))
p 순열 인덱스 설정 /p1*p%pmax%/;

* 이 작은 세트에는 모두 적어 둘 수 있습니다
테이블 폴 설정(p,i,i)
       i1 i2 i3
p1.i1 1
p1.i2 1
p1.i3 1

p2.i1 1
p2.i2 1
p2.i3 1

p3.i1 1
p3.i2 1
p3.i3 1

p4.i1 1
p4.i2 1
p4.i3 1

p5.i1 1
p5.i2 1
p5.i3 1

p6.i1 1
p6.i2 1
p6.i3 1
;

* 집합 p와 i로부터 집합 pall을 생성하는 특별한 슬롯 나라 구문도 있습니다.
set pall2(p,i,i); 옵션 pall2 > i;

* 순열의 순서는 생성 방법에 따라 다르지만 여전히
* pall과 pall2 비교
별칭(i,ii);
set error01(p,i,i); error01(p,i,ii) = pall(p,i,ii) xor pall2(p,i,ii);
abort$card(error01) '순열 pall과 pall2가 다릅니다.', error01;

* 이 구문은 1차원 집합 i에 국한되지 않으며 다음과 같이 동일하게 수행할 수 있습니다.
* 다차원 세트:

j / j1*j2 /, k / k1*k5 / 설정
    jk(j,k) / j1.k3, j1.k5, j2.k1 /;

* jk는 3요소 세트이므로 3개로 하겠습니다! = 3*2*1 = 6개의 순열
* p 인덱스를 사용하여 모든 순열을 나타낼 수 있습니다.
pjkall(p,j,k,j,k)를 설정합니다. 옵션 pjkall > jk;

Execute_unload 'jk', pjkall;
Execute_load 'jk', pjkall;

* pikall에는 j1.k3 -> j1.k3, j1.k5 -> j1.k5, j2.k1 -> j2.k1이 있습니다.
* j1.k3 -> j1.k3, j1.k5 -> j2.k1, j2.k1 -> j1.k5
* j1.k3 -> j1.k5, j1.k5 -> j1.k3, j2.k1 -> j2.k1
* ...

* 이를 확인하기 위해 당사의 폴 세트를 사용할 수 있습니다.
set ijk(i,j,k) / #i:#jk /;
pjkall2(p,j,k,j,k)를 설정합니다.

루프(팔(p,i,ii),
  pjkall2(p,jk,j,k)$ijk(i,jk) = sum(ijk(ii,j,k),1));

오류02(p,j,k,j,k)를 설정합니다. error02(p,jk,j,k) = pjkall(p,jk,j,k) xor pjkall2(p,jk,j,k);
abort$card(error02) 'pjkall과 pjkall2의 순열이 다름', error02;

* 위에서 본 것처럼 두 번째 인덱스를 사용하여 집합 요소를 순열할 수 있지만
* 또한 슬롯 나라 매개변수의 숫자 데이터를 순열합니다.

매개변수 a(i) /i1 1, i2 2, i3 3/;

* 여기서는 다른 인덱스를 가질 필요가 없습니다.
* 다음과 같은 방식으로 순열

테이블 폴(p,i)
       i1 i2 i3
p1 1 2 3
p2 1 3 2
p3 2 1 3
p4 2 3 1
p5 3 1 2
p6 3 2 1
;

매개변수 paall2(p,i); 옵션 paall2 > a;

set error03(p,i); error03(p,i) = paall(p,i) <> paall2(p,i);
abort$card(error03) 'paall과 paall2가 다릅니다', error03, paall, paall2;

* 집합 순열로부터 데이터 순열을 계산할 수도 있습니다.
매개변수 paall3(p,i);
paall3(p,i) = sum(paall(p,i,ii), a(ii));

set error04(p,i); error04(p,i) = paall(p,i) <> paall3(p,i);
abort$card(error04) 'paall과 paall3이 다릅니다', error03, paall, paall3;

* 다차원 매개변수에 대해서도 데이터 순열을 수행할 수 있습니다.
매개변수 b(j,k) /j1.k3 1, j1.k5 2, j2.k1 3/;
테이블 pball(p,j,k)
       j1.k3 j1.k5 j2.k1
p1 1 2 3
p2 1 3 2
p3 2 1 3
p4 2 3 1
p5 3 1 2
p6 3 2 1
;

매개변수 pball2(p,j,k); 옵션 pball2 > b;

Execute_unload 'jk', pball2;
Execute_load 'jk', pball2;

set error05(p,j,k); error05(p,jk) = pball(p,jk) <> pball2(p,jk);
abort$card(error05) 'pball과 pball2가 다릅니다', error05, pball, pball2;

* 데이터 순열에는 한 가지 특별한 점이 있습니다. 데이터에 다음이 포함된 경우
* 숫자를 두 번 사용하는 경우(예:
매개변수 c(i) /i1 1, i2 1, i3 3/;

* 슬롯 나라 순열은 다음 결과를 초래하는 순열을 접지 않습니다.
* 동일한 데이터 기록. 따라서 p1=p3, p2=p4 및 p5=p6인 경우 다시 6개의 순열이 있습니다.

테이블 pcall(p,i)
       i1 i2 i3
p1 1 1 3
p2 1 3 1
p3 1 1 3
p4 1 3 1
p5 3 1 1
p6 3 1 1
;

매개변수 pcall2(p,i); 옵션 pcall2 > c;

set error06(p,i); error06(p,i) = pcall(p,i) <> pcall2(p,i);
abort$card(error06) 'pcall과 pcall2가 다릅니다.', error06, pcall, pcall2;