목차
소개
이 장은 GAMS에서 슬롯부 할당, 표현식 및 방정식이 만들어지는 방식을 다루고 있습니다.색인 작업이미 설명된 내용은 매우 강력하지만 어떤 종류의 예외도 허용할 필요가 있습니다. 예를 들어, 대형 트럭은 약한 교량으로 인해 특정 경로를 이용하지 못할 수도 있고, 경제의 일부 부문에서 수출 가능한 제품을 생산하지 못할 수도 있습니다. 이와 같은 예외는 달러 연산자와 결합된 논리적 슬롯으로 쉽게 모델링될 수 있습니다.'$', 이 장에서 소개된 GAMS의 매우 강력한 기능입니다.
이 장은 다음과 같이 구성되어 있습니다: 우리는 일반적인 형식을 소개합니다.달러 슬롯먼저 그 다음에는 다양한 유형에 초점을 맞추겠습니다논리적 슬롯. 다음으로 달러 슬롯을 사용하여 구축하는 방법에 대해 논의하겠습니다.슬롯부 할당, 슬롯부 색인 작업그리고슬롯 방정식. 우리는 어떤 경우에 슬롯이 다음을 사용하여 모델링될 수 있음을 보여줌으로써 장을 마무리할 것입니다.필터링 세트달러 연산자 대신. 다음과 같은 프로그래밍 흐름 제어 기능if성명, 그루프, 그그동안문장 및용문은 이 장에서 다루지 않습니다. 이 장에서 찾을 수 있습니다.프로그래밍 흐름 제어 기능.
달러 슬롯
달러 연산자는 GAMS의 가장 강력한 기능 중 하나입니다. 슬롯식의 일반 구문은 다음과 같습니다.
용어 $ 논리적_슬롯
여기,기간숫자, (인덱스된) 기호 및 복잡한 표현식일 수도 있습니다. 달러 연산자는 다음과 같이 읽을 수 있습니다.다음 슬롯 하에서다음논리_슬롯다음으로 평가됨참(또는 0이 아님).
다음의 간단한 슬롯을 고려하십시오. 여기서a그리고b스칼라입니다.
if (b > 1.5)이면 a = 2
이것은 다음과 같이 달러 연산자를 사용하여 GAMS로 작성할 수 있습니다.
a $ (b > 1.5) = 2 ;
참고하세요기간스칼라입니다a그리고논리적 슬롯은 표현식 \((b > 1.5)\)입니다. 슬롯이 만족되지 않으면 할당이 이루어지지 않습니다. 명확히 하기 위해 이 슬롯부 할당은 다음과 같이 읽을 수 있습니다. 'b가 1.5보다 크다면 a는 2와 같습니다.'.
논리적 슬롯은 다양한 형태를 취할 수 있으며, 다음 섹션에서 소개됩니다. 슬롯식은 할당, 색인 연산 및 방정식의 맥락에서 사용될 수 있습니다. 이러한 주제는 이 장의 후반부 섹션에서 다룹니다.
- 참고
- 달러 연산자와 함께 사용되는 논리 슬롯은 변수를 포함할 수 없습니다. 그러나변수 속성허용됩니다.
논리적 슬롯
논리적 슬롯은 다음 중 하나의 값으로 평가되는 특수 표현식입니다.참또는거짓. 논리 슬롯은 수치 표현과 수치 관계일 수 있으며 집합 멤버쉽을 참조할 수도 있고 두문자어를 포함할 수도 있습니다. 다음 하위 섹션에서는 왼쪽에 달러 연산자가 있는 간단한 슬롯부 할당의 맥락에서 이를 보여줍니다(섹션 비교)왼쪽에 달러).
이 섹션에서는 소개되는 개념을 설명하기 위해 많은 예를 사용합니다. 이 모든 예에서a그리고b스칼라입니다.s, t, u그리고v매개변수이며i그리고j세트입니다.
논리적 슬롯: 수치식
숫자 표현식은 논리 슬롯으로 사용될 수 있습니다. 결과가 0이면 논리 값으로 처리됩니다.거짓0이 아닌 결과는 논리값으로 처리됩니다.참. 다음 예는 이 점을 보여줍니다.
b $ (2*a - 4) = 7;
여기서 수식 \((2*a - 4)\)은 논리 슬롯입니다. 다음과 같은 경우 수치 표현식이 0입니다.a은 2이고, 그렇지 않으면 0이 아닙니다. 따라서 표현식의 논리값은 다음과 같습니다.거짓\(a=2\) 및참다른 모든 값의 경우a. 숫자 표현식이 다음과 같이 평가되는 경우에만 할당이 이루어집니다.참, 그렇지 않으면 할당이 이루어지지 않습니다.
- 주의
- 값확장된 범위 산술예를 들어
inf논리적 슬롯에서도 허용됩니다. 논리슬롯으로 사용된 수식의 결과가 이들 값 중 하나를 취하면 논리값은 다음과 같다.참, 예를 들어eps, 수치적으로는 0입니다.
그것을 관찰하세요함수논리적 슬롯에서도 허용됩니다. 0으로 평가되면 논리 슬롯은 다음과 같습니다.거짓, 그렇지 않으면참. 다음 예를 고려해보세요.
b $ cos(a) = 7;
할당은 코사인인 경우에만 이루어집니다.a0이 아닙니다.
논리 슬롯: 수치 관계 연산자
숫자 관계 연산자는 두 개의 숫자 표현식을 비교하고 논리값을 반환합니다. 완전성을 위해 모든 숫자 관계 연산자는 다음에 나열되어 있습니다.표 1.
표 1:수치 관계 연산자
다음 예를 고려해보세요.
b $ (a < 0) = 10;
b$(sqr(a) > a) = 12;
$ ( 합계(i, s(i)) > 0 ) = 7;
t(i) $ (a <> 0) = t(i) + 1;
첫 번째 줄에서 논리적 슬롯은 관계식 \((a < 0)\)입니다. 이 표현식이 다음과 같은 경우에만 할당이 이루어집니다.참, 즉, 스칼라인 경우a음수입니다. 두 번째 줄의 논리 슬롯은 좀 더 복잡합니다. 다음과 같이 평가됩니다.거짓만약 \(0 \leq a \leq 1\). 다른 모든 값의 경우a, 다음과 같이 평가됩니다.참. 따라서 모든 값에 대해 할당이 이루어집니다.a, 해당 값 제외a닫힌 간격 \([0, 1]\)에 있습니다. \(a = -3\)이면 첫 번째 줄의 논리 슬롯은 다음과 같습니다.참그래서b10이 됩니다. 또한 두 번째 줄의 논리 슬롯은참그래서b12로 변경됩니다. 세 번째 줄의 논리적 슬롯은 다음과 같이 평가됩니다.참매개변수의 모든 값의 합계인 경우s엄격히 긍정적입니다. 그런 다음a값 7이 할당됩니다. 마지막 줄의 할당은 여부에 따라 다릅니다.a은 0이 아닙니다. 만일a0이면 할당이 이루어지지 않습니다. 그렇지 않으면 매개변수의 모든 항목t업데이트되었습니다.
참고하세요약어논리적 슬롯을 구축하기 위해 관계 연산자와 함께 사용할 수도 있습니다. 단, 항등 연산자만=및 부등 연산자<>은 숫자 값이 없고 다른 연산자는 의미가 없기 때문에 약어의 맥락에서 허용됩니다. 예를 보려면 섹션을 참조하세요.약어 사용법.
논리 슬롯: 논리 연산자
GAMS는 두 개 이상의 논리 슬롯을 결합하여 복잡한 논리 표현식을 작성할 수 있는 표준 논리 연산자를 제공합니다. 예를 들어 여러 표현식이 필요한 경우참동시에 운영자와 연결될 수 있습니다.그리고. GAMS에서 사용할 수 있는 논리 연산자는 다음과 같습니다.표 2그리고표 3. 복잡한 논리적 슬롯을 구성하는 또 다른 방법은 중첩하는 것입니다. 자세한 내용은 하위 섹션을 참조하세요.중첩된 달러 슬롯아래.
표 2:논리 연산자
이 연산자의 논리값은 다음 진리표에 요약되어 있습니다.
x | y | x 아님 | x와 y | x 또는 y | x xor y | x 임프 y | x eqv y |
|---|---|---|---|---|---|---|---|
거짓 | 거짓 | 참 | 거짓 | 거짓 | 거짓 | 참 | 참 |
거짓 | 참 | 참 | 거짓 | 참 | 참 | 참 | 거짓 |
참 | 거짓 | 거짓 | 거짓 | 참 | 참 | 거짓 | 거짓 |
참 | 참 | 거짓 | 참 | 참 | 거짓 | 참 | 참 |
표 3:논리 연산자의 진리표
다음은 다소 인위적인 예입니다.
i / i1*i5 / 설정;
매개변수 s(i) / i1 3, i2 5, i4 8 /
t(i) / i1*i4 13 /
u(i) / i2 1 /
v(i) / i1 7, i3 2 /;
u(i) $ (s(i) 아님) = v(i);
u(i) $ (s(i) 및 u(i) 및 t(i)) = s(i);
u(i) $ (s(i) 또는 v(i) 또는 t(i)) = 4;
매개변수에 대한 세 가지 슬롯부 할당이 있음에 유의하세요.u. 첫 번째 할당에서 논리적 슬롯은 다음과 같습니다.(s(i) 아님). 이 슬롯은 다음의 모든 항목에 적용됩니다.s지정되지 않았으므로 기본적으로 0입니다.s('i3')그리고s('i5'). 그러므로u('i3')그리고u('i5')다음 값이 할당됨v('i3')그리고v('i5')각각. 의 값v('i3')은 2이고 값은v('i5')기본적으로 0입니다. 첫 번째 임무가 끝난 후 우리는u('i2')=1그리고u('i3')=2, 기타 모든 값u0입니다. 에 대한 논리적 슬롯이 실패했습니다.u('i2')따라서 그 값은 변경되지 않았습니다. 두 번째 할당의 논리 슬롯은 다음과 같습니다.참세트의 해당 라벨에 대해i매개변수에 0이 아닌 항목이 있는 경우s, u그리고t동시에. 이 슬롯은 다음 경우에만 적용됩니다.i2. 그러므로u('i2')=s('i2')=5및 기타 모든 값u변경되지 않은 상태로 유지되어 0이 아닌 값만 발생함u('i2')그리고u('i3'). 마지막 할당의 논리 슬롯은 다음과 같이 평가됩니다.참세트의 모든 라벨에 대해i매개변수에 0이 아닌 항목이 하나 이상 있는 경우s, v그리고t. 이는 다음을 제외한 모든 라벨에 적용됩니다.i5. 그러므로u('i5')0을 유지하고 다른 모든 값은u는 4로 변경됩니다. 이 예는 논리 연산자와 결합된 달러 연산자의 강력함을 보여줍니다. 훨씬 더 복잡한 논리적 슬롯도 가능합니다. 하위 섹션 참조혼합된 논리적 슬롯자세한 내용은 아래를 참조하세요.
논리적 슬롯: 멤버쉽 설정 및 기능 설정
숫자 및 관계식 외에도 집합 멤버쉽 및 집합 요소를 참조하는 함수가 논리적 슬롯으로 사용될 수 있습니다. 논리 슬롯으로 집합 멤버십에 대한 설명으로 다음 예를 고려하십시오.
i / i1*i5 / 설정
j(i) / i1*i3 / ;
매개변수 s(i) / i1 3, i2 5, i3 11, i4 8, i5 1 /
t(i);
t(i) $ j(i) = s(i) + 3;
세트에 주의하세요j세트의 하위 집합입니다i그리고 그 매개변수t선언되었지만 정의되지 않았습니다. 슬롯식t(i)$j(i)마지막 줄에서는 하위 집합의 구성원에 대한 할당을 제한합니다.j그들만이 슬롯을 만족하기 때문에j(i). 값은t('i4')그리고t('i5')변경되지 않은 상태로 유지됩니다. 이 경우 이는 0(기본값)을 의미합니다. 이러한 유형의 슬롯부 할당에 대한 대체 공식이 있습니다. 자세한 내용은 하위 섹션을 참조하세요.과제의 필터링 세트아래.
논리적 슬롯으로 집합 멤버십을 사용하는 것은 GAMS의 매우 강력한 기능입니다. 섹션을 참조하세요.슬롯 방정식더 많은 예시는 아래를 참조하세요.
논리적 슬롯에는 다음이 포함될 수 있습니다.사전 정의된 기호또는연산자집합의 요소 위치, 집합의 크기 또는 집합 요소 간의 비교 또는 텍스트 문자열에 따라 특정 값을 반환합니다.
| 사전 정의된 기호/연산자 | 설명 및 의견 |
|---|---|
sameAs(요소1,요소2)또는sameAs("텍스트",요소2)또는sameAs(요소1,"텍스트") | 사전 정의된 기호반환참if요소1동일함요소2또는요소1동일함텍스트및거짓그렇지 않으면. |
diag(요소1,요소2)또는diag("text",element2)또는diag(element1,"text") | 좋아요sameAs, 그러나에 대해 숫자 값 1을 반환합니다.참및 0 for거짓. |
카드(set_name) | 세트의 요소 수를 반환합니다. 이는 인용된 텍스트와 함께 호출될 수도 있으며 이 경우 해당 텍스트의 문자 수를 반환합니다. 자세한 내용은 섹션을 참조하세요.카드 운영자. |
ord(set_name) | 집합에 있는 요소의 상대적 위치를 반환합니다. 참고하세요ord사용될 수 있음만1차원적이고 정적인 순서 집합이 있습니다. 자세한 내용은 섹션을 참조하세요.Ord 연산자. |
표 4:미리 정의된 기호/세트를 참조하는 연산자
예: 두 세트의 동일한 요소 계산
다음 예에는 두 개의 도시 세트가 있으며 그 중 몇 개가 두 세트에 포함되어 있는지 알고 싶습니다.
Set i / 베이징, 캘커타, 뭄바이, 시드니, 요하네스버그, 카이로 /;
세트 j / 로마, 파리, 보스턴, 카이로, 뮌헨, 캘커타, 바르셀로나 /;
스칼라 b;
b = 합계((i,j)$sameAs(i,j),1);
할당문에서 우리는합두 세트 모두에 대해 사전 정의된 기호를 사용합니다sameAs색인 작업의 도메인을 해당 라벨 조합으로 제한(i,j)어디에서sameAs다음으로 평가됨참. 따라서 동일한 요소만 계산됩니다.
이 예에서는 사전 정의된 기호에 유의하세요.디아그동일한 결과로 사용되었을 수도 있습니다.
예: 컴파일 시간에 선언되지 않은 참조 레이블(UEL)
컴파일 시 세트에 존재하지 않는 라벨을 참조할 때 일반적인 문제가 발생하여 도메인 오류가 발생합니다. GAMS에서는 특별한 조치를 취하지 않는 한 컴파일 타임에 모든 라벨을 알려야 합니다. 다음은 세 가지 접근 방식입니다.
'더미' 세트 사용
한 가지 방법은 별도의 세트로 라벨을 선언하여 컴파일러가 이를 미리 인식하도록 하는 것입니다. 예를 들면:
f / f1*f5 / 설정 더미 / 물 /; 매개변수 somePar(f) /#f 0/; somePar(f)$sameas(f,"물") = 1; $onmulti f / f1*f5, 물 / 설정; somePar 표시;여기서 '물'은 초기에 더미 세트에 배치되어 할당 시 도메인 오류를 방지합니다. 나중에 재정의할 때
f'물'을 포함하려면 데이터 할당이 이미 유효합니다. 표시 문은 목록 파일에 다음 줄을 생성합니다.---- 7 매개변수 somePar 물 1.000
슬롯부 라벨 존재 여부 확인
또 다른 접근 방식은 슬롯식을 사용하는 것입니다.$if uelExist, 라벨이 발견된 경우에만 명령문을 컴파일합니다.
f / f1*f5 / 설정; 매개변수 somePar(f) /#f 0/; $if uelExist water somePar(f)$sameas(f,'water') = 1; $onmulti f / f1*f5, 물 / 설정; somePar 표시;'물'이 존재하지 않는 경우
f컴파일 시 GAMS는 할당문을 처리하지 않으므로 오류가 발생하지 않습니다.표시문에 다음이 표시됩니다:
---- 8 매개변수 somePar ( 전체 0.000 )오류를 경고로 전환
$on경고기본적으로 선언된 도메인 외부의 라벨을 참조하면 도메인 오류가 발생합니다. 와 함께$on경고, 이러한 도메인 오류는 경고가 되며 당시 도메인 외부에 있더라도 라벨이 허용되고 해당 데이터가 저장됩니다.
f / f1*f5 / 설정; 매개변수 somePar(f) /#f 0/; $onWarning somePar(f)$sameas(f,'water') = 1; $off경고 $onmulti f / f1*f5, 물 / 설정; somePar 표시;목록 파일을 보면 다음 정보가 제공됩니다:
1 세트 f / f1*f5 /; 2 매개변수 somePar(f) /#f 0/; 3 5 somePar(f)$sameas(f,'water') = 1; **** $116 **** 116 라벨을 알 수 없습니다. 7 9 세트 f / f1*f5, 물 /; 10 디스플레이 somePar; **** 오류 0개 경고 1개그러나 표시문은 다음과 같이 표시됩니다:
-- 10 매개변수 somePar 물 1.000
도메인 오류가 경고로 다운그레이드될 때 '물'에 대한 데이터가 유지되므로 일단 재정의하면
f'물'을 포함하려면 이전에 할당된 값이 완전히 인식됩니다. 이 접근 방식에는 더미 세트나 슬롯 확인이 필요하지 않지만 엄격한 도메인 확인은 억제되므로 신중하게 사용하세요.
예: ord와 카드를 사용하여 첫 번째와 마지막 요소에 대한 변수 수정
운영자ord그리고카드은(는) 첫 번째 또는 마지막 요소를 골라내는 데 자주 사용됩니다.세트 주문. 예를 들어, 집합의 첫 번째 요소와 마지막 요소에 대한 변수를 수정하고 싶을 수 있습니다.
x.fx(i) $ (ord(i) = 1) = 3;
x.fx(i) $ (ord(i) = 카드(i)) = 7;
첫 번째 할당에서 변수x집합의 첫 번째 요소에 대해 고정됨i그리고 두 번째 과제에서x의 마지막 요소에 대해 고정됨i.
- 참고
- 위 공식의 대안으로 다음을 사용할 수도 있습니다.속성 설정
첫 번째그리고마지막동일한 결과를 얻으려면:x.fx(i) $ (i.first) = 3; x.fx(i) $ (i.last) = 7;
논리적 슬롯의 수치값
우리는 논리 슬롯이 숫자 표현식, 관계 연산자를 사용한 표현식, 논리 연산자를 사용한 복잡한 표현식, 집합 구성원 및 집합 함수의 형태를 취할 수 있음을 살펴보았습니다. 그러나 GAMS에는 부울 데이터 유형이 없습니다.
- 주의
- GAMS는 주장이 다음과 같은 경우 관계 연산의 결과가 0이라는 규칙을 따릅니다.
거짓, 그렇다면 1참.
다음 예를 예시로 생각해보세요.
x = (1 < 2) + (2 < 3);
할당 오른쪽에 있는 표현식은 괄호 안의 두 논리 슬롯이 모두 일치하므로 2로 평가됩니다.참따라서 값을 1로 가정합니다. 이는 아래 할당과 다르다는 점에 유의하세요.
x = (1 < 2) 또는 (2 < 3)이 할당은 1로 평가됩니다. 왜냐하면 왼쪽과 오른쪽에 있는 두 명령문 때문입니다.또는아르참그러므로 전체 표현은참.
혼합된 논리적 슬롯
위의 하위 섹션에 소개된 구성 요소를 결합하여 더 복잡한 논리적 슬롯을 생성할 수 있습니다. 여기에는 다음이 포함될 수 있습니다.표준 산술 연산, 수치 관계 연산그리고논리 연산. 모든 연산, 해당 기호 및 우선 순위는 다음과 같습니다.표 5. 1은 가장 높은 우선순위를 나타내고 7은 가장 낮은 우선순위를 나타냅니다. 평소와 같이 기본 우선순위는 괄호가 없는 경우에만 유지되며 동일한 수준의 연산자(기호)는 왼쪽에서 오른쪽으로 평가됩니다.
| 작업 유형 | 작동 | 운영자 | 우선순위 |
|---|---|---|---|
| 표준 산술 연산 | 지수 | ** | 1 |
| 표준 산술 연산 | 곱셈, 나눗셈 | *, / | 2 |
| 표준 산술 연산 | 단항 연산자: 플러스, 마이너스 | +, - | 3 |
| 표준 산술 연산 | 이항 연산자: 덧셈, 뺄셈 | +, - | 3 |
| 수치 관계 연산 | 모두 | <, <=, =, <>, >=, > | 4 |
| 논리 연산 | 부정 | 아님 | 5 |
| 논리 연산 | 논리적 결합 | 그리고 | 6 |
| 논리 연산 | 기타 모든 논리 연산 | 또는, xor, imp, eqv | 7 |
표 5:GAMS의 연산자 우선순위에 대한 완전한 계층 구조
- 참고
- 연산자의 우선순위에 의존하기보다는 괄호를 사용하는 것이 좋습니다. 괄호는 오류를 방지하고 의도를 명확하게 합니다.
다음 예를 고려해보세요:
x - 5*y 및 z - 5
(x - (5*y)) 및 (z-5)
이 두 가지 복잡한 논리적 슬롯은 동일합니다. 그러나 괄호를 사용하면 두 번째 표현을 더 쉽게 이해할 수 있습니다.
복잡한 논리 슬롯의 몇 가지 간단한 예, 숫자 값 및 논리 값은 다음에 나와 있습니다.표 6.
| 논리적 슬롯 | 수치값 | 논리적 값 |
|---|---|---|
(1 < 2) + (3 < 4) | 2 | 참 |
(2 < 1) 및 (3 < 4) | 0 | 거짓 |
(4*5 - 3) + (10/8) | 18.25 | 참 |
(4*5 - 3) 또는 (10 - 8) | 1 | 참 |
(4와 5) + (2*3 <= 6) | 2 | 참 |
(4와 0) + (2*3 < 6) | 0 | 거짓 |
표 6:복잡한 논리적 슬롯의 예
중첩된 달러 슬롯
복잡한 논리적 슬롯을 모델링하는 또 다른 방법은 중첩하는 것입니다. 구문은 다음과 같습니다.
용어 $ (logical_condition1$(logical_condition2$(...)))
중첩된 달러 슬롯에서는 달러 연산자 뒤의 모든 후속 표현식을 괄호로 묶어야 합니다. 중첩 표현식은 논리 연산자를 사용하는 다음 슬롯식과 동일합니다.그리고중첩 대신:
용어 $(논리_슬롯1 및 논리_슬롯2 및 ...)
다음 예를 고려해보세요. 참고하세요i, j(i)그리고k(i)세트이고유(i)그리고v(i)매개변수입니다.
u(i) $ (j(i)$k(i)) = v(i) ;
할당은 세트의 해당 구성원에게만 이루어집니다.i두 세트의 구성원임j그리고k. 달러 슬롯에서 괄호의 위치를 확인하세요. 위의 할당문은 다음과 같은 방법으로 다시 작성할 수 있습니다.
u(i) $ (j(i) 및 k(i)) = v(i) ;
- 참고
- 논리적 사용을 권장합니다.
그리고연산자 대신 달러 연산자를 사용합니다. 이 공식이 읽기 쉽기 때문입니다.
슬롯부 할당
슬롯부 할당은 왼쪽이나 오른쪽에 달러 슬롯이 있는 할당문입니다. 지금까지 대부분의 예는 왼쪽에 달러 연산자가 있는 슬롯부 할당이었습니다.
- 주의
- 달러 슬롯의 효과는 그것이 할당의 어느 쪽에 위치하느냐에 따라 상당히 다릅니다.
다음 두 하위 섹션은 과제의 각 측면에서 달러 슬롯의 사용을 설명합니다. 대부분의 경우 과제를 설명하기 위해 두 가지 형태의 달러 슬롯 중 하나를 사용하는 것이 가능할 수 있습니다. 더 명확한 공식을 선택하는 것이 좋습니다.
할당문의 논리적 슬롯이 집합 멤버십을 참조하는 경우 특정 슬롯에서는 달러 연산자를 사용하지 않고 제한이 표현될 수 있습니다. 자세한 내용은 섹션을 참조하세요.과제의 필터링 세트아래.
왼쪽에 달러
달러 슬롯이 할당의 왼쪽에 있으면 논리적 슬롯이 충족되는 경우에만 할당이 이루어집니다. 논리적 슬롯이 충족되지 않으면 할당이 이루어지지 않으며 왼쪽 매개변수의 이전 내용은 변경되지 않고 그대로 유지됩니다. 할당의 왼쪽에 있는 매개변수가 이전에 초기화되지 않았거나 값이 할당되지 않은 경우 할당이 억제된 모든 레이블에 0이 사용됩니다.
다음 예를 고려해보세요.[체너리]. 매개변수에 유의하세요.시그이미 모델에 정의되어 있습니다.
rho(i) $ (sig(i) <> 0) = (1./sig(i)) - 1. ;
이 과제에서로(i)가 계산되고 왼쪽의 달러 슬롯은 0으로 나누는 것을 방지합니다. 매개변수와 관련된 값이 있는 경우시그0으로 판명되고 할당이 이루어지지 않았으며 이전 값로(i)남아있습니다. 공교롭게도,로(i)이전에 초기화되지 않았으므로 이에 대한 모든 라벨은sig(i)0이면 값이 0이 됩니다.
이제 0이 아닌 값이 의미하는 규칙을 기억해 보세요.참0은 의미함거짓. 따라서 위의 과제는 다음과 같이 작성될 수 있습니다.
rho(i) $ sig(i) = (1./sig(i)) - 1. ;
다음 예에서i세트이고s그리고t매개변수입니다.
s(i) $t(i) = t(i);
s(i) $ ((t(i)-1) > 0) = t(i)**0.5;
매개변수 값이 다음과 같은 경우 첫 번째 할당이 억제된다는 점에 유의하세요.t0과 같습니다. 매개변수 값에 대한 두 번째 할당은 억제됩니다.t1보다 작거나 같습니다.
- 참고
- 마지막 두 예제 중 첫 번째는 할당의 왼쪽에 있는 달러와 오른쪽에 있는 표현식에 사용된 논리적 슬롯이 실제로 동일하다는 점에서 특별합니다. 이를 통해 결합된를 사용하여 더 짧은 표기법을 사용할 수 있습니다.
$=과제. 해당 할당은 다음 할당과 동일합니다(희소 할당):s(i) $= t(i);
희소 할당
희소 할당은 왼쪽에 값을 할당합니다=오른쪽이 0이 아닌 경우에만 서명하세요. 이 동작은 다음을 사용하여 트리거됩니다.$=다음 예와 같이 표기합니다.
i /a,b,c/ 설정
매개변수 d1(i) "초기 데이터" /a 1, b 1, c 1/
d2(i) "d1을 덮어쓰는 데 사용할 데이터" /a 0, b -2 /
d3(i) "빈 데이터 매개변수";
* d3을 d1로 초기화
d3(i) = d1(i);
* d2의 0이 아닌 값으로 d3을 덮어쓰려면 왼쪽에 있는 달러를 사용하세요.
d3(i)$d2(i) = d2(i);
* 결과: d3('a')=1; d3('b')=-2; d3('c')=1;
* d3을 d1로 다시 초기화
d3(i) = d1(i);
* d2의 0이 아닌 값으로 d3을 덮어쓰려면 희소 할당을 사용하세요.
d3(i) $= d2(i);
* 결과: d3('a')=1; d3('b')=-2; d3('c')=1;
위의 최종 할당에서 매개변수의 값에 유의하세요.d3(i)매개변수의 값으로 대체됨d2(i)다음 항목이 있는 경우에만d2(i)은 0이 아니며 다른 값은 그대로 유지됩니다. 두 과제 모두 동일합니다.
오른쪽에 달러
달러 슬롯이 할당문의 오른쪽에 있으면 할당은 다음과 같습니다항상만들어집니다. 논리 슬롯이 만족되지 않는 경우 0의 값이 할당됩니다.
위에서 우리는 다음과 같은 간단한 슬롯부 할당을 했습니다:
a $ (b > 1.5) = 2;
이제 달러 슬롯을 오른쪽으로 이동합니다:
a = 2 $ (b > 1.5) ;
이것은 다음과 같습니다:
if (b > 1.5) then (a = 2), else (a = 0)
참고하세요.if-then-else구조 유형이 암시되어 있지만그밖에작업은 미리 정의되어 있으며 결코 명시적이지 않습니다. 그만큼그밖에다음 공식으로 명시적으로 만들 수 있습니다:
a = 2 $ (b > 1.5) + 0 $ (b <= 1.5) ;
이 기능의 사용은 다음과 같은 경우에 더욱 분명해집니다.그밖에슬롯을 명시적으로 지정해야 합니다. 비료 모델을 적용한 다음 예를 생각해 보세요. [FERTD]. 세트i은 식물 세트이며 계산 중입니다.뮈르(i), 수입 원자재 운송 비용. 어떤 경우에는 공장이 강 옆에 있지 않고 별도의 비용을 합산해야 하기 때문에 바지선 여행 후 도로 여행이 이어져야 합니다. 과제는 다음과 같습니다:
mur(i) = (1.0 +. 0030*ied(i,'바지')) $ ied(i,'바지')
+ (0.5 + .0144*ied(i,'road' )) $ ied(i,'road' );
이것은 거리 테이블의 항목이 다음을 의미합니다.ied이 0이 아닌 경우 해당 링크를 사용한 배송 비용이 총 비용에 추가됩니다. 거리 입력이 없으면 비용에 대한 기여가 없습니다. 아마도 해당 모드를 사용하지 않기 때문일 것입니다.
오른쪽에 달러 연산자가 있는 슬롯부 할당에 대한 또 다른 예를 고려하십시오:
b = sum(i,t(i)) $ (a > 0) + 4;
여기a그리고b스칼라입니다.i세트이고t은 매개변수입니다. 스칼라인 경우a양수, 스칼라b매개변수의 모든 값의 합계가 할당됩니다.t더하기 4. 만약에a은 0 또는 음수입니다.b단지 4가 됩니다.합슬롯이 충족되는 경우에만 계산되므로 잠재적으로 프로그램이 더 빨라집니다.
슬롯부 색인 작업
우리는 할당의 예외가 달러 슬롯으로 어떻게 모델링되는지 살펴보았습니다. 달러 슬롯은 다음에도 사용됩니다.인덱싱된 작업, 여기서 그들은 작업 영역을 제어합니다. 이는 개념적으로 다음을 사용한 슬롯부 할당과 유사합니다.왼쪽에 달러.
다음 예를 고려해보세요.[GTM], 상호 연관된 가스 시장을 위한 가스 거래 모델입니다. 여기 세트i공급 지역 및 매개변수를 포함합니다supc모델 공급 능력. 스칼라tsupc다음 명령문으로 계산됩니다.
tsupc = sum(i $ (supc(i) <> inf), supc(i)) ;
이 할당은 합계를 다음으로 제한합니다.유한매개변수 값supc.
인덱싱된 작업에서 논리적 슬롯은 종종 집합입니다. 이 세트는슬롯부 세트및 할당은 슬롯 세트의 요소인 레이블에 대해서만 이루어집니다. 이 개념은 다음에서 중요한 역할을 합니다.동적 세트.
다차원 세트는 섹션에 소개되어 있습니다.다차원 세트. 여기에 사용된 예에서는 국가와 항구 간의 매핑을 정의하기 위해 2차원 세트가 사용되었습니다. 다차원 집합의 또 다른 일반적인 예는 주와 지역 간의 관계를 정의하는 집합 간 매핑입니다. 이는 주에서 지역 수준으로 데이터를 집계하는 데 유용합니다. 다음 예를 고려해보세요.
r "지역" 설정 / 북쪽, 남쪽 /
'주' / 플로리다, 텍사스, 버몬트, 메인 /
corr(r,s) / north.(버몬트,메인)
남쪽.(플로리다,텍사스) /;
매개변수 y(r) "지역별 소득"
소득(들) "각 주의 소득"
/ 플로리다 4.5, 버몬트 4.2
텍사스 6.4, 메인 4.1 / ;
세트corr주를 해당 지역, 매개변수에 연결합니다.수입은 각 주의 수입입니다. 매개변수y다음 할당문으로 계산됩니다.
y(r) = 합계(s $ corr(r,s), 소득(들)) ;
슬롯부 세트corr(r,s)합산 영역을 제한합니다: 각 지역에 대해r집합에 대한 합계s라벨 조합으로 제한됩니다.(r,s)집합의 요소입니다corr(r,s). 개념적으로 이는 부울과 유사합니다.값참또는 산술 값0이 아님. 효과는 다음의 기여만 있다는 것입니다.버몬트그리고메인다음의 총계에 포함됩니다.북쪽및남쪽다음에서 얻은 수입의 합입니다.텍사스그리고플로리다.
위의 요약은 다음과 같이 작성할 수도 있습니다.
y(r) = 합계(들,소득(들) $ corr(r,s));
이 공식에서는 매개변수수입슬롯부 세트에 의해 제어됨corr색인 대신s. 두 공식 모두 동일한 결과를 산출하지만 두 번째 대안은 읽기가 더 어렵습니다.
다음 예에서 오른쪽의 논리적 슬롯은 색인 작업의 맥락에서 나타나지만 색인을 참조하지 않습니다. 따라서 a와 유사하게 처리됩니다.오른쪽에 달러논리적 슬롯. 참고하세요a그리고b스칼라입니다.i세트이고s은 매개변수입니다.
b = 합계(i $ a, s(i));
여기 스칼라b매개변수 값의 합계가 할당됩니다.s만약a0이 아닙니다. 그렇지 않으면b에는 값 0이 할당됩니다. 다음 대체 공식은 일반적으로 위의 할당보다 더 빠릅니다.
b = 합계(i, s(i)) $a;
인덱싱된 작업의 맥락에서 논리적 슬롯이 집합 멤버십을 참조하는 경우 특정 슬롯에서는 달러 연산자를 사용하지 않고 제한이 표현될 수 있습니다. 자세한 내용은 섹션을 참조하세요.인덱싱된 작업에서 인덱스 제어 필터링아래.
슬롯 방정식
달러 연산자는 방정식의 예외 처리에도 사용됩니다. 다음 두 하위 섹션에서는 방정식의 맥락에서 달러 연산자의 두 가지 주요 용도, 즉 방정식 본문과 정의 영역에 대해 논의합니다.
방정식 대수학의 달러 연산자
방정식의 대수 공식에서 달러 연산자는 섹션에 제시된 대로 할당 오른쪽의 달러 컨트롤과 유사합니다.오른쪽에 달러. "권리"가 다음의 권리를 의미한다고 가정합니다.'..'그렇다면 비유는 훨씬 더 가깝습니다. 과제의 맥락에서와 마찬가지로, anif-else작업이 암시됩니다. 생성된 제약 슬롯 중 일부에서 정의의 일부를 제외하는 데 사용됩니다.
프로덕션 모델에서 조정된 다음 예를 고려하십시오.[체너리].
"섹터" 설정 / 경량 산업, 식품+농업, 중공업, 서비스 /
t(i) "교역품" / 경공업, 식품+농업, 중공업 /;
변수 x(i) "출력량"
y(i) "최종 소비"
e(i) "수출량"
m(i) "수입량";
방정식 mb(i) "물질 수지";
mb(i).. x(i) =g= y(i) + (e(i) - m(i)) $ t(i) ;
마지막 줄의 방정식 정의에서 용어(e(i) - m(i))방정식 오른쪽에 해당 집합의 요소에 대해서만 추가됩니다.i역시 하위 집합에 속함t(i), 따라서 요소서비스제외됩니다.
또한 슬롯부 색인 연산은 방정식 정의의 표현식에 포함될 수도 있습니다. 가스 무역 모델의 공급 수지 방정식[GTM]예시입니다. 참고로 세트i공급 지역, 세트를 포함합니다j수요 지역 및 2차원 집합을 포함합니다.ij은 실행 가능한 링크 세트입니다. 변수x천연가스의 출하량과 변수를 나타냄s지역 공급을 나타냅니다.
sb(i).. sum(j $ ij(i,j), x(i,j)) =l= s(i) ;
이전에 본 할당 예와 유사, 슬롯부 세트ij(i,j)합산 영역을 제한합니다: 각 공급 지역에 대해i수요 지역에 대한 합계j라벨 조합으로 제한됩니다.(i,j)가능한 링크 세트의 요소입니다ij(i,j).
정의 영역에 대한 달러 통제
특정 슬롯이 충족되는 경우에만 제약 슬롯이 모델에 포함되어야 하는 경우 방정식 정의 영역의 달러 슬롯을 사용하여 이 제한을 모델링할 수 있습니다. 이러한 달러 슬롯은 다음과 유사합니다.과제 왼쪽에 달러 컨트롤. "왼쪽"이 기호의 왼쪽을 의미한다고 가정합니다.'..'그러면 비유가 훨씬 더 가깝습니다.
- 참고
- 방정식 정의 영역에 대한 달러 통제는 생성된 제약 슬롯의 수를 정의 세트의 영역에 의해 암시된 수보다 적게 제한합니다.
안데스 비료 모델에서 적용한 다음 예를 고려하십시오.[ANDEAN]:
gple(w,wp,te) $ ple(w,wp).. yw(w,te) - yw(wp,te) =l= dpack;
여기w, wp그리고테세트입니다,플는 2차원 매개변수입니다.yw은 변수이고dpack는 스칼라입니다. 달러 슬롯은 방정식 도메인의 처음 두 인덱스를 2차원 매개변수에 0이 아닌 항목이 있는 레이블 조합으로 제한합니다.플.
때때로 방정식의 원하는 제한은 대수학의 슬롯이나 정의 영역의 슬롯을 통해 어느 쪽이든 달성될 수 있습니다. 다음 두 줄을 비교해 보세요. 여기서eq1그리고eq2방정식입니다.i그리고j세트입니다,b는 스칼라입니다.s은 매개변수이고x은 2차원 변수입니다.
eq1(i) $ b.. sum(j, x(i,j)) =g= -s(i);
eq2(i).. sum(j, x(i,j)) $ b =g= -s(i) $ b;
첫 번째 줄에서 달러 슬롯은 정의 영역에 있고, 두 번째 줄에서 달러 슬롯은 방정식의 대수적 공식에 있습니다. 만일b0이 아닙니다. 생성된 방정식eq1그리고eq2동일합니다. 그러나 만일b0, 방정식 없음eq1생성되지만 각각에 대해i우리는 사소한 방정식을 볼 것입니다eq2형태0 =g= 0;.
방정식 정의 영역의 논리적 슬롯이 집합 멤버십을 참조하는 경우 특정 슬롯에서는 달러 연산자를 사용하지 않고 제한이 표현될 수 있습니다. 자세한 내용은 섹션을 참조하세요.정의 영역 필터링아래.
필터링 세트
논리적 슬롯이 집합 멤버십을 참조하는 경우 달러 슬롯으로 모델링된 제한이 때때로 달성될 수 있습니다없이달러 연산자. 다음 설명을 고려하세요. 여기서i그리고j(i)세트이고u그리고s매개변수입니다:
u(i) $ j(i) = s(i) ;
할당은 집합의 해당 요소에 대해서만 수행된다는 점에 유의하세요.i하위 집합의 요소이기도 함j. 이 슬롯부 할당은 더 짧은 방식으로 다시 작성될 수 있습니다.
u(j) = s(j) ;
이 명령문에서 할당은 하위 집합을 사용하여 달러 연산자 없이 슬롯을 통해 필터링되었습니다.j매개변수의 도메인으로u그리고s. 이 공식은 더 명확하고 이해하기 쉽습니다. 이는 다차원 집합(튜플)의 맥락에서 특히 유용하며 다음과 같이 사용될 수 있습니다.과제, 인덱싱된 작업그리고정의 영역방정식.
과제의 필터링 세트
가상의 택배 서비스를 위해 지역 수거 장소와 지역 운송 허브 사이의 운송 비용을 계산한다고 가정해 보겠습니다. 우리는 수집 장소와 운송 허브에 대한 집합과 수집 장소가 해당 허브와 일치하는 2차원 집합을 정의합니다.
설정 "지역 수집 사이트" / 마이애미, 보스턴, 시카고, 휴스턴, 피닉스 /
j "지역 교통 허브" / 뉴욕, 디트로이트, 로스앤젤레스, 애틀랜타 / ;
r(i,j) "지역 수거장별 지역 교통 허브" 설정 /
보스턴.뉴욕
마이애미 애틀랜타
휴스턴 애틀랜타
시카고.디트로이트
피닉스 .losangeles / ;
테이블 거리(i,j) "거리(마일)"
뉴욕 디트로이트 로스앤젤레스 애틀랜타
마이애미 1327 1387 2737 665
보스턴 216 699 3052 1068
시카고 843 275 2095 695
휴스턴 1636 1337 1553 814
피닉스 2459 1977 398 1810;
매개변수 요인 "단위 마일당 비용 추정"
shipcost(i,j) "지역 수거 장소에서 지역 허브까지 단위당 소포를 운송하는 비용" ;
인자 = 0.009 ;
배송 비용(i,j) $ r(i,j) = 요인*거리(i,j) ;
수거 장소와 운송 허브 사이의 거리는 표에 나와 있습니다. 마지막 줄은 매개변수에 대한 슬롯부 할당입니다.배송비. 이 할당은 라벨 조합인 경우에만 이루어집니다.(i,j)집합의 요소입니다r. 각 인스턴스에서 인덱스는i그리고j함께 나타납니다. 따라서 과제는 다음과 같이 간단하게 작성할 수 있습니다.
배송비(r) = 인자*거리(r) ;
할당은 집합의 구성원으로 명시적으로 제한되어 있음을 참고하십시오.r; 달러 연산자는 필요하지 않습니다. 인덱스가 다음과 같은 경우에 주의하세요.i또는j할당마다 별도로 나타나므로 위의 단순화를 수행할 수 없습니다. 예를 들어 배송비가 매개변수에만 의존하지 않는 경우를 생각해 보세요.인자그리고 수집 장소와 지역 허브 사이의 거리뿐 아니라 지역 허브의 혼잡도에 관한 정보입니다. 새로운 매개변수를 소개합니다.혼잡팩각 지역 허브의 혼잡을 모델링하고 세트에 대해서만 색인이 생성됩니다.j:
매개변수 congestfac(j) "혼잡 요인" /
뉴욕 1.5
디트로이트 0.7
로스앤젤레스 1.2
애틀랜타 0.9/ ;
새로운 배송 비용은 다음과 같이 계산됩니다:
배송비(i,j) $ r(i,j) = 요인*혼잡fac(j)*거리(i,j) ;
이 슬롯부 할당에 유의하세요할 수 없습니다다음과 같이 재구성됩니다:
배송비(r) = 요인*혼잡fac(j)*거리(r) ;
색인 위의 표현에서j오른쪽에는 나타나지만 왼쪽에는 나타나지 않습니다. GAMS는 이 할당을 오류로 표시합니다. 그러나 다음 표현은 작동합니다.
배송 비용(r(i,j)) = 요인*혼잡fac(j)*거리(r) ;
이 공식에서는 집합r은 집합의 튜플로 명시적으로 표시됩니다.i그리고j. 세트j그러면 오른쪽에 나타날 수 있습니다.
인덱싱된 작업에서 인덱스 제어 필터링
마찬가지로, 인덱싱된 작업의 제어 인덱스는 다음을 통해 필터링될 수 있습니다.슬롯부 세트달러 연산자를 사용하지 않고. 마지막 하위 섹션의 배송비 예시를 계속 진행합니다. 총 배송 비용은 다음 방정식을 통해 구됩니다. 명확성을 위해 변수 정의도 포함합니다.
변수 배송됨(i,j), totcost ;
방정식 비용equ ;
costequ.. totcost =e= sum((i,j) $ r(i,j), shipcost(i,j)*shipped(i,j));
여기 변수배송됨현지 집하장에서 배송된 소포의 개수i지역 교통 허브로j및 변수totcost는 모든 배송의 총 비용입니다. 방정식의 합계는 집합의 요소인 레이블 조합으로 제한됩니다.r. 또는 위의 방정식은 다음과 같이 작성할 수 있습니다.
costequ..totcost =e= sum(r, shipcost(r)*shipped(r));
이 공식에서 합계는 집합의 요소에 대해서만 명시적으로 수행됩니다.r, 달러 슬롯은 필요하지 않습니다. 다만, 수식의 표현에 지수에만 의존하는 항이 포함된 경우j, 그러면 다르게 재구성해야 합니다. 방정식에 혼잡 요인도 포함되어 있다고 가정합니다.혼잡팩다음에만 색인이 생성됩니다j:
비용.. totcost =e= sum((i,j) $ r(i,j), Factor*congestfac(j)*distance(i,j)*shipped(i,j));
이 경우 방정식은 다음과 같은 방법으로 단순화되어야 합니다:
비용.. totcost =e= sum(r(i,j), Factor*congestfac(j)*distance(r)*shipped(r));
이전과 마찬가지로 색인 작업의 도메인합계세트입니다r. 하지만 이번에는r명시적으로 이름을 지정해야 매개변수가혼잡팩세트에 대해서만 색인이 생성됩니다j은 색인 작업 범위 내에서 허용됩니다. 이 추론은 위 하위 섹션의 할당에서 필터링 세트에 대한 추론과 유사합니다.
정의 영역 필터링
하위 섹션에 도입한 필터링 세트 규칙과제의 필터링 세트그리고인덱싱된 작업에서 인덱스 제어 필터링또한 방정식 영역의 맥락에서 적용됩니다. 위에 소개된 소포 운송 예시를 계속 진행하고 이진 변수를 추가합니다.빈, 매개변수빅엠및 방정식연결모델에게. 그것을 기억해내세요배송됨(i,j)은 변수이고r(i,j)세트입니다.
매개변수 bigM(i,j) ;
이진변수 bin(i,j) ;
방정식 connect(i,j) ;
연결(i,j) $ r(i,j).. 배송됨(i,j) =l= bigM(i,j)*bin(i,j) ;
달러 슬롯은 방정식 정의 영역을 제한합니다.연결세트의 해당 라벨 조합에i그리고j이것은 집합의 요소입니다r. 방정식은 연속 변수와 관련이 있습니다.배송됨(i,j)이진 변수에빈(i,j). 방정식의 각 도메인은 인덱스 쌍입니다.(i,j). 따라서 방정식은 다음과 같이 단순화될 수 있습니다.
연결(r).. 배송됨(r) =l= bigM(r)*bin(r) ;
이 공식에서 방정식의 영역은 집합의 구성원으로 명시적으로 제한됩니다.r, 달러 슬롯을 사용하지 않습니다. 방정식의 오른쪽에 색인이 생성된 용어가 포함된 경우에 유의하세요.i또는j별도로 방정식의 정의 영역은 다음과 같이 단순화되어야 합니다.
연결(r(i,j))
이론은 할당 및 색인 작업의 경우와 동일합니다.