목차
소개
이 장에서는 GAMS에서 사용할 수 있는 프로그래밍 흐름 제어 기능에 대해 설명합니다.If 문복잡한 조건문 표현을 용이하게 합니다(또한 장 참조조건식, 할당 및 방정식). 또한 GAMS는 슬롯 게임 요구 사항을 처리하기 위해 네 가지 슬롯 게임 구성을 제공합니다.슬롯 게임문, 그while문, 그문용그리고문장 반복. 이 장의 끝에서 우리는 다음을 소개할 것입니다.휴식및계속 진술24860_24941중단 명령문, 프로그램 실행을 종료하는 데 사용할 수 있는 명령문입니다.
이 장에서는 실행 시 프로그래밍 흐름 제어 기능을 다루고 있습니다. 또한 GAMS는 다음을 허용하는 달러 제어 옵션을 제공합니다.조건부 처리 중 의 입력 파일 에 컴파일 시간. 자세한 내용은 옵션 상세설명을 참고하세요$if. 일반적인 달러 관리 옵션에 대한 자세한 내용은 장을 참조하세요.달러 통제 옵션.
If 문
그if문은 문 그룹을 조건부로 분기하는 데 유용합니다. 경우에 따라 이는 일련의로 작성될 수도 있습니다.달러 조건하지만if문을 사용하면 GAMS 코드를 더 읽기 쉽게 만들 수 있습니다. 선택 사항그밖에및/또는elseif부분을 통해 사용자는 전통적인 형식을 공식화할 수 있습니다.if-then-else구조물.
If 문: 구문
if (논리_조건,
진술; 진술;
키워드if이것은 다음을 나타냅니다.if성명. 논리 조건 뒤에는 하나 이상이 옵니다.문장논리적 조건이 만족되면 실행됩니다. GAMS의 다양한 형태의 논리적 조건에 대한 자세한 내용은 섹션을 참조하세요.논리적 조건그리고필터링 세트.if문은 논리 조건이 다음과 같은 경우에 대한 지정 없이 이 시점에서 끝날 수 있습니다.거짓이 경우에는 아무런 조치도 취하지 않습니다. 그러나 GAMS는 추가 사양도 허용합니다: 선택적 대안if모든 이전 경우에 대한 테스트 및 선택적 설명if테스트가 실패했습니다. 키워드elseif대안을 소개합니다if논리적 조건과 하나 이상의 테스트문장. 참고하세요elseifcase는 선택사항이며 여러 번 반복될 수 있습니다. 추가로 다음 사항에 유의하세요.elseifcase는 다음의 논리적 조건을 의미합니다.if케이스가 만족되지 않았습니다. 키워드그밖에구조의 마지막 부분을 소개합니다. 선택 사항이며, 의 논리적 조건이 다음과 같은 경우에 대한 사양을 허용합니다.if케이스(및 아마도elseif케이스)가 만족되지 않았습니다.
- 주의
- 만실행문은 프로그래밍 흐름 제어 문에서 허용됩니다. 따라서 선언문과 방정식 정의는 내부에서 허용되지 않습니다.
if진술.
예는 다음 하위 섹션에 나와 있습니다. 일부 널리 사용되는 프로그래밍 언어의 구문과 더 일치하는 대체 구문이 있습니다. 자세한 내용은 달러 제어 옵션에 대한 자세한 설명을 참조하세요.onEnd.
If 문: 예
달러 조건을 사용하는 다음 조건부 할당문 세트를 고려하십시오:
p(i)$(f <= 0) = -1 ;
p(i)$((f > 0) 및 (f < 1)) = p(i)**2 ;
p(i)$(f >= 1) = p(i)**3 ;
q(j)$(f <= 0) = -1 ;
q(j)$((f > 0) 및 (f < 1)) = q(j)**2 ;
q(j)$(f >= 1) = q(j)**3 ;
그들은 다음을 사용하여 표현될 수 있습니다.if-elseif-else성명:
if (f <= 0,
p(i) = -1 ;
q(j) = -1 ;
elseif ((f > 0) 및 (f < 1)),
p(i) = p(i)**2 ;
q(j) = q(j)**2 ;
그렇지 않으면
p(i) = p(i)**3 ;
q(j) = q(j)**3 ;
) ;
본문은if문에는 다음이 포함될 수 있음해결문장. 예를 들어, 다음에 나오는 GAMS 코드를 생각해 보세요. 참고하세요mlGAMS 모델입니다.z자유 변수입니다.j세트이고x변수입니다.
z를 최소화하는 lp를 사용하여 ml를 해결합니다.
if (ml.modelstat = 4,
"모델 ml는 실행 불가능합니다. x의 경계를 완화하고 다시 풀어보세요"를 표시합니다.
x.up(j) = 2*x.up(j) ;
z 를 최소화하는 lp 를 사용하여 ml 을 푼다;
그렇지 않으면
if (ml.modelstat <> 1,
"오류 해결 모델 ml"을 중단합니다.
);
);
먼저 모델ml해결되었습니다. 자세한 내용은해결GAMS의 문, 섹션 참조해결 진술. 그런 다음 사후 솔루션 분석은 다음을 사용하여 수행됩니다.if성명. 모델이 실현 불가능한 경우 변수의 상한x완화되고 모델이 다시 해결됩니다. 원래 모델이 실행 가능하지 않고 최적이 아닌 경우 컴파일이 중단되고 위의 오류 메시지가 보고됩니다. GAMS 출력에 대한 자세한 내용은 장을 참조하세요.GAMS 출력, 특히 하위 섹션모델 상태31614_31660디스플레이문은 장에 소개되어 있습니다.표시문. 자세한 내용은중단명령, 참조중단.
다음 GAMS 코드는 내부 방정식 정의가 허용되지 않으므로 불법입니다.if성명.
if (s > 0,
eq..sum(i,x(i)) =g= 2 ;
);
다음 GAMS 코드도 내부 선언이므로 불법입니다.if문은 허용되지 않습니다.
if (s > 0,
슬롯 게임 y ; 와이 = 5;
);
슬롯 게임 문
그슬롯 게임문은 집합의 각 구성원에 대한 문 그룹의 실행을 용이하게 합니다.슬롯 게임문은 병렬 할당이 충분하지 않은 경우에 특히 유용합니다. 이는 매개변수에 할당할 값 사이에 분석 관계가 없는 경우 가장 자주 발생합니다. 물론 일반 프로그래밍에 대해 반복문을 사용하는 것도 유용합니다.
슬롯 게임 문: 구문
다음 구문은슬롯 게임GAMS의 진술은 다음과 같습니다:
loop(index_list[$(논리_조건)],
진술; 진술;
키워드슬롯 게임이것은 슬롯 게임 문임을 나타냅니다.index_list은 슬롯 게임의 제어 도메인입니다. 슬롯 게임는 둘 이상의 세트로 제어될 수 있습니다. 이 경우 인덱스 목록 주위에 괄호가 필요하며, 이를슬롯 게임 세트(들). 동적 세트가 슬롯 게임 세트로 허용된다는 점에 유의하십시오. 슬롯 게임 세트는 논리적 조건에 의해 제한될 수 있습니다. GAMS의 다양한 형태의 논리적 조건에 대한 자세한 내용은 섹션을 참조하세요.논리적 조건그리고필터링 세트. 일반적인 달러 조건에 대한 소개는 장을 참조하세요.조건식, 할당 및 방정식. 색인 목록 다음에는 하나 이상이 옵니다문장. 마지막 문을 제외하고 각 문은 세미콜론으로 끝나야 합니다.';'. 슬롯 게임 문은 제어 도메인의 각 구성원에 대해 차례로 실행됩니다. 평가 순서는 라벨의 입력 순서입니다. 따라서 슬롯 게임는 또 다른 보다 일반적인 유형의입니다.인덱싱된 작업.
- 주의
- 만실행문은 프로그래밍 흐름 제어 문에서 허용됩니다. 따라서 선언문과 방정식 정의는 a 내에서 허용되지 않습니다.
슬롯 게임진술. - 슬롯 게임 본문 내부의 제어 세트를 수정하는 것은 불법입니다.
- 만실행문은 프로그래밍 흐름 제어 문에서 허용됩니다. 따라서 선언문과 방정식 정의는 a 내에서 허용되지 않습니다.
슬롯 게임GAMS의 문은 반복 계산에 자주 사용되며 다음을 사용하여 보고서를 생성합니다.put 문그리고 시나리오 기반 연구 수행문 풀기. 예제는 다음 하위 섹션에 나와 있습니다. 일부 널리 사용되는 프로그래밍 언어의 구문과 더 일치하는 대체 구문이 있습니다. 자세한 내용은 달러 제어 옵션에 대한 자세한 설명을 참조하세요.onEnd.
슬롯 게임 문: 예
성장률이 경험적일 때 가상의 사례를 고려하십시오:
t / 1985*1990 / 설정;
매개변수 pop(t) / 1985 3456 /
증가율(톤) / 1985년 25.3, 1986년 27.3, 1987년 26.2
1988 27.1, 1989 26.6, 1990 26.6 /;
그슬롯 게임문은 누적 합계를 반복적으로 계산하는 데 사용됩니다.
loop(t, pop(t+1) = pop(t) + 성장(t) ) ;
이 예에서 운전 세트는t그리고 슬롯 게임 범위에는 단 하나의 명령문만 있습니다.
다음의 작은 인위적인 예는 달러 조건의 효과를 설명합니다.슬롯 게임성명.
i / i1*i3 /를 설정합니다.
j / j1*j5 /
k(i,j) / i1.j1, i1.j3, i3.j3, i3.j5 /;
매개변수 c(i) / i1 3, i2 1 /
q(i,j) / i1.j1 1, i1.j2 3, i1.j4 2 / ;
슬롯 게임 x, y, z;
x = 1; y = 3; z = 1;
루프((i,j) $ (q(i,j) > 0), x = x + q(i,j));
루프( i $ (c(i) + c(i)**2), z = z + 1);
루프( i $ sum(j, abs(q(i,j))), z = z + 1);
루프( j $ (ord(j) > 1 및 ord(j) < 카드(j)), z = z + 1);
루프( (i,j) $ k(i,j), y = y + ord(i) + 2*ord(j));
첫 번째에서슬롯 게임제어 도메인이 세트 쌍이라고 진술(i,j). 매개변수와 연관된 값을 가진 라벨 조합으로 제한됩니다.q0보다 큽니다. 두 번째의 논리 조건슬롯 게임문은 \( c(i) + c(i)^2\)입니다. 이는 \( c(i) + c(i)^2 \neq 0\)의 약어입니다. 세 번째 도메인슬롯 게임문은 집합의 해당 요소로 제한됩니다.i합계가 끝나는 곳j매개변수의 절대값q0이 아닙니다. 이 조건은 라벨에 대해서만 충족됩니다."i1". 그것을 관찰하십시오i그리고j둘 다세트 주문. 네 번째에서는슬롯 게임집합의 첫 번째 요소와 마지막 요소를 기술합니다j제외됩니다. 집합 연산자에 대한 자세한 내용은ord그리고카드, 섹션 참조Ord 연산자그리고카드 운영자각각. 마지막 달러 통제슬롯 게임문은 세트의 구성원이 아닌 모든 라벨 조합을 제외합니다.k. 달러 조건에 대한 자세한 내용은 장을 참조하세요.조건식, 할당 및 방정식.
다음 예는 집합의 각 요소에 대해 모델을 해결할 수 있는 방법을 보여줍니다.ia를 사용하여 다른 데이터로슬롯 게임문장. 참고하세요문제데이터은 슬롯 게임입니다.g(i)그리고d(i)매개변수입니다.내모델GAMS 모델이며이익자유변수입니다.
슬롯 게임(i,
문제데이터 = g(i);
이익을 극대화하는 lp를 사용하여 mymodel을 해결합니다.
d(i) = 이익.l;
);
첫 번째 명령문에서 모델의 일부 데이터는 매개변수의 \(i^th\) 요소에 따라 업데이트됩니다.g. 두 번째 문장에서 모델이 해결되었습니다. 자세한 내용은해결문, 섹션 참조해결 진술. 각 반복의 목표 값은 매개변수에 저장됩니다.d세 번째 진술에서.
슬롯 게임는 반복 계산을 수행하는 데 종종 사용됩니다. 뉴턴의 방법으로 제곱근을 구하는 다음 예를 생각해 보세요. 이 예는 순전히 설명을 위한 것입니다. 실제로는 함수sqrt을 사용해야 합니다. 뉴턴의 방법은 \(x\)가 \(v\)의 제곱근에 대한 근사라면 \((x+v/x)/2\)가 더 나은 근사라는 주장에 기초합니다.
설정 i "반복을 실행하도록 설정" / i-1*i-100 /;
매개변수 값(i) "연속 근사치를 유지하는 데 사용됨";
슬롯 게임 대상 "제곱근이 필요한 숫자" / 23.456 /
sqrtval "sqrt(target)에 대한 최종 근사치"
curacc "현재 근사치의 정확성"
reltol "필요한 상대 정확도" / 1.0e-06 /;
abort$(target <= 0) "newton에 대한 인수는 양수여야 합니다.";
value("i-1") = 목표/2 ;
큐라크 = 1 ;
루프(i$(curacc > reltol),
값(i+1) = 0.5*(값(i) + 목표/값(i));
sqrtval = 값(i+1);
curacc = 절대값(값(i+1)-값(i))/(1+abs(값(i+1)))
) ;
abort$(curacc > reltol) "제곱근을 찾을 수 없습니다."
옵션 소수점=8;
"허용 범위 내에서 찾은 제곱근", sqrtval, value를 표시합니다.
이 예에서 슬롯 게임의 달러 조건은 구동 세트를 제한하지 않는다는 점에 유의하십시오.i, 그러나 루프 프로시저를 종료하는 데 사용됩니다. 슬롯 게임curacc반복할 때마다 업데이트됩니다. 필요한 상대 정확도와 같거나 작아지는 즉시렐톨슬롯 게임가 중지됩니다. 아래 출력에서 볼 수 있듯이 이는 7번의 반복 이후의 경우입니다. 의 본문슬롯 게임문은 세 개의 문으로 구성됩니다. 첫 번째 문은 현재 근사치를 계산하고 이를 매개변수에 할당합니다.값. 두 번째 문은 슬롯 게임를 업데이트합니다.sqrtval, 세 번째 문은 각 반복에서 현재 근사치의 정확도를 계산합니다. 슬롯 게임 문 앞뒤에 특별한 경우를 설명하기 위해 줄을 추가했습니다. 자세한 내용은중단문, 섹션 참조중단 선언문이 장의 끝 부분에 있습니다. 에 의해 생성된 출력표시문아래에 나와 있습니다.
---- 허용 범위 내에서 19 제곱근을 찾았습니다.
---- 19 PARAMETER SQRTVAL = 4.84313948 최종 근사치
sqrt(대상)으로
---- 19 연속 근사치를 유지하는 데 사용되는 PARAMETER VALUE
i-1 11.72800000, i-2 6.86400000, i-3 5.14062471, i-4 4.85174713
i-5 4.84314711, i-6 4.84313948, i-7 4.84313948슬롯 게임 본문 내의 명령문은 다음과 같을 수 있습니다.If 문(또는 기타 프로그래밍 흐름 제어 문). 게다가 a의 논리 조건은슬롯 게임문은로 표현될 수 있습니다.if달러 조건 대신 명세서. 다음 예는 예시로 사용됩니다. 그것을 관찰하십시오k세트이고s, t, u그리고a매개변수입니다.
슬롯 게임(k,
if((s(k) < 0 및 t(k)),
u(k) = a(k);
);
);
논리적 조건이 만족되지 않으면 할당이 이루어지지 않으며 매개변수가 지정됩니다.u변경되지 않은 상태로 유지됩니다.
하위 집합은 호로 상위 집합과 연결되어 a를 형성한다는 것을 기억하세요.도메인 트리여기서 루트 노드는유니버설 세트. 다음 예는 도메인 트리가 슬롯 게임 문에서 어떻게 사용될 수 있는지 보여줍니다.
i / i1*i10 / 설정
ii(i)
j(i) / i1*i9 /
jj(j) / i1*i8 /
jjj(jj) / i1*i7 /;
loop(i(jjj), ii(i) = yes;);
디스플레이 ii;
루핑 세트가 다음과 같은지 관찰하십시오.i(jjj). 이는 우리가 해당 요소를 반복한다는 것을 의미합니다.i또한 집합의 요소입니다jjj. 이 구성은 다음부터 허용됩니다.i다음 경로의 도메인 트리에 있습니다.jjj우주 또는 보편적 세트에. 한 경로에서 도메인 트리로 올라가고 다른 경로로 내려가는 것이 허용됩니다. 따라서의 모든 요소는jjj다음에 할당됨ii. 표시 문의 결과는 다음을 확인합니다.
---- 8 세트 ii i1, i2, i3, i4, i5, i6, i7
While 문
그그동안문은 논리적 조건이 충족되는 한 하나 이상의 문의 반복 실행을 용이하게 합니다.
While 문: 구문
while(논리_조건,
진술; 진술;
키워드그동안이것은 다음을 나타냅니다.그동안문장. 내부그동안논리적 조건 다음에 하나 이상이 오는 진술문장. GAMS의 다양한 형태의 논리적 조건에 대한 자세한 내용은 섹션을 참조하세요.논리적 조건그리고필터링 세트. 논리 조건이 다음과 같은 한 명령문이 실행됩니다.참.
- 주의
- 만실행문은 프로그래밍 흐름 제어 문에서 허용됩니다. 따라서 선언문과 방정식 정의는 a 내에서 허용되지 않습니다.
그동안진술.
예는 다음 하위 섹션에 나와 있습니다. 일부 널리 사용되는 프로그래밍 언어의 구문과 더 일치하는 대체 구문이 있습니다. 자세한 내용은 달러 제어 옵션에 대한 자세한 설명을 참조하세요.onEnd.
While 문: 예
다음의 간단한 예를 생각해 보십시오:
슬롯 게임 x; x = 1;
while( round(x,2) < 10,
x = x + 0.01;
);
디스플레이 x;
슬롯 게임에 주의하세요x은 10이 될 때까지 각 반복에서 증가합니다. 또한 정확한 결과를 보장하려면 수치 비교에서 위에서와 같이 안정적인 검사가 필요합니다. (라운드(x,2) < 10), 그렇지 않으면 반올림 오류가 발생할 수 있습니다. 즉시x10에 도달하면 논리적 조건이 더 이상 충족되지 않으므로 더 이상 통과할 수 없습니다. 따라서 최종 값은x10과 같습니다.
a의 패스 수에 유의하세요.그동안명령줄 매개변수 또는 옵션을 사용하여 명령문을 제한할 수 있습니다.포림. 명령줄 매개변수 및 옵션에 대한 자세한 내용은 섹션을 참조하세요.명령줄을 통해 옵션 지정및 장옵션 설명각각.
그동안문을 사용하여 다음을 제어할 수 있습니다.해결문장. 예를 들어, 비볼록 최적화를 위한 무작위 다중 시작 방법의 다음 구현을 고려해보세요.
슬롯 게임 개수 / 1 /;
슬롯 게임 글로민 / inf /;
옵션 브라티오 = 1 ;
while(count <= 1000,
x.l(j) = 균일(x.lo(j),x.up(j)) ;
obj를 최소화하는 nlp를 사용하여 ml를 해결합니다.
if (obj.l < globmin,
글로민 = obj.l ;
베스트솔(j) = x.l(j) ;
) ;
개수 = 개수+1 ;
) ;
초기 레벨 값을 상한과 하한 사이에 무작위로 설정하여 무작위 시작점에서 시작한다는 점에 유의하세요. 이는 경계가 이전에 지정되었으며 무한대가 아니라고 가정합니다. 방법이 개선되면, 즉 논리조건이 성립하는 경우(obj.l < globmin)만족, 가장 잘 알려진 해가 슬롯 게임에 저장됨글로민. 지금까지 가장 잘 알려진 솔루션과 관련된 레벨 값은 매개변수에 저장됩니다.베스트솔. 이 과정을 1000번 반복합니다. 모델[프라임]는를 사용하는 또 다른 예입니다.그동안문이 설명되어 있습니다. 이 모델에서는 200보다 작은 모든 소수 집합이 생성됩니다.
다음 GAMS 코드는 a 내부의 방정식 정의로 인해 불법입니다.그동안문은 허용되지 않습니다.
동안(s > 0,
eq..sum(i,x(i)) =g= 2 ;
);
다음 GAMS 코드도 a 내부 선언이므로 불법입니다.그동안문은 허용되지 않습니다.
동안(s > 0,
슬롯 게임 y ; 와이 = 5;
);
For 문
그for문은 값 범위를 반복하고 매번 하나 이상의 문을 실행하는 간단한 방법을 제공합니다.
For 문: 구문
for (a = start_value to|downto end_value [증분별],
진술; 진술;
키워드for이것은 다음을 나타냅니다.for성명. 슬롯 게임a실수로 시작함시작_값그리고 슬롯 게임를 통과할 때마다 증분만큼 변경됩니다.증가실수에 도달할 때까지end_value. 증분 지정은 선택 사항이며 기본값은 1입니다. 증분을 지정하는 경우 양의 실수여야 합니다. 추가로 참고하세요에슬롯 게임를 나타냄ais증가그리고아래로다음을 나타냅니다.감소. 각 반복에서 하나 이상문장실행됩니다.
- 주의
- 만실행문은 프로그래밍 흐름 제어 문에서 허용됩니다. 따라서 선언문과 방정식 정의는 a 내에서 허용되지 않습니다.
for진술.
다음 하위 섹션에 예가 나와 있습니다. 일부 널리 사용되는 프로그래밍 언어의 구문과 더 일치하는 대체 구문이 있습니다. 자세한 내용은 달러 제어 옵션에 대한 자세한 설명을 참조하세요.onEnd.
For 문: 예
다음의 간단한 예를 생각해 보십시오:
슬롯 게임 s;
(s = -3.8 ~ -0.1 x 1.4,
디스플레이 ;
);
참고하세요부정시작 및 끝 값에 실수가 가능합니다. 결과 목록 파일에는 다음 줄이 포함됩니다.
-- 3 매개변수 s = -3.800 ---- 3개 매개변수 = -2.400 ---- 3개 PARAMETER = -1.000
다음의 가치를 관찰하세요s은 -0.1을 초과하지 않는 한 슬롯 게임를 한 번 통과할 때마다 1.4씩 증가했습니다. 다음 예에서는의 값sis감소:
슬롯 게임 s;
for (s = 3에서 -0.1 x 1.4,
디스플레이 ;
);
a의 패스 수에 유의하세요.for명령줄 매개변수 또는 옵션을 사용하여 명령문을 제한할 수 있습니다.포림. 명령줄 매개변수 및 옵션에 대한 자세한 내용은 섹션을 참조하세요.명령줄을 통해 옵션 지정및 장옵션 설명각각.
좋아요그동안문장,for문을 사용하여 다음을 제어할 수 있습니다.해결문장. 다음 예에서는의 사용을 보여줍니다.for문을 복제하여비볼록 모델의 전역 최적해에 대한 무작위 검색위에서 논의한 내용입니다.
슬롯 게임 i ;
슬롯 게임 globmin / inf / ;
옵션 브라티오 = 1 ;
(i = 1 ~ 1000,
x.l(j) = 균일(x.lo(j),x.up(j)) ;
obj를 최소화하는 nlp를 사용하여 ml를 해결합니다.
if (obj.l < globmin,
글로민 = obj.l ;
베스트솔(j) = x.l(j) ;
);
);
논리적 조건은그동안슬롯 게임(수 <= 1000)는 슬롯 게임 값 범위 지정으로 대체됩니다.i. 의 본문for슬롯 게임는 본문과 동일합니다.그동안루프, 슬롯 게임 업데이트 명령문 제외개수우리가 필요로 했던 것그동안슬롯 게임. 이는 두 슬롯 게임 간의 유사점과 차이점을 보여줍니다.
다음 GAMS 코드는 a 내부에서 방정식을 정의하는 것이 허용되지 않으므로 불법입니다.for진술.
(s = 1 ~ 5,
eq..sum(i,x(i)) =g= 2 ;
);
다음 GAMS 코드도 a 내부 선언이므로 불법입니다.for문은 허용되지 않습니다.
(s = 1 ~ 5,
슬롯 게임 y ; 와이 = 5;
);
반복 진술
그반복문은 하나 이상의 문의 반복 실행을 용이하게 합니다. 이는 무조건 한 번 이상 수행되며 논리적 조건이 만족되면 중지됩니다.
반복문: 구문
반복(
진술; 진술;
키워드반복이것은 다음을 나타냅니다.반복문장. 하나 이상문장각 반복에서 실행됩니다. 키워드까지종료 기준을 도입합니다. 논리적 조건이 만족되면반복슬롯 게임가 종료되었습니다. GAMS의 다양한 형태의 논리적 조건에 대한 자세한 내용은 섹션을 참조하세요.논리적 조건그리고필터링 세트.
참고하세요반복문은 다음과 유사합니다그동안문장이지만 a반복슬롯 게임는 논리 조건이 명시된 이후 적어도 한 번 실행되도록 보장됩니다.이후문장.
- 주의
- 만실행문은 프로그래밍 흐름 제어 문에서 허용됩니다. 따라서 선언문과 방정식 정의는 a 내에서 허용되지 않습니다.
반복문장.
예는 다음 하위 섹션에 나와 있습니다.
반복문: 예
다음의 간단한 예를 생각해 보십시오:
슬롯 게임 a / 1 /;
반복(
a = a + 1;
디스플레이 a;
a = 5가 될 때까지 );
슬롯 게임a반복할 때마다 1씩 증가합니다. Ifa동일 5이면 종료 기준이 충족되고 루프가 중지됩니다. 이 예제는 슬롯 게임와 증분 모두 정수이므로 잘 작동합니다. 종료 조건의 오른쪽에 있는 엔터티가 정수가 아니거나 증분이 정수가 아닌 경우 반올림 오류를 피하기 위해 보다 안정적인 검사 공식을 권장합니다. 안정적인 종료 조건의 예는 다음과 같습니다.
슬롯 게임 a / 1 /;
반복(
a = a + 0.1;
디스플레이 a;
abs(a-5) < 1e-6 );
다음 예에서 종료 조건은 다음과 같습니다.참처음부터. 이 경우 본문의 문은반복문이 한 번 실행된 후 슬롯 게임가 종료됩니다. 따라서 최종 값은a5가 됩니다.
슬롯 게임 a / 4 /;
반복(
a = a + 1;
디스플레이 a;
>= 3 );
while 문의 패스 수는 명령줄 매개변수 또는 옵션을 사용하여 제한될 수 있습니다.포림. 명령줄 매개변수 및 옵션에 대한 자세한 내용은 섹션을 참조하세요.명령줄을 통해 옵션 지정및 장옵션 설명각각.
여기에 좀 더 복잡한 예가 있습니다. 갑반복문은 2차 함수가 0을 통과하는 간격을 좁히는 데 사용됩니다. 종종 그렇듯이,반복슬롯 게임는 또 다른 프로그래밍 흐름 제어 문입니다. 이 경우에는if진술.
슬롯 게임 최대 "현재 간격 상한" /10/
min "현재 간격의 하한" /-10/
루트 "함수가 0인 값"
function_value1 "최소값의 함수 값"
function_value2 "최대값의 함수값"
허용 오차 "루트에 대한 허용 오차" /0.00000001/
signswitch "부호 스위치가 발견되었음을 나타냅니다." /0/
inc "부호 스위치를 찾으려고 시도하는 증가분" ;
function_value1 = 6 - 5*min + sqr(min);
Inc = (최대 - 최소)/37;
루트 = 최소;
반복(
루트 = 루트 + inc;
function_value2 = 6 - 5*루트 + sqr(루트);
if(( 부호(함수_값1) <> 부호(함수_값2)
및 ABS(function_value1) > 0
그리고 abs(function_value2) > 허용 오차 ),
최대 = 루트;
사인스위치 = 1;
그렇지 않으면
if(abs(function_value2) > 허용오차,
함수_값1 = 함수_값2;
최소 = 루트;
);
);
(signswitch > 0) 또는 (root > max) )까지;
최소, 최대, function_value1, function_value2 표시;
의 결과디스플레이문은의 값을 보여줍니다.분은 1.892이고 값은최대은 2.432이고, 간격은 0.54로 좁아졌는데, 이는의 값보다 조금 작은 수치입니다.inc. 예상대로,함수_값1그리고함수_값2부호가 다르므로 이차 함수의 근이 실제로 구간에 있음을 확인합니다.
중단 선언문
그휴식문은 슬롯 게임 구조의 실행에 대한 추가 제어를 제공합니다. 즉,슬롯 게임문, 그while문, 그문용그리고문장 반복. 슬롯 게임 구조의 실행을 조기에 중단할 수 있습니다.
Break 문: 구문
다음 구문은휴식문은 다음과 같습니다:
휴식 [n];
키워드휴식이것은 break 문임을 나타냅니다. 종료됩니다.n가장 안쪽의 제어 구조.n은 선택사항이며 생략시 1로 설정됩니다.
가장 자주휴식문맥은 다음의 맥락에서 사용됩니다If 문또는달러 조건. GAMS의 다양한 형태의 논리적 조건에 대한 자세한 내용은 섹션을 참조하세요.논리적 조건그리고필터링 세트.
Break 문: 예
이것은 다음을 사용한 간단하고 인위적인 예입니다.휴식a를 종료하라는 명령문슬롯 게임진술:
i / i1*i10 / 설정;
슬롯 게임 cnt / 0 /;
루프(나,
break$sameas('i6',i);
cnt = cnt+1;
);
디스플레이 CNT;
그휴식문은 달러 조건과 함께 6번째 반복에서 슬롯 게임 본문의 실행을 종료합니다. 이는의 값을 보면 알 수 있습니다.cnt슬롯 게임 이후에는 5가 됩니다.
다음은 선택적 인수를 사용하는 좀 더 복잡한 예입니다.n한 번에 둘 이상의 슬롯 게임 구조를 종료하려면:
i / i1*i10 / 설정;
슬롯 게임 x, y,
cnt / 0 /;
for(x = 1 ~ 10,
와이 = 0;
동안(y < 10,
y = y+1;
루프(나,
break$sameas('i6',i) 2;
cnt = cnt+1;
);
);
);
디스플레이 CNT;
이 예에서는,cnt끝에는 50이 될 것입니다. 이전 예에서와 같이 가장 안쪽 슬롯 게임에서 5배 증가합니다.휴식문이 실행됩니다. 이번에는휴식인수와 함께 호출됩니다2, 이는 두 개의 가장 안쪽 제어 구조(즉,슬롯 게임그리고그동안)이 종료됩니다. 가장 바깥쪽 제어 구조(용)은 영향을 받지 않으므로 해당 본문이 10번 실행되어 슬롯 게임에 대해 총 50개의 증분이 발생합니다.cnt.
참고, 만약에휴식2 대신 인수 3을 사용하여 호출됩니다. 또한for슬롯 게임가 종료되므로cnt끝에는 5가 됩니다. 만일휴식2 대신 1(또는 추가 인수 없이)을 사용하여 호출됩니다. 가장 안쪽만 호출됩니다.슬롯 게임종료되므로cnt끝에는 500이 될 것입니다.
계속 진술
그계속문은 슬롯 게임 구조의 실행에 대한 추가 제어를 제공합니다. 즉,슬롯 게임 문, 그while문, 그문용그리고문장 반복. 본문의 나머지 문을 실행하지 않고도 가장 안쪽 슬롯 게임 구조의 끝으로 이동할 수 있습니다.
Continue 문: 구문
다음 구문은계속문은 다음과 같습니다:
계속;
키워드계속이것은 계속 문임을 나타냅니다. 가장 안쪽 제어 구조의 끝으로 점프합니다.
가장 자주계속문맥은 다음의 맥락에서 사용됩니다.If 문또는달러 조건. GAMS의 다양한 형태의 논리적 조건에 대한 자세한 내용은 섹션을 참조하세요.논리적 조건그리고필터링 세트.
Continue 문: 예
이것은 다음을 사용한 간단하고 인위적인 예입니다.계속a의 일부를 건너뛰는 명령문슬롯 게임본문:
i / i1*i10 / 설정;
슬롯 게임 cnt / 0 /;
루프(나,
계속$(mod(ord(i),2)=0);
cnt=cnt+1
);
디스플레이 CNT;
이 예에서는 매 2번째 반복마다슬롯 게임문을 건너뛰었습니다. 그러므로cnt끝에는 5가 됩니다슬롯 게임.
중단 선언문
그중단문은 다음을 종료하는 데 사용됩니다.실행프로그램의. 대부분의 경우 중단 문은 조건문의 맥락에서 사용됩니다. 아래에 예가 나와 있습니다. 또한 다음과 유사한 목록 파일에 텍스트나 식별자를 표시하는 데 사용될 수도 있습니다.표시문그러나 주로 실행 종료 이유를 제시하는 데 사용됩니다.
참고:중단문은 달러 제어 옵션과 구별됩니다.$중단종료하는 데 사용될 수 있습니다.편집프로그램의.
중단 명령문: 구문
ID 중단 | 인용된 텍스트 , ident | 인용된 텍스트;
키워드중단이것은 중단 문임을 나타냅니다.ID은를 나타냅니다.식별자. 식별자가 세트 또는 매개변수인 경우 도메인 없이 세트 또는 매개변수 자체의 이름만 지정됩니다. 식별자가 변수, 방정식 또는 모델인 경우 접미사가 와야 합니다.속성변수, 방정식, 모델을 표시할 수 있습니다. 전체 목록을 포함한 변수 및 방정식 속성에 대한 자세한 내용은 섹션을 참조하세요.변수 속성그리고수식 속성각각. 모델 속성에 대한 자세한 내용은 섹션을 참조하세요.모델 속성. 세트에도 속성이 있으며 접미사 표기법을 사용하여 표시될 수도 있다는 점을 기억하세요. 속성 설정에 대한 자세한 내용은 섹션을 참조하세요.속성 설정. 평소처럼,인용된 텍스트은 작은따옴표나 큰따옴표로 묶어야 합니다. 식별자와 텍스트는 순서에 관계없이 혼합 및 일치될 수 있으며 전체 명령문은 여러 줄에 걸쳐 계속될 수 있습니다.
중단 명령문은 실행 오류로 인해 실행이 종료되고 명령문의 정보가 표시됩니다.
확장 기능이 있는 변형도 있습니다.noError실행을 종료하고 정보를 표시하지만 실행 오류를 일으키지 않습니다. 구문은 다음과 같습니다.
abort.no오류 ID | 인용된 텍스트 , ident | 인용된 텍스트;
가장 자주중단문맥은 다음의 맥락에서 사용됩니다.If 문또는달러 조건. 구문은 다음과 같습니다.
if (logical_condition, 중단 ident | 인용 텍스트 , ident | 인용 텍스트; );
또는
abort$logical_condition ident | 인용된 텍스트 , ident | 인용된 텍스트;
GAMS의 다양한 형태의 논리적 조건에 대한 자세한 내용은 섹션을 참조하세요.논리적 조건그리고필터링 세트.
중단 명령문: 예
다음의 인위적인 예를 생각해 보십시오:
i / i1*i5 / 설정;
매개변수 p(i) / i1 1, i2 2, i3 3, i4 5, i5 8 /;
슬롯 게임(나,
(p(i) > 3이면 "3보다 큰 매개변수", p)를 중단합니다.
p(i) = p(i) + 2;
);
중단 명령문은 다음의 일부임을 참고하세요.If 문a의 일부입니다슬롯 게임문. 이 프로그램의 실행은 다음 표시 및 오류 메시지와 함께 종료됩니다.
---- 4 매개변수가 3보다 큽니다. ---- 4개 매개변수 p i1 3.000, i2 4.000, i3 5.000, i4 5.000, i5 8.000 **** 4행의 실행 오류: 실행이 중지되었습니다. '3보다 큰 매개변수'를 중단합니다.
다음 값을 관찰하세요.p('1'), p('2')그리고p('3')업데이트되었지만 값은p('4')그리고p('5')프로그램이 업데이트되기 전에 종료되었으므로 초기화 값과 같습니다.
확장인 경우.noError위의 예에서는 다음 줄이 목록 파일에 나타납니다.
---- 4 매개변수가 3보다 큽니다. ---- 4개 매개변수 p i1 3.000, i2 4.000, i3 5.000, i4 5.000, i5 8.000 **** **** 4행에서 실행이 중단되었습니다: abort.noError '매개변수가 3보다 큼' ****
프로그램 실행은 이전과 같이 중단되지만 이 경우에는 실행 오류가 없습니다.
if 문 대신 슬롯 게임에서 달러 조건을 사용할 수 있습니다:
i / i1*i5 / 설정;
매개변수 p(i) / i1 1, i2 2, i3 3, i4 5, i5 8 /;
슬롯 게임(나,
abort$(p(i) > 3) "3보다 큰 매개변수", p;
p(i) = p(i) + 2;
);
이 대체 공식이 위와 동일한 결과를 갖는 것을 관찰하십시오.