이 튜토리얼은 네 가지 주요 부분으로 구성되어 있습니다. 우리는 이를 찾고 해결하는 방법에 대해 논의할 것입니다.실행 중 감지된 오류GAMS 모델에 대해 몇 가지 지침을 제공하겠습니다.모델 개발 및 디버깅그리고 GAMS를 줄여 효율성을 높이는 기술을 제시하겠습니다실행 시간그리고메모리 사용.
실행 오류 해결
GAMS는 모델을 생성하고 해결하는 과정에서 프로그램 파일을 여러 번 통과한다는 점을 기억하세요. 각 단계마다 오류가 발생할 수 있습니다. 이 섹션에서는 실행 중, 즉 컴파일 후에 발생하는 오류를 해결하는 방법에 대한 몇 가지 지침을 제공합니다. 컴파일 오류 해결에 대한 조언은 튜토리얼을 참조하세요.컴파일 오류 수정. GAMS에서 모델을 생성하고 해결하는 과정에 대한 자세한 내용은 장의 소개를 참조하세요.GAMS 출력.
실행시 여러 가지 문제가 발생하여 오류가 발생할 수 있습니다. 이 섹션에서는 이러한 잠재적인 오류 원인을 별도로 살펴보겠습니다. 먼저 살펴보겠습니다.산술 오류그리고내부 제한을 초과했습니다.데이터 조작 중에 문제가 계속 발생합니다.모델 생성그리고모델 솔루션. 마지막에는 함수를 사용하여 실행 오류를 관리하는 방법에 대해 간략하게 설명하겠습니다.execError.
산술 오류
GAMS 실행 오류는 음수 인수와 같은 불법적인 산술 연산으로 인해 발생할 수 있습니다.로그, 0으로 나누기 및지수여기서 밑은 음수입니다. 다음의 간단한 예는 예시로 사용됩니다.
s / s1*s5 / 설정;
매개크레이지 슬롯 p(s) "지수화할 데이터"
d(s) "제수"
r(s) "결과";
p(s) = 1;
p("s2") = -1;
d(s) = 1;
d("s3") = 0;
r(s) = p(s)**2.1 / d(s)
디스플레이 r;
실행 중 무엇인가 잘못되었다는 첫 번째 징후는 로그 출력의 다음 플래그입니다:
*** 상태: 실행 오류
결과실행 출력다음 줄이 포함됩니다:
실행 **** 라인 10의 실행 오류: rPower: FUNC DOMAIN: x**y, x < 0 **** 10행의 실행 오류: 0으로 나누기 ---- 11 PARAMETER r 결과 s1 1.000, s2 UNDF, s3 UNDF, s4 1.000, s5 1.000
실행 출력이 4개의 별표로 표시되어 있으므로 쉽게 찾을 수 있는 2개의 오류 메시지로 시작하는 것을 관찰하십시오.****. 오류 메시지는 매우 유익합니다. 오류가 발생한 줄을 나타내고 오류의 성격에 대한 세부 정보를 제공합니다. 또한, 표시 문에 의해 생성된 출력은 값이 다음과 같을 때 오류가 발생했음을 보여줍니다.r("s2")그리고r("s3")계산되었습니다. 이 두 값에 대한 대입문을 검사하면 첫 번째 경우 지수화의 밑이 -1이라는 것을 알 수 있습니다. 이는 분명히 음수이므로 이 연산에서는 허용되지 않습니다. 두 번째 경우의 문제는 다음과 같이 나눈다는 것입니다.d("s3")0과 같습니다.
이 예에서는 데이터 수정으로 오류가 쉽게 해결됩니다. 일반적으로 다음을 사용하는 것이 좋습니다.조건부 할당이런 오류를 방지하기 위해.
위의 예에서 오류 메시지는 문제가 발생한 위치를 정확하게 나타내며 오류의 원인을 쉽게 찾을 수 있다는 점에 유의하십시오. 그러나 항상 그런 것은 아닙니다. 특히 문제가 다차원 항목 내에 있는 경우 사용자에게는 더 많은 인내심이 필요합니다. 일반적으로 문제가 있는 작업의 결과를 표시하고 잘못된 항목을 찾는 데 도움이 됩니다. 또한, 해당 연산에 대한 입력 데이터를 표시하면 계산에 입력된 데이터의 수치적 특성을 조사하는 데 도움이 됩니다. 프로그램을 통해 잘못된 입력 데이터를 추적하려면 더 많은 디스플레이가 필요한 경우가 많습니다. 결국 이를 통해 사용자는 데이터가 특정 수치 값을 취하는 이유를 이해하게 될 것입니다.
GAMS 한도 초과
기본적으로 GAMS는 1e10초(벽시계 시간) 또는 2e9 반복 후에 모델 해석을 중지합니다. 이러한 한도는 옵션으로 조정될 수 있습니다.레스림그리고iterlim각각. 두 옵션 모두 다음과 같이 사용할 수도 있습니다.명령줄 매개크레이지 슬롯그리고모델 속성. 또한 작업공간은 명령줄 매개크레이지 슬롯로 제한될 수 있습니다.워크팩터그리고작업 공간. 이 옵션은 다음과 같이 사용할 수도 있습니다.모델 속성. 이러한 제한 중 하나라도 초과되면 다음이 실행됩니다.해결문중단됩니다.
예를 들어, 다음 옵션 문을 어딘가에 추가할 수 있습니다.이전프로덕션 모델의 해결 문[체너리]:
옵션 iterlim = 20;
이 명령문은 반복 제한을 20으로 줄입니다. 로그 출력에는 다음 줄이 포함됩니다:
** 가능한 해결책. 목적값 = 1033.34069261 ** 반복 제한에 도달했습니다. --- 실행 다시 시작 --- chenery.gms(228) 2Mb --- 모델 chenrad에 대한 판독 솔루션 *** 상태 : 정상완료 --- 작업 chenery.gms 중지 11/21/16 16:52:43 경과 0:00:00.106
또한요약 해결목록 파일에 인터럽트가 기록되어 있습니다:
S O L V E S U M M A R Y
모델 chenrad 목표 td
유형 NLP 방향 최대화
라인 228에서 솔버 연결
**** 솔버 상태 2 반복 인터럽트
**** 모델 상태 7 실현 가능한 솔루션
**** 목적값 1058.9199
자원 사용량, 한도 0.078 1000.000
반복 횟수, 제한 20 20
평가 오류 0 0솔버 상태 관찰반복 인터럽트는 반복 제한에 도달하여 실행 가능한 솔루션이 나왔지만 최적의 솔루션은 아니기 때문에 실행이 종료되었음을 나타냅니다. 라인반복 횟수, 제한 ...은 20번의 반복이 수행되었으며 20번이 반복 횟수 제한이기도 함을 보고합니다. 설정iterlim더 큰 값을 설정하면 이 문제가 해결됩니다.
마찬가지로, 작업 공간을 너무 적게 할당하면 솔버가 솔루션 없이 종료되는 원인이 됩니다. 예를 들어 비선형 테스트 모델의 작업 공간을 제한합니다.[MHW4D]단지 0.1MB로 설정하고 솔버 MINOS로 실행하면 로그 출력에 다음 줄이 생성됩니다.
솔버가 요청한 작업 공간 -- 0.77Mb
사용자가 요청한 작업 공간 - 0.10Mb
할당된 작업 공간 -- 0.10Mb
행을 읽는 중...
칼럼을 읽는 중...
지침을 읽는 중...
EXIT - 모델을 해석할 저장 공간이 부족합니다.
최소 0.19MB를 요청하세요.그요약 해결목록 파일에는 다음 정보가 포함됩니다:
S O L V E S U M M A R Y
모델 라이트 목표 m
NLP 방향 최소화 유형
32번째 줄의 솔버 미노스
**** 솔버 상태 9 설정 실패
**** 모델 상태 13 오류 해결 방법 없음적어도 솔버가 요청한 최소 크기로 작업 공간을 늘리면 이 문제가 해결된다는 점에 유의하십시오.
매우 큰 영역에 걸쳐 정의된 대규모 비선형 표현식을 처리할 때 다음 오류가 발생할 수 있습니다.
*** 상태: NLCodeAdd의 제한으로 인해 종료됨 *** NL 코드에서는 2147483647개 이상의 명령어를 처리할 수 없습니다. *** 자세한 내용은 목록 파일을 검사하세요.
이 경우 가장 먼저 확인해야 할 것은 모델의 정확성입니다. 즉, 필요한 것 이상을 생성하지 않는지 여부입니다. 그렇지 않고 모델이 실제로 큰 경우 일반적인 조언은 방정식 블록당 더 작은 코드 크기를 얻기 위해 중간 크레이지 슬롯를 도입하는 것입니다. 더 많은 수의 작은 블록을 가질 수 있도록 도메인을 분할하는 것도 고려할 수 있습니다.
모델 생성 오류 해결
GAMS가 모델을 솔버에 전달하기 전에 생성할 때 추가 실행 오류가 감지될 수 있습니다. 이러한 오류는 다음과 같습니다.산술 오류그 안에몸모델을 본질적으로 실행 불가능하게 만드는 모델 구조의 크레이지 슬롯 또는 오류.
크레이지 슬롯 본문에 산술 오류가 있는 다음의 간단한 예를 고려하십시오. 이는 섹션의 예에 있는 할당 오류와 유사합니다.산술 오류위.
s / s1*s5 / 설정;
매개크레이지 슬롯 p(s) "지수화할 데이터"
d(s) "제수"
m(s) "승수";
p(s) = 1;
p("s2") = -1;
d(s) = 1;
d("s3") = 0;
m(s) = 1;
m("s4") = 0;
양수 크레이지 슬롯 x(s);
크레이지 슬롯 z;
방정식 obj "목적 함수"
xlim;
obj.. z =e= sum(s,p(s)**2.2*x(s));
xlim(s)..m(s) / d(s)*x(s) =e= 1;
모델 mymodel / 모두 /;
z를 최대화하는 lp를 사용하여 mymodel을 해결합니다.
이 모델을 실행하면 로그 출력에 다음 줄이 포함됩니다:
*** SOLVE가 중단되었습니다. --- CPLEX 실행 중: 0:00:00.006 경과 --- test.gms(23) 4 Mb 3 오류 *** 상태: 실행 오류 --- Job test.gms 중지 11/21/16 19:10:12 경과 0:00:00.006
3개의 실행 오류가 있어 해결이 중단된 것을 확인하세요.크레이지 슬롯 목록목록 파일에는 이러한 실행 오류에 대한 추가 세부정보가 포함됩니다.
크레이지 슬롯 목록 23행에서 LP를 사용하여 SOLVE mymodel **** 19행의 실행 오류: rPower: FUNC DOMAIN: x**y, x < 0 ---- obj =E= 목적 함수 obj.. - x(s1) + UNDF*x(s2) - x(s3) - x(s4) - x(s5) + z =E= UNDF ; (LHS = UNDF) **** 20행의 실행 오류: 0으로 나누기(0) **** 20행의 실행 오류: rhs 값으로 인해 크레이지 슬롯을 실행할 수 없습니다. **** 불가능한 크레이지 슬롯 ... ---- xlim =E= xlim(s4).. 0 =E= 1 ; (LHS = 0, INFES = 1****) 나머지 4개 항목은 건너뛰었습니다.
다음과 관련된 산술 오류가 있음을 참고하세요.지수첫 번째 크레이지 슬롯에 산술 오류와 두 번째 크레이지 슬롯에 실행 불가능성이 있습니다.
이 예에서는 실행 오류와 원인을 쉽게 감지할 수 있었습니다. 그러나 다차원 크레이지 슬롯 블록의 오류는 찾기가 훨씬 더 어려울 수 있습니다. 기본적으로 각 크레이지 슬롯 블록의 처음 3개 항목만 크레이지 슬롯 목록에 표시됩니다. 옵션을 사용하는 것이 좋습니다.림로우전체 목록을 얻으려면 이것이 크레이지 슬롯 본문의 실행 오류를 검사하는 가장 쉬운 방법이기 때문입니다.
해결 오류 해결
솔루션 단계에서는 외부 솔버 프로그램이 모델을 처리하고 솔루션 프로세스에 대한 세부정보가 포함된 출력을 생성합니다. 해결 오류는 다음 중 하나일 수 있습니다.함수 평가 오류또는오류 방지.
함수 평가 오류 해결
일부 풀이 명령문에는 비선형 함수 평가와 도함수 계산이 필요합니다. 이러한 계산은 GAMS가 아니라 GAMS의 직접적인 통제를 받지 않는 다른 하위 시스템에 의해 수행되므로 이러한 계산과 관련된 오류는 다음과 같이 보고됩니다.솔루션 보고서.
기능 평가 오류는 섹션에서 논의된 것과 같은 수치 오류입니다.산술 오류위. 다른 예로는 음수 크레이지 슬롯의 제곱근과 음수 항의 제곱이 있습니다.x, 구문 사용x**2.
- 주의
- 부정어를 제곱하면, 예를 들어
x, 구문 사용x**2오류가 발생합니다. 그러나 대안은sqr(x)그리고xx*x작동합니다(참조여기설명용).
기본적으로 산술 오류가 발생하면 솔버 하위 시스템이 솔루션 프로세스를 중단한다는 점에 유의하세요. 사용자는 특정 수의 산술 오류를 허용하고 보고할 수 있습니다.오류 경고대신. 옵션돔림이 수정을 용이하게 합니다. 의 기본값은 다음과 같습니다.돔림0입니다.
정의 영역 밖에서 함수를 평가하는 것을 피하는 가장 좋은 방법은 합리적인 크레이지 슬롯 범위를 지정하는 것입니다. 그러나 경계가 충분하지 않은 경우가 있습니다. 다음의 간단한 예를 고려해 보세요.
i / i1*i5 / 설정;
크레이지 슬롯 x(i), z;
방정식 r1, r2(i);
r1.. z =e= log(sum(i, x(i)));
r2(i).. x(i) =l= 10;
x.lo(i) = 0;
x.l(i) = 5;
모델 takelog / 모두 /;
z를 최소화하는 nlp를 사용하여 takelog를 해결합니다.
이 작은 프로그램을 솔버 MINOS로 풀려고 하면 로그 출력에 다음 줄이 포함됩니다.
EXIT - 함수 평가 오류 제한을 초과했습니다.
그솔루션 보고서목록 파일에 더 자세한 정보가 있습니다:
S O L V E S U M M A R Y
모델 takelog 목표 z
NLP 방향 최소화 유형
라인 12의 솔버 미노스
**** 솔버 상태 5 평가 중단
**** 모델 상태 7 실현 가능한 솔루션
**** 목표 값 0.0000
자원 사용량, 한도 0.183 1000.000
반복 횟수, 제한 0 2000000000
평가 오류 2 0
...
EXIT - 함수 평가 오류 한도를 초과했습니다.
**** 크레이지 슬롯 r1의 오류/경고
오류 2개: 로그: FUNC DOMAIN: x < 0(반환됨 0)
...
**** 보고서 요약 : 1 NOPT (NOPT)
0 불가능
0 무제한
오류 1개(****)참고하세요해결사 상태값은 5(평가 인터럽트), 이는 옵션에 지정된 것보다 더 많은 평가 오류가 발생하여 솔버가 중단되었음을 의미합니다.돔림. 우리의 경우돔림은 기본값이 0이므로 하나의 오류만으로도 중단이 발생할 수 있습니다. 평가 오류가 발생한 크레이지 슬롯과 오류 유형이 몇 줄 뒤에 보고됩니다. 이 예에서는 크레이지 슬롯r1우리는 식의 로그를 취하기 때문에 문제가 있습니다합계(i, x(i)), 0이 될 수 있는 표현식입니다.
이와 같은 모델에서는 각 개별 크레이지 슬롯에 유의하세요.x(i)은 0이 되도록 허용해야 하지만 합계는 0이 되어서는 안 됩니다. 이는 중간 크레이지 슬롯를 도입하여 달성할 수 있습니다.xsum, 0보다 큰 하한을 추가하고 이 크레이지 슬롯를 함수의 인수로 사용로그:
크레이지 슬롯 xsum;
xsum.lo = 0.0001;
방정식 defxsum, r1;
defxsum .. xsum =e= sum(i, x(i));
r1.. z =e= 로그(xsum);
중간 크레이지 슬롯에 대한 자세한 내용은 섹션을 참조하세요.비선형 함수에서 표현식 피하기튜토리얼에서좋은 NLP 공식.
솔버가 발생한 산술 문제 유형과 문제가 있는 방정식을 보고하지만 특정 문제 크레이지 슬롯나 오류를 유발하는 방정식 색인의 레이블을 식별하지 못하는 것을 관찰하십시오. 원인이 명확하지 않은 경우 사용자는 해당 방정식 본문에 있는 크레이지 슬롯, 레이블 및 매개크레이지 슬롯의 수치적 특성을 조사해야 합니다. 여기에는 다음이 포함될 수 있습니다.
- 입력 데이터 항목을 해당 크레이지 슬롯의 비선형 항으로 표시합니다.
- 실행 불가능한 크레이지 슬롯의 해 찾기 (
INFES) 및 최적이 아닌 크레이지 슬롯(NOPT) 문제가 있는 위치와 실행이 끝날 때 어떤 크레이지 슬롯가 조작되었는지 확인하기 위해. - 실행 종료 시 수준 값이 0, 음수 또는 매우 큰 크레이지 슬롯 및 방정식을 조사합니다.
- 섹션에서 논의된 대로 문제의 범위를 좁히기 위해 코드의 일부를 비활성화함느린 문장에서 용어 분리아래.
함수 평가 오류를 해결하려면 일반적으로 다음 기술이 필요합니다.
- 크레이지 슬롯를 0보다 높게 유지하기 위해 크레이지 슬롯에 하한을 추가합니다.
- 크레이지 슬롯가 너무 커지는 것을 방지하기 위해 크레이지 슬롯에 상한을 추가합니다.
- 예를 들어 중간 크레이지 슬롯를 도입하여 모델을 재구성합니다.
- 솔버 검색을 보다 관련성 높은 지역으로 안내하는 더 나은 시작점을 제공합니다. 섹션 참조초기값 지정튜토리얼에서좋은 NLP 공식자세한 내용은.
- 잘못된 입력 데이터를 수정 중입니다.
오류 예방
일부 솔버는 주요 솔루션 프로세스를 더 빠르게 만들기 위해 프로그램이 사전 해결되는 사전 처리 단계를 사용합니다. 이 단계에서 다음 예와 같이 모델 오류가 이미 발견되었을 수 있습니다.
크레이지 슬롯 z;
정수크레이지 슬롯 y1,y2;
방정식 r1,r2,r3,r4;
r1.. z=e=y1+y2;
r2..y1=g=0.10;
r3..y2=g=0.10;
r4..y1+y2=l=1;
모델 badpresol /all/;
z를 최대화하는 mip를 사용하여 badpresol을 해결합니다.
이 문제에 대해 Cplex는 사전 해결에서 이미 실행 가능한 정수 솔루션이 없음을 감지했습니다. 이는 로그에 보고됩니다.
행 'r4' 실행 불가능, 모든 항목이 묵시적인 경계에 있습니다. 사전 해결 시간 = 0.00초 (0.00틱) ... CPLEX 오류 1217: 솔루션이 없습니다. 문제는 정수가 불가능합니다.
여기서 Cplex는 문제가 있는 부분을 명확하게 보여줍니다: 행r4모든 항목이 "묵시적 경계"에 있기 때문에 실행 불가능합니다. 살펴보자r2그리고r3이것이 무엇을 의미하는지 확인하려면: 이 크레이지 슬롯은 하한을 0.1로 설정합니다.y1그리고y2. 두 크레이지 슬롯 모두 다음과 같이 정의되므로정수 크레이지 슬롯, 암시적 하한값 1을 얻습니다. 이를 감안할 때 크레이지 슬롯 r4는 실행 불가능해야 합니다.
솔버 특정 제한
많은 솔버에는 초과될 수 있는 내부 제한이 있으며 이로 인해 목록 파일이 실행 오류를 보고하게 될 수 있습니다. 이러한 오류는 GAMS 옵션이나 솔버 특정 옵션을 사용하여 해당 제한을 늘려 해결될 수 있습니다. 일반적으로 목록 파일에는 사용할 옵션에 대한 정보가 포함됩니다. GAMS와 함께 배포되는 솔버 매뉴얼에는 각 솔버에 대해 지정할 수 있는 옵션이 나열되어 있습니다. 예를 들어, MINOS 주요 반복 제한을 완화하기 위해 사용자는 다음과 같은 이름의 파일을 생성할 수 있습니다.minos.opt다음 줄 포함:
주요 반복 1000
솔버 옵션 파일에 대한 자세한 내용은 섹션에서 찾을 수 있습니다.솔버 옵션 파일.
execError 함수를 사용하여 실행 오류 관리
함수execError실행 오류를 관리하는 프로시저 구현을 용이하게 합니다. 섹션의 예를 확장한 다음 예를 고려하세요.산술 오류위.
s / s1*s5 / 설정;
매개크레이지 슬롯 p(s) "지수화할 데이터"
d(s) "제수"
r(s) "결과";
p(s) = 1;
p("s2") = -1;
d(s) = 1;
d("s3") = 0;
r(s) = p(s)**2.1 / d(s)
디스플레이 r;
*z가 정의되지 않음
스칼라 z;
z = 1/0;
if(execError > 0,
r(s)$(r(s) = z) = 0;);
디스플레이 r;
우리가 새로운 스칼라를 도입한 것을 관찰하세요z의도적으로 정의되지 않았습니다. 에서if 문다음에는 함수를 사용합니다.execError논리 조건 및 정의되지 않은 스칼라조건부 할당. if 문은 정의되지 않은 항목이 매개크레이지 슬롯 배열에서 제거되는 효과를 갖습니다.r, 실행 출력의 다음 줄에 표시된 대로:
실행 **** 라인 10의 실행 오류: rPower: FUNC DOMAIN: x**y, x < 0 **** 10행의 실행 오류: 0으로 나누기 ---- 11 PARAMETER r 결과 s1 1.000, s2 UNDF, s3 UNDF, s4 1.000, s5 1.000 **** 16행의 실행 오류: 0으로 나누기(0) ---- 20 PARAMETER r 결과 s1 1.000, s4 1.000, s5 1.000
또한, 함수execError실행 오류 수를 재설정하는 데 사용될 수 있습니다. 일반적으로 GAMS가 상태 메시지와 함께 종료되도록 0으로 재설정됩니다.보통 완료. 예를 들어 위 예제의 코드 끝에 다음 줄을 추가할 수 있습니다.
execError = 0;
- 참고
- 설정
execError = 0;다음 결과를 가져올 뿐만 아니라정상완료52551_52578해결문기본적으로 이전에 실행 오류가 있었다면 실행되지 않습니다. 설정execError = 0;solv 문 이전에 다시 실행할 수 있습니다.
설정execError = 0;또한 로그에 알림이 표시됩니다.
******************************** *** 오류가 해결되었습니다 *** ******************************** *** 상태: 정상완료
소형에서 대형까지: 개발 및 디버깅 지원
많은 GAMS 사용자는 GAMS가 대형 모델을 얼마나 쉽게 처리하는지에 대해 지나치게 깊은 인상을 받았습니다. 모델러는 종종 이러한 기능을 통해 항상 전체 모델을 작업해야 한다고 생각합니다. 결과는 모델 개발의 초기 단계에서 종종 대규모, 때로는 매우 큰 모델이 됩니다. 이렇게 큰 공식을 디버깅하는 것은 쉽지 않습니다.
GAMS에 사용된 대수적 모델링 스타일은 본질적으로 확장 가능합니다. 이는 여기에서 논의되는 모델 개발 및 디버깅에 사용될 수 있는 전략 측면에서 흥미로운 가능성을 제공합니다.
예시적인 예
GAMS에 구현된 집합 기반 대수 모델링 스타일은 본질적으로 확장하기 쉽습니다. 다양한 크기의 데이터 세트에 동일한 모델 공식을 사용하는 것은 쉽습니다. 운송 모델을 기반으로 이를 설명하겠습니다.[TRNSPORT]. 마지막에 일부 솔루션 사후 계산을 포함했습니다.
* 데이터 섹션
세트 i "통조림 공장" / 시애틀, 샌디에고 /
j "시장" / 뉴욕, 시카고, 토피카 / ;
매개크레이지 슬롯 a(i) "경우에 따라 플랜트 i의 용량"
/ 시애틀 350, 샌디에이고 600/
b(j) "경우에 따라 시장 j의 수요"
/ 뉴욕 325, 시카고 300, 토피카 275 /;
테이블 d(i,j) "거리(천 마일)"
뉴욕 시카고 토피카
시애틀 2.5 1.7 1.8
샌디에이고 2.5 1.8 1.4 ;
스칼라 f "1,000마일당 케이스당 운임(달러)" /90/ ;
매개크레이지 슬롯 c(i,j) "케이스당 운송 비용(단위: 수천 달러)" ;
c(i,j) = f * d(i,j) / 1000 ;
* 모델 섹션
양수 크레이지 슬롯 x(i,j) "케이스의 배송 수량";
크레이지 슬롯 z "총 운송 비용(수천 달러)";
방정식 비용 "목적 함수 정의"
Supply(i) "공장 i의 공급 제한을 준수하십시오"
수요(j) "시장 j의 수요를 충족";
비용 .. z =e= sum((i,j), c(i,j) * x(i,j)) ;
공급(i) .. sum(j, x(i,j)) =l= a(i) ;
수요(j) .. sum(i, x(i,j)) =g= b(j) ;
모델 전송 /all/ ;
z를 최소화하는 lp를 사용하여 전송을 해결합니다.
매개크레이지 슬롯 m(*,*) "상품 이동";
m(i,j) = x.l(i,j);
m("전체",j) = sum(i, x.l(i,j));
m(i,"총계") = sum(j, x.l(i,j));
m("총계","총계") = sum(j, m("총계",j));
옵션 소수 = 0;
m 표시;
이 모델은 더 많은 데이터를 추가하여 쉽게 확장될 수 있습니다.
* 데이터 섹션
나는 "통조림 공장"을 설정합니다 / 시애틀, 샌디에고, 볼티모어, 달라스 /
j "시장" / 뉴욕, 시카고, 토피카, 보스턴, 마이애미 /;
매개크레이지 슬롯 a(i) "경우에 따라 플랜트 i의 용량"
/ 시애틀 350, 샌디에이고 600, 볼티모어 450, 달라스 750 /
b(j) "경우에 따라 시장 j의 수요"
/ 뉴욕 325, 시카고 300, 토피카 275, 보스턴 330, 마이애미 290 /;
테이블 d(i,j) "거리(천 마일)"
뉴욕 시카고 토피카 보스턴 마이애미
시애틀 2.5 1.7 1.8 3.1 3.3
샌디에이고 2.5 1.8 1.4 3.0 2.7
볼티모어 0.2 0.7 1.8 0.4 1.1
달라스 1.5 0.9 0.5 1.8 1.3 ;
스칼라 f "1,000마일당 케이스당 운임(달러)" /90/ ;
매개크레이지 슬롯 c(i,j) "케이스당 운송 비용(단위: 수천 달러)" ;
c(i,j) = f * d(i,j) / 1000 ;
* 모델 섹션
양수 크레이지 슬롯 x(i,j) "케이스의 배송 수량";
크레이지 슬롯 z "총 운송 비용(수천 달러)";
방정식 비용 "목적 함수 정의"
Supply(i) "공장 i의 공급 제한을 준수하십시오"
수요(j) "시장 j의 수요를 충족";
비용 .. z =e= sum((i,j), c(i,j) * x(i,j)) ;
공급(i) .. sum(j, x(i,j)) =l= a(i) ;
수요(j) .. sum(i, x(i,j)) =g= b(j) ;
모델 전송 /all/ ;
z를 최소화하는 lp를 사용하여 전송을 해결합니다.
매개크레이지 슬롯 m(*,*) "상품 이동";
m(i,j) = x.l(i,j);
m("전체",j) = sum(i, x.l(i,j));
m(i,"총계") = sum(j, x.l(i,j));
m("전체","전체")=sum(j, m("전체",j));
옵션 소수 = 0;
m 표시;
두 세트(i그리고j)이 확대되어 용량(a) 및 수요(b) 데이터가 새로운 공장 및 시장 진입과 거리 테이블을 포괄하도록 확장되었습니다(d)가 이에 따라 조정되었습니다. 그러나 데이터 계산, 크레이지 슬롯, 모델 정의, 모델 솔루션 및 보고서 작성 섹션은 두 모델에서 동일합니다.
동기 부여 및 단계별 가이드
위의 예에서 설명한 것처럼 GAMS를 사용하면 작은 데이터 세트를 사용하여 모델 구조, 계산 및 보고서 작성을 개발하고 구현할 수 있으며 더 큰 데이터 세트로 쉽게 확장할 수 있습니다. 따라서 의도적으로 작은 대표 데이터 세트로 시작하여 모델 개발, 테스트 및 디버깅 작업이 완료되면 전체 크기로 확대하는 것이 좋습니다. 즉, 소규모에서 대규모로 작업합니다.
모델이 클수록 컴파일, 모델 생성, 실행 및 해결에 더 오랜 시간이 걸립니다. 일반적으로 시간은 기하급수적으로 늘어납니다. 처음부터 대규모 모델로 작업하면 사용자가 상대적으로 작은 데이터 문제를 찾으려고 할 때에도 좌절감을 느끼는 경우가 많습니다.
이미 완성된 모델에 수정이 필요한 경우, 작은 데이터 세트에 대한 수정 사항을 개발하는 대신 큰 데이터 세트를 사용하고 싶은 유혹이 생길 것입니다. 이 경우에는 작은 데이터 세트를 사용하는 것이 좋습니다. 경험에 따르면 이렇게 하면 상당한 시간이 절약될 수 있습니다.
모델 개발 시 다음 단계를 따르는 것이 좋습니다.
- 모든 구조적 특징, 세트 이름, 매개크레이지 슬롯 등을 포함하여 전체 모델을 나타내는 작은 데이터 세트를 설정합니다.
- 모든 데이터 계산, 모델 기능 및 보고서 작성 계산을 구현합니다.
- 2단계의 결과를 철저히 테스트하세요.
- 작은 모델을 저장하세요. 그런 다음 전체 데이터 세트를 사용하여 더 큰 버전을 구현합니다. 데이터, 계산, 모델 정의 및 보고서 작성을 위한 별도의 파일을 생성하여 크기 독립성을 유지합니다. 사용파일 포함또는저장 및 다시 시작 기능.
- 더 큰 모델을 테스트하세요. 논의된 모델링 기술을 사용하십시오.아래당신의 작업을 용이하게 합니다.
- 소형 모델을 최신 상태로 유지하세요. 대형 모델에 추가적인 구조적 특징이 추가되면 이를 테스트하는 데 사용합니다. 섹션 참조전략적 하위 집합 소개아래에서 작은 모델을 유지하는 쉬운 방법을 알아보세요.
모델링 기술
사용자가 섹션에 설명된 모델 개발 단계를 따르는 경우동기 부여 및 단계별 가이드위에서 그들은 작은 모델로 필요한 모든 기능을 모델링하는 것이 항상 가능하지는 않다는 것을 알게 될 것입니다. 더 큰 데이터 세트의 모든 기능을 갖도록 작은 데이터 세트를 신중하게 선택하는 것이 중요합니다. 그러나 때로는 전체 데이터 세트의 특성과 상호 관계가 작은 데이터 세트에서 재현되지 않을 수도 있습니다. 이 섹션에서는 발생하는 문제를 찾기 위한 몇 가지 모델링 기술을 소개합니다.만전체 데이터 세트가 사용되는 경우. 여기에는 문제 영역을 격리하기 위한 저장 및 다시 시작, 전략적으로 하위 집합 도입 및 데이터 감소가 포함됩니다.
저장 및 재시작을 통해 문제 영역 격리
실행하는 데 몇 시간이 걸리는 대규모 데이터 세트가 있는 모델이 있고 상대적으로 작은 세그먼트에 몇 줄의 코드를 추가하고 싶다고 가정해 보겠습니다. 가장 좋은 방법은 관련 부분을 분리하는 것입니다. 수정하려는 부품을 분리하면 데이터를 입력하지 않고도 테스트 및 수리를 수행하고, 초기 계산을 수행하고, 실행할 때마다 전체 모델을 해결할 수 있습니다. 사용하는 것이 좋습니다.파일 저장 및 다시 시작.
예를 들어 장에서저장 및 다시 시작 기능운송 모델을 분할하는 방법을 보여줍니다[TRNSPORT]세 부분으로: 파일transmodel.gms데이터와 모델, 파일을 포함합니다transolve.gmssolv 문과 파일을 포함합니다.tranreport.gms표시문이 포함되어 있습니다. 전체 모델을 실행하기 위해 다음 순서를 사용하여 저장된 파일을 저장하고 다시 시작합니다.
> gams transmodel s=s1 > gams는 r=s1 s=s2를 변환합니다. > gams tranreport r=s2
우리는 단지 일부 레벨 값을 표시하는 것보다 더 정교한 보고서를 원한다고 가정합니다. 파일로tranreport.gms보고 관련 코드가 포함되어 있으므로 이 파일만 수정하겠습니다. 그런 다음 이 파일만 실행하고 다음에서 다시 시작하여 결과를 테스트합니다.s2, 전체 모델을 반복해서 풀 필요 없이.
전략적 하위 집합 소개
디버깅이나 개발에 전체 데이터 세트가 사용될 때, 다음을 도입하여 세트의 몇 가지 항목에 초점을 맞추는 것이 도움이 되는 경우가 많습니다.하위 집합. 다음 예는 섹션의 확장 운송 모델을 수정한 것입니다.예시적인 예위.
* 데이터 섹션
나는 "통조림 공장"을 설정합니다 / 시애틀, 샌디에고, 볼티모어, 달라스 /
j "시장" / 뉴욕, 시카고, 토피카, 보스턴, 마이애미 / ;
세트 식물(i) "통조림 식물의 축소된 세트"
/ 시애틀, 샌디에고 /
시장(j) "수요 시장의 축소된 집합"
/ 뉴욕, 시카고, 토피카 / ;
*식물(i) = 예; 시장(j) = 예;
매개크레이지 슬롯 a(i) "경우에 따라 플랜트 i의 용량"
/ 시애틀 350, 샌디에이고 600, 볼티모어 450, 달라스 750 /
b(j) "경우에 따라 시장 j의 수요"
/ 뉴욕 325, 시카고 300, 토피카 275, 보스턴 330, 마이애미 290 /;
테이블 d(i,j) "거리(천 마일)"
뉴욕 시카고 토피카 보스턴 마이애미
시애틀 2.5 1.7 1.8 3.1 3.3
샌디에이고 2.5 1.8 1.4 3.0 2.7
볼티모어 0.2 0.7 1.8 0.4 1.1
달라스 1.5 0.9 0.5 1.8 1.3;
스칼라 f "1,000마일당 케이스당 운임(달러)" /90/ ;
매개크레이지 슬롯 c(i,j) "케이스당 운송 비용(단위: 수천 달러)" ;
c(공장,시장) = f * d(공장,시장) / 1000;
* 모델 부문
양수 크레이지 슬롯 x(i,j) "케이스의 배송 수량";
크레이지 슬롯 z "총 운송 비용(수천 달러)";
방정식 비용 "목적 함수 정의"
Supply(i) "공장 i의 공급 제한을 준수하십시오"
수요(j) "시장 j의 수요를 충족";
비용 .. z =e= sum((식물,시장), c(식물,시장) * x(식물,시장)) ;
공급(공장) .. sum(시장, x(공장,시장)) =l= a(공장) ;
수요(시장) .. sum(공장, x(공장,시장)) =g= b(시장) ;
모델 전송 /all/ ;
z를 최소화하는 lp를 사용하여 전송 문제를 해결합니다.
우리가 하위 집합을 도입한 것을 관찰하세요식물그리고시장상위 집합의 일부 요소만 포함i그리고j. 모든 테이블, 매개크레이지 슬롯 및 크레이지 슬롯는 상위 집합으로 정의되며 방정식은 다음과 같습니다.선언됨상위 집합보다 높지만정의됨하위 집합 및 매개크레이지 슬롯 계산c또한 하위 집합으로 제한됩니다. 따라서 모델은 하위 집합의 요소로 제한됩니다. 그러나 주석 줄을 나타내는 별표를 제거하면 제한된 모델을 다시 전체 모델로 쉽게 변경할 수 있습니다.
식물(i) = 예; 시장(j) = 예;
세트를 관찰하세요식물그리고시장지금은동적 세트. 이 할당은 코드의 어느 곳에나 삽입될 수 있습니다. 따라서 섹션에 자세히 설명된 대로 전략적 하위 집합을 도입하는 것은 문제 영역을 격리하는 것과 결합될 수 있습니다.저장 및 재시작을 통해 문제 영역 격리위.
전략적 하위 집합을 도입하는 것은 적은 노력으로 작은 데이터 집합을 유지하는 효과적인 방법임이 입증되었습니다. 사용자는 전체 세트에서 모델 개발 및 디버깅을 대표하는 요소만 선택하면 됩니다.
데이터 감소
GAMS는 데이터 항목이 0인 경우를 건너뜁니다. 따라서 단순히 항목을 0으로 설정하여 데이터 세트에서 데이터를 일시적으로 제거함으로써 대규모 모델을 줄일 수 있습니다. 다음 예를 고려해보세요.
o '원산지' / o1*o100 / 설정
d '목적지' / d1*d100 /;
매개크레이지 슬롯 dist(o,d) '거리';
dist(o,d) = 120 + 50*ord(d) - 0.5*ord(o);
so(o) '테스트를 위한 작은 원본 세트' / o4, o47, o91 / 설정
sd(d) '작은 목적지 세트' / d3, d44, d99 /;
dist(o,d) $ ((so(o) 및 sd(d)가 아님)) = 0;
매개크레이지 슬롯 비용(o,d) '운송비';
비용(o,d) $ dist(o,d) = 3 + 2*dist(o,d);
표시 비용, 거리;
우리가 소개한 것에 주목하세요전략적 하위 집합그리고 이를 a의 논리적 조건에서 사용했습니다.조건부 할당매개크레이지 슬롯의 거의 모든 항목을 설정합니다.거리0으로. 또한 매개크레이지 슬롯에 대한 할당은 다음과 같습니다.비용는 거리에 대해 0이 아닌 항목을 조건으로 합니다. 이제 모델이 0이 아닌 운송 비용을 조건으로 한다면 전체 모델의 크기가 크게 줄어들 것입니다.
효율성 증가: GAMS 실행 시간 단축
GAMS는 계산 및 모델 생성에 오랜 시간이 걸릴 수 있습니다. 일반적으로 실행 시간이 예상외로 길어지거나 한 줄의 실행이 길어지는 등 실행 시간을 줄일 수 있음을 나타내는 몇 가지 징후가 있는데, 이는 로그에 오랫동안 동일한 줄 번호가 표시되는 경우 볼 수 있습니다.
이 섹션에서 우리는 방법을 논의할 것입니다.느린 프로그램 실행의 원인 찾기및 방법실행 속도 저하의 주요 원인 제거.
느린 프로그램 실행 원인 찾기
실행 속도 저하의 원인을 발견하기 위한 최선의 전략은 섹션에서 논의된 기술의 조합입니다.소형에서 대형까지: 개발 및 디버깅 지원위 및 이 섹션에서 소개할 기술은 다음과 같습니다.실행 프로필 생성 중그리고느린 명령문에서 용어 분리. 또한 간략하게 살펴보겠습니다.로그 파일 관찰그리고 이것이 왜 첫 번째 선택이 아닌지 지적하겠습니다.
실행 프로필 생성
실행하는 데 특히 오랜 시간이 걸리는 GAMS 문을 찾는 가장 빠른 방법은 출력 파일에 실행 프로필을 생성하는 것입니다. 실행 프로파일에는 GAMS 모델의 각 섹션을 실행하는 데 필요한 개별 및 누적 시간과 메모리 사용에 대한 정보가 포함됩니다. 옵션이 실행되면 실행 프로필이 생성됩니다.프로필에는 0보다 큰 값이 할당됩니다(0이 기본값). 이는 다음 중 하나를 설정하여 수행할 수 있습니다.명령줄 매개크레이지 슬롯또는 다음을 사용하여옵션 설명. 아래에서 실행 프로필의 예를 보여드리겠습니다. 실행 프로필에 대한 자세한 내용, 옵션 값에 대한 추가 예 및 세부정보를 보려면프로필걸릴 수도 있습니다. 자세한 설명을 참조하세요.여기.
옵션 프로필 = 1;
옵션 리미로우 = 0; 옵션 limcol = 0;
옵션 solprint = 꺼짐;
a / 1*22 /, b / 1*22 /, c / 1*20 /,
d / 1*20 /, e / 1*22 /;
매개크레이지 슬롯 x(e,d,c,b,a), y, z(a,b,c,d,e);
x(e,d,c,b,a) = 10;
z(a,b,c,d,e) = x(e,d,c,b,a);
y = 합계((a,b,c,d,e), z(a,b,c,d,e)*x(e,d,c,b,a));
크레이지 슬롯 obj;
양수 크레이지 슬롯 var(e,b,a);
방정식 objeq, r(b,c,d), q(a,b,c);
objeq.. obj =e= sum((a,b,c,d,e), z(a,b,c,d,e)*x(e,d,c,b,a) * var(e,b,a));
r(b,c,d).. sum((a,e), var(e,b,a)) =l= sum((a,e), x(e,d,c,b,a)*z(a,b,c,d,e));
q(a,b,c).. sum((d,e), var(e,b,a)/x(e,d,c,b,a)*z(a,b,c,d,e)) =l= 20;
느린 모델 /all/;
lp를 사용하여 느린 최대화 obj를 해결합니다.
매개크레이지 슬롯 sumofvar;
sumofvar = sum((a,b,c,d,e), z(a,b,c,d,e)*x(e,d,c,b,a)*var.l(e,b,a));
sumofvar 표시;
목록 파일에는 다음과 같은 실행 프로필이 포함됩니다(파일 전체에 걸쳐 있음):
-- 9 할당 x 0.374 0.374 SECS 109MB 4259200 ---- 10 할당 z 2.231 2.605 SECS 286MB 4259200 ---- 11 할당 y 2.324 4.929 SECS 286MB 0 ---- 23 해결 초기화 느린 0.000 4.961 SECS 286MB ---- 18 크레이지 슬롯 objeq 3.510 8.471 SECS 287 MB 1 ---- 19 크레이지 슬롯 r 3.088 11.559 SECS 464 MB 8800 ---- 20 크레이지 슬롯 q 5.741 17.300 SECS 470 MB 9680 ---- 23 해결 Fini 느림 0.780 18.080 SECS 470MB 4482809 ---- 23 GAMS 피니 0.359 0.359 초 470MB ---- 1 InitE 0.032 0.032초 213MB ---- 1 ExecInit 0.000 0.032 초 213MB ---- 23 풀기 Alg 느림 0.000 0.032 SECS 213MB ---- 23 해결 읽기 느린 0.000 0.032 SECS 215MB ---- 26 할당 sumofvar 2.620 2.652 SECS 287MB 0 ---- 27 디스플레이 0.032 2.684 초 287MB ---- 27 GAMS 피니 0.000 0.000 초 287MB
첫 번째 열은 실행된 GAMS 문의 입력 파일에 있는 줄 번호를 보여줍니다. 두 번째 열은 명령문 유형을 보고합니다. 모든 GAMS 명세서의 개요는 섹션을 참조하세요.GAMS 명세서 분류. 다음 두 열은 각 명령문을 실행하는 데 필요한 개별 시간과 지금까지 소요된 누적 시간을 제공합니다. 메모리 사용이 뒤따르고 마지막으로 각 줄에 생성된 할당 수가 표시됩니다.
또한 다음이 있습니다.프로필 요약가장 비용이 많이 드는 명령문을 표시하는 lst 파일 끝:
---- 프로필 요약(19개 레코드 처리됨)
5.741 0.470GB 20 크레이지 슬롯 q(9680)
3.510 0.287GB 18 크레이지 슬롯 대상 (1)
3.088 0.464GB 19 크레이지 슬롯 r (8800)
2.620 0.287GB 26 할당 sumofvar (0)
2.324 0.286GB 11 할당 y (0)
2.231 0.286GB 10 할당 z (4259200)
0.780 0.470GB 23 솔브 피니 느림(4482809)
0.374 0.109GB 9 할당 x (4259200)
0.359 0.470GB 23 GAMS 피니
0.032 0.213GB 1 초기화이는 20, 18, 19, 26, 11, 10번 줄의 명령문 실행이 (순서대로) 가장 비용이 많이 드는 명령임을 보여줍니다. 한 가지 이유는 세트를 참조할 때 순서가 일관되지 않기 때문입니다. 이 주제에 대해서는 섹션에서 논의하겠습니다.일관되게 색인 순서 지정아래.
실행 프로필에는 보고된 실행 시간이 무시할 정도이므로 유익하지 않은 행이 많이 포함될 수 있습니다. 이 줄은 다음 옵션을 사용하여 표시되지 않을 수 있습니다.profileTol포함할 최소 실행 시간(초)을 지정합니다. 옵션을 확인하세요.프로필톨명령줄 매개크레이지 슬롯 및 옵션 문으로 사용할 수 있습니다.
추가로 명령줄 매개크레이지 슬롯에 유의하세요.프로필파일프로파일링 정보를 (목록 파일 대신) 별도의 파일에 쉽게 작성할 수 있습니다.
느린 문장에서 용어 분리
어떤 경우에는실행 프로필긴 실행 시간의 원인이 매우 긴 명령문과 연결되어 있음을 보여줍니다. 예를 들어, 일부 모델 및 일부 보고서 계산의 목적 함수에는 수백 줄의 코드가 필요할 수 있으며 추가된 많은 용어가 포함될 수 있습니다. 이렇게 긴 명령문이 실행 시간 측면에서 문제가 되는 경우 코드의 일부를 비활성화하고 프로그램을 반복적으로 실행하여 문제의 근본 원인이 되는 정확한 행을 찾아야 합니다. 이는 다음을 사용하여 수행할 수 있습니다.댓글.
로그 파일 관찰
일부 모델러는 프로그램 실행 속도 저하의 원인을 찾기 위해 실행 중에 로그 파일을 검사하거나 화면을 관찰하는 것을 선택합니다. 그러나 다음과 같은 이유로 이 접근 방식을 사용하지 않는 것이 좋습니다.
- 천천히 실행되는 명령문은 쉽게 누락되고 명령문이 잘못 식별되는 경우가 많습니다. 또한 화면을 관찰하는 사람의 주의가 산만해져서 이 과정을 반복해야 할 수도 있습니다.
- 다음과 같은 경우 GAMS 라인 보고가 오해를 불러일으킬 수 있습니다.흐름 제어 문좋아요if 문그리고루프문실행됩니다. 예를 들어, 루프의 개별 계산은 화면에 보고되지 않습니다. 화면을 보는 사용자는 루프에 많은 시간이 걸린다는 것을 알 수 있지만 루프 내의 어떤 문이 문제인지는 알 수 없습니다. 이는 모든 GAMS 제어 구조에 적용됩니다.
그러므로 옵션 사용을 권장합니다.프로필느린 프로그램 실행의 원인을 찾기 위한 주요 도구입니다. 자세한 내용은 섹션을 참조하세요.실행 프로필 생성위. 또한 섹션에 설명된 기술을 참조하세요.수수께끼가 작동하지 않는 코드를 복구하기 위한 조언아래.
프로그램 실행 속도 저하의 주요 원인 제거
프로그램 실행이 느린 주요 이유는 다음과 같습니다.일관되지 않은 색인 순서세트가 참조될 때 및관련 없는 사례를 고려함. 이 섹션에서는 이러한 원인을 제거하는 방법에 대한 지침을 제공하고 다음으로 인한 문제도 지적합니다.모델 크기 조정솔버 실행 시간이 불필요하게 길어질 수 있습니다.
일관되게 색인 순서 지정
GAMS는 희소 행렬 데이터 저장 방식을 사용합니다. 예를 들어 매개크레이지 슬롯를 고려해보세요.p(a,b,c). 집합이라고 가정a\(k\)개의 요소, 집합이 있습니다b\(n\)개의 요소가 있고c\(m\)개의 요소가 있습니다. 그런 다음에 대한 항목은p다음 순서로 저장됩니다:
a1 b1 c1 a1 b1 c2 ... a1 b1 cm a1 b2 c1 ... a1 b2cm ... 10억cm a2 b1 c1 ... ak bn cm
마지막 항목이 가장 빠르게 변화하고 첫 번째 항목이 가장 느린 것은 체계적인 순서라는 점에 유의하십시오. GAMS는 저장 순서와 일치하는 순서로 항목을 참조하는 경우 메모리에서 항목을 가장 빨리 회수합니다. 따라서 다음 예에서는 첫 번째 대입문이 두 번째 대입문보다 빠르게 처리됩니다.
x(a,b,c) = p(a,b,c);
y(b,c,a) = p(a,b,c);
- 참고
- GAMS는 정의, 할당 및 크레이지 슬롯에서 세트가 항상 동일한 순서로 참조되는 경우 프로그램을 가장 빠르게 실행합니다.
다음 예는 이 원칙을 보여줍니다. 먼저 인덱스가 임의의 순서로 나타나는 프로그램을 풀고 옵션을 설정하여 생성된 출력을 기록하겠습니다.프로필to 1. 그런 다음 인덱스가 항상 알파벳 순서로 나타나도록 프로그램을 재구성하고 다시 풀어서 기록합니다.프로필출력. 마지막 단계에서는 두 실행의 실행 시간을 비교합니다. 소개된 예를 사용하겠습니다위.
매개크레이지 슬롯와 방정식의 색인은 무작위 순서로 나타납니다. 다음은 가장 비싼 6개 명세서의 프로필입니다.
-- 10 할당 z 2.231 2.605 SECS 286MB 4259200 ---- 11 할당 y 2.324 4.929 SECS 286MB 0 ---- 18 크레이지 슬롯 objeq 3.510 8.471 SECS 287 MB 1 ---- 19 크레이지 슬롯 r 3.088 11.559 SECS 464 MB 8800 ---- 20 크레이지 슬롯 q 5.741 17.300 SECS 470 MB 9680 ---- 26 할당 sumofvar 2.620 2.652 SECS 287MB 0
다음 단계에서는 색인이 항상 같은 순서로 나타나도록 프로그램을 재구성합니다. 예를 들어 매개크레이지 슬롯를 정의합니다.xasx(a,b,c,d,e)대신에x(e,d,c,b,a). 완전히 재작성된 모델은 다음과 같습니다.
옵션 프로필 = 1;
옵션 리미로우 = 0; 옵션 limcol = 0;
옵션 solprint = 꺼짐;
a / 1*22 /, b / 1*22 /, c / 1*20 /,
d / 1*20 /, e / 1*22 /;
매개크레이지 슬롯 x(a,b,c,d,e), y, z(a,b,c,d,e);
x(a,b,c,d,e) = 10;
z(a,b,c,d,e) = x(a,b,c,d,e);
y = 합계((a,b,c,d,e), z(a,b,c,d,e)*x(a,b,c,d,e));
크레이지 슬롯 obj;
양수 크레이지 슬롯 var(a,b,e);
방정식 objeq, r(b,c,d), q(a,b,c);
objeq.. obj =e= sum((a,b,c,d,e), z(a,b,c,d,e)*x(a,b,c,d,e) * var(a,b,e));
r(b,c,d).. sum((a,e), var(a,b,e)) =l= sum((a,e), x(a,b,c,d,e)*z(a,b,c,d,e));
q(a,b,c).. sum((d,e), var(a,b,e)/x(a,b,c,d,e)*z(a,b,c,d,e)) =l= 20;
느린 모델 /all/;
lp를 사용하여 느린 최대화 obj를 해결합니다.
매개크레이지 슬롯 sumofvar;
sumofvar = sum((a,b,c,d,e), z(a,b,c,d,e)*x(a,b,c,d,e)*var.l(a,b,e));
sumofvar 표시;
수정된 프로그램을 실행한 후 비용이 많이 드는 명령문의 프로필은 다음과 같습니다:
-- 10 할당 z 0.593 0.983 SECS 215MB 4259200 ---- 11 할당 y 0.671 1.654 SECS 215MB 0 ---- 18 크레이지 슬롯 objeq 1.778 3.432 SECS 215 MB 1 ---- 19 크레이지 슬롯 r 2.215 5.647 SECS 392 MB 8800 ---- 20 크레이지 슬롯 q 1.763 7.410 SECS 398 MB 9680 ---- 26 할당 sumofvar 0.952 0.983 SECS 216MB 0
예를 들어 할당을 실행하는 것을 관찰하십시오.z첫 번째 실행의 2.231초에 비해 단 0.593초가 걸렸습니다. 동일한 순서로 세트를 일관되게 참조함으로써 시간이 많이 소요되는 모든 사례에서 상당한 비율의 감소가 달성되었습니다.
루프를 할당으로 교체
다음 명령문은 매개크레이지 슬롯에 상수 값을 할당합니다.
루프((i,j,k),p(i,j,k)=2;)
대신 다음 할당이 선호됩니다.
p(i,j,k)=2;
관련 케이스에 대한 할당 및 크레이지 슬롯 제한
과제
생산 능력과 다양한 제품에 대한 수요가 서로 다른 일련의 도시가 있다고 가정합니다. 우리는 각 도시에서 다른 도시까지의 최대 운송 비용(거리, 배송량 및 고정 요소에 따라 다름)을 알고 싶습니다. 이 비용은 다음과 같은 방법으로 계산할 수 있습니다.
c "도시"를 설정합니다 / c1*c800 /
p "제품" / p1*p10 /;
별칭(c,cc);
매개크레이지 슬롯 용량(c,p) "도시 c의 제품 p에 대한 생산 능력"
수요(c,p) "도시 c의 제품 p에 대한 수요"
distance(c,cc) "두 도시 사이의 거리";
*희소하고 무작위로 생성되는 데이터
용량(c,p)$(uniform(0,1)<0.05) = 균일Int(150,250);
수요(c,p)$(uniform(0,1)<0.025) =uniformInt(50,150);
distance(c,cc)$(not sameas(c,cc)) =uniformInt(10,800);
Parameter maxCost(c,cc) "두 도시 간 최대 교통비";
maxCost(c,cc) = sum(p, min(용량(c,p), 수요(cc,p))*거리(c,cc)*90);
공연프로필다음과 같은 내용을 알려줍니다.
---- 16 할당 maxCost 0.265 0.436 SECS 19MB 8756
우리가 알고 있듯이 매개크레이지 슬롯는최대 비용첫 번째 도시에 생산 능력이 있고 두 번째 도시에 수요가 있는 제품이 없으면 한 쌍의 도시에 대해 0이 됩니다. 마지막 할당에 대한 실행 시간을 줄일 수 있습니다.
c "도시"를 설정합니다 / c1*c800 /
p "제품" / p1*p10 / ;
별칭(c,cc);
매개크레이지 슬롯 용량(c,p) "도시 c의 제품 p에 대한 생산 능력"
수요(c,p) "도시 c의 제품 p에 대한 수요"
distance(c,cc) "두 도시 사이의 거리";
*희소하고 무작위로 생성되는 데이터
용량(c,p)$(uniform(0,1)<0.05) =uniformInt(50,150);
수요(c,p)$(uniform(0,1)<0.025) =uniformInt(50,150);
distance(c,cc)$(not sameas(c,cc)) =uniformInt(10,800);
Parameter maxCost(c,cc) "두 도시 간 최대 교통비";
maxCost(c,cc)$sum(p, 용량(c,p)*수요(cc,p))
= sum(p, min(용량(c,p), 수요(cc,p))*거리(c,cc)*90);
그래서 우리는 계산을 하지 않았습니다최대 비용우리가 이전에 알았더라면 어쨌든 그것은 0임에 틀림없었습니다. 이로 인해 런타임이 단축됩니다.
---- 17 할당 maxCost 0.031 0.187 SECS 19MB 8756
- 참고
- 관련 사례에 대한 할당 계산을 제한하려면 다음을 사용하는 것이 좋습니다.달러 조건그리고필터링 세트. 이러한 개념은 장에서 자세히 소개되고 논의됩니다.조건식, 할당 및 크레이지 슬롯.
더 많은 예를 보려면 섹션을 참조하세요.조건부 할당그리고조건부 색인 작업.
크레이지 슬롯 및 방정식
할당과 마찬가지로 크레이지 슬롯 및 방정식은 불필요한 비효율성을 피하기 위해 관련 사례로 제한되어야 합니다.달러 조건그리고필터링 세트정의 영역뿐만 아니라 크레이지 슬롯 본문에서도 사용될 수 있습니다.
이전 단락의 할당 예를 확장하고 운송 모델에서 생성된 데이터를 사용하겠습니다.
c "도시"를 설정합니다 / c1*c800 /
p "제품" / p1*p10 / ;
별칭(c,cc);
매개크레이지 슬롯 용량(c,p) "도시 c의 제품 p에 대한 생산 능력"
수요(c,p) "도시 c의 제품 p에 대한 수요"
distance(c,cc) "두 도시 사이의 거리";
*희소하고 무작위로 생성되는 데이터
용량(c,p)$(uniform(0,1)<0.05) = 균일Int(150,250);
수요(c,p)$(uniform(0,1)<0.025) =uniformInt(50,150);
distance(c,cc)$(not sameas(c,cc)) =uniformInt(10,800);
매개크레이지 슬롯 shipCost(c,cc) "케이스당 두 도시 간 운송 비용"
maxCost(c,cc) "두 도시 간 최대 운송 비용";
배송비용(c,cc) = 거리(c,cc)*90;
maxCost(c,cc)$sum(p, 용량(c,p)*수요(cc,p))
= sum(p, min(용량(c,p), 수요(cc,p))*shipCost(c,cc));
크레이지 슬롯
x(c,cc,p) "케이스의 배송 수량"
z "총 운송 비용(수천 달러)" ;
양수 크레이지 슬롯 x ;
방정식
비용 "목적 함수 정의"
Supply(c,p) "공장 i의 공급 제한을 준수합니다"
dem(cc,p) "시장 j의 수요를 충족합니다";
비용.. z =e= sum((c,cc,p), shipCost(c,cc)*x(c,cc,p)) ;
공급(c,p).. sum(cc, x(c,cc,p)) =l= 용량(c,p) ;
dem(cc,p)..sum(c, x(c,cc,p)) =g= 수요(cc,p) ;
모델 전송 /all/ ;
z를 최소화하는 lp를 사용하여 전송을 해결합니다.
그프로필 요약는 크레이지 슬롯을 생성하는 데 다소 비용이 많이 들고 모델 크기로 인해 솔루션을 읽는 데 시간이 걸린다고 말합니다.
---- 프로필 요약(18개 레코드 처리됨)
98.780 1.070GB 34 크레이지 슬롯 dem (8000)
26.864 0.515GB 38 해결 읽기 전송
25.303 0.454GB 32 크레이지 슬롯 비용 (1)
6.599 0.813GB 33 크레이지 슬롯 공급(8000)그러나 이전 예에서와 같이 우리는 제품이p도시에서는 배송되지 않습니다.c도시로cc첫 번째 도시에 생산 능력이 없거나 두 번째 도시에 수요가 없는 경우. 따라서 우리는 솔루션과 관련이 없다는 것을 알고 있는 크레이지 슬롯와 방정식을 생성하지 않음으로써 모델의 크기를 줄일 수 있습니다. 다음은 개선된 방정식 공식입니다.
비용.. z =e= sum((c,cc,p)$(용량(c,p)*수요(cc,p)), shipCost(c,cc)*x(c,cc,p)) ;
공급(c,p)$capacity(c,p).. sum(cc$demand(cc,p), x(c,cc,p)) =l= 용량(c,p) ;
dem(cc,p)$수요(cc,p).. sum(c$capacity(c,p), x(c,cc,p)) =g= 수요(cc,p) ;
이것은 모델의 크기를 줄여 모델을 생성하고 솔루션을 로드하는 실행 시간을 크게 줄입니다.
-- 프로필 요약(18개 레코드 처리됨)
0.031 0.035GB 33 크레이지 슬롯 비용 (1)
0.031 0.034GB 39 해결 읽기 전송
0.016 0.035GB 34 크레이지 슬롯 공급(380)크레이지 슬롯에 주목dem생성이 빠르게 완료되었기 때문에 더 이상 요약에 표시되지 않습니다.
크레이지 슬롯 조건에 대한 자세한 내용은 섹션을 참조하세요.조건 크레이지 슬롯.
모델의 크기를 적절하게 유지
GAMS 내의 모델 솔루션에는 대규모 행렬의 조작과 많은 계산이 필요한 경우가 많습니다. 대부분의 솔버의 핵심에는 희소 행렬 인버터, 수렴 및 실행불가능 허용오차 세트와 같은 많은 수치 절차가 포함됩니다. 이러한 절차 내에서 수치적 문제가 종종 발생합니다. 제대로 확장되지 않은 모델은 해석에 과도한 시간이 걸리거나 솔버가 실패할 수 있습니다. GAMS는 사용자가 잘 확장된 모델을 공식화하는 데 도움을 줄 수 있습니다. 이에 대한 자세한 내용은 섹션에서 확인할 수 있습니다.모델 스케일링 - 스케일 옵션그리고크레이지 슬롯 및 방정식 스케일링.
기타 접근법
섹션에서 논의된 기술에 추가로느린 프로그램 실행의 주요 원인 제거위에서 다음 접근 방식은 프로그램 실행에 필요한 시간을 줄이는 데 도움이 될 수 있습니다.
- 다른 적절한 해결사를 시도 중입니다.
- 모델을 재구성하는 중입니다. 다른 모델 유형이 사용되는 방식으로 모델을 다시 구성하면 해결하기가 더 쉽거나 고급 솔버 기술을 사용할 수 있는 경우 특히 좋은 결과를 얻을 수 있습니다.
- 섹션에 설명된 대로 NLP 모델의 시작점 사용초기값 지정.
- 기억을 시간으로 교환합니다.
우리는 메모리가 시간과 어떻게 거래될 수 있는지 보여주는 예를 들어 이 주제에 대한 논의를 마무리합니다. 모델에서 광범위한 계산이 여러 번 반복되는 경우 계산이 한 번만 수행된 다음 결과가 저장되고 나중에 액세스되도록 코드를 재구성할 수 있습니다. 다음 크레이지 슬롯을 고려하십시오.
obj.. z =e= 합계[(i,j,k,l), a(i,j,k,l)*sum(m, u(m,i))];
새로운 매개크레이지 슬롯를 정의하면 실행 시간이 크게 줄어들 수 있습니다.p, 두 번째 합계 및 방정식에서 이 매개크레이지 슬롯를 사용하는 경우:
매개크레이지 슬롯 p(i);
p(i) = 합(m, u(m,i));
...
obj.. z =e= 합계[(i,j,k,l), a(i,j,k,l)*p(i)];
단 하나의 주의사항이 있습니다: 사용자는 입력 데이터가 여기에 있는지 신중하게 고려해야 합니다.u(m,i), 새 매개크레이지 슬롯에 대한 할당 사이에 수정됨p그리고 크레이지 슬롯은 다음과 같습니다.p사용됩니다. 만일u이 업데이트되면 할당 문을 반복해야 합니다. 그렇지 않으면 크레이지 슬롯을 입력하는 데이터가 최신이 아닙니다.
효율성 증가: 메모리 사용 감소
느린 프로그램 실행 외에도 과도한 메모리 사용은 모델러에게 문제가 될 수 있습니다. 이 섹션에서는 비정상적인 메모리 사용의 원인을 찾는 방법에 대한 몇 가지 접근 방식을 제시하고 이에 대한 조언을 제공합니다.주요 원인 제거그것을 위해서.
과도한 메모리 사용 원인 찾기
과도한 메모리 사용의 원인을 찾는 주요 기술은 느린 프로그램 실행의 원인을 찾는 기술과 동일합니다. 섹션에서 이러한 기술에 대해 논의했습니다.느린 프로그램 실행 원인 찾기위.
또한 옵션dmpUserSym이런 맥락에서 유용합니다. GAMS는 프로그램에서 옵션이 지정된 지점에서 각 기호에 대해 저장된 레코드 수를 보고합니다.dmpUserSym대략적인 메모리 추정치와 함께 삽입됩니다.
다음 예를 고려해보세요:
i /1*5 /, j /1*5 /, k /1*5 /, l /1*5 /,를 설정합니다.
m /1*5 /, n /1*5 /, o /1*5 /;
매개크레이지 슬롯 y(i,j,k,l,m,n,o)
q(i,j,k);
크레이지 슬롯 x(i,j,k,l,m,n,o)
f(i,j,k)
obj;
y(i,j,k,l,m,n,o) = 10;
q(i,j,k) = 10;
x.up(i,j,k,l,m,n,o) = 10;
x.scale(i,j,k,l,m,n,o) = 1000;
방정식 z(i,j,k,l,m,n,o)
해상도(i,j,k)
산부인과;
ob..obj =e= sum((i,j,k,l,m,n,o), x(i,j,k,l,m,n,o));
z(i,j,k,l,m,n,o).. x(i,j,k,l,m,n,o) =l= 8;
res(i,j,k)..f(i,j,k) =l= 7;
모델 메모리 /all/;
옵션 dmpUserSym;
lp를 사용하여 메모리 최대화 obj를 해결합니다.
옵션 설명에는dmpUserSymsolv 문 앞에 추가되었습니다. 다음을 생성합니다.메모리 덤프다음에 포함되어 있습니다.실행 출력목록 파일 중:
기호 테이블 덤프(사용자 기호만), NR 항목 = 16 항목 ID 유형 DIM 길이 메모리 정의됨 할당된 데이터KNOWN 135 i 세트 1 5 0MB 참 거짓 참 136 j 세트 1 5 0MB 참 거짓 참 137k 세트 1 5 0MB 참 거짓 참 138 l 세트 1 5 0MB 참 거짓 참 139m 세트 1 5 0MB 참 거짓 참 140 n 세트 1 5 0MB 참 거짓 참 141 o 세트 1 5 0MB 참 거짓 참 142 y PARAM 7 78125 3MB 거짓 참 거짓 143 q PARAM 3 125 0MB 거짓 참 거짓 144 x VAR 7 78125 5MB 거짓 참 거짓 145 f VAR 3 0 0MB 거짓 참 거짓 146 obj VAR 0 0 0MB 거짓 참 거짓 147 z EQU 7 0 0MB 거짓 참 거짓 148개 해상도 EQU 3 0 0MB 거짓 참 거짓 149 ob EQU 0 0 0MB 거짓 참 거짓 150 메모리 모델 0 3 TRUE TRUE TRUE 기호 테이블 덤프의 끝
열ID기호, 열의 이름을 포함합니다.TYPE다음을 제공합니다데이터 유형해당 항목의 열딤인덱스 및 열 수를 보고합니다.길이메모리 사용과 관련된 레코드 수를 제공하며 열에서 추정됩니다.기억값. 다른 열은 이 토론과 관련이 없습니다.
열에서 개수가 많은 행을 관찰하세요길이저장해야 하는 내부 기록이 많은 GAMS 프로그램 내의 기호를 나타냅니다. 이는 해당 메모리 요구 사항과 관련이 있습니다. 또한 모든 길이 개수가 동일한 의미를 갖는 것은 아닙니다. 특히, 크레이지 슬롯와 방정식은 연관된 경계, 수준, 한계 및 척도를 갖기 때문에 매개크레이지 슬롯보다 요소당 더 많은 메모리를 사용합니다. 매개크레이지 슬롯는 세트보다 요소당 더 많은 메모리를 사용합니다. 세트에는 하나의 표시기만 필요할 수 있기 때문입니다.예또는아니요. 그러나 집합 요소에 대한 설명 텍스트로 인해 집합 요소에 대한 메모리 요구 사항이 늘어날 수 있습니다.
그럼에도 불구하고 사용자는 이 보고서를 사용하여 많은 기록이 있는 항목을 식별하고 모든 항목이 실제로 필요한지 확인할 수 있습니다. 자세한 내용은 섹션을 참조하세요.과도한 메모리 사용의 주요 원인 제거아래.
과도한 메모리 사용의 주요 원인 제거
섹션에 자세히 설명되어 있음프로그램 실행 속도 저하의 주요 원인 제거위에서, 느린 프로그램 실행의 주요 원인은 다음과 같습니다.일관되지 않은 색인 순서세트가 참조될 때 및관련 없는 사례를 고려함. 이러한 프로그래밍 습관은 과도한 메모리 사용을 유발하는 경향이 있습니다. 이 섹션에서는 다음에 대한 몇 가지 조언을 제공합니다.메모리 트랩 방지그리고 어떻게 하는지 보여주세요메모리가 지워질 수 있음더 이상 필요하지 않은 데이터입니다.
기억 함정 피하기
사용자가 세트 또는 세트 요소에 대한 긴 설명 텍스트가 있는 데이터베이스에서 데이터를 가져오는 경우 실수로 많은 메모리를 사용할 수 있습니다. 또한 크기 조정이나 경계에 대한 크레이지 슬롯 속성을 설정하는 것도 문제가 될 수 있습니다. 다음 예를 고려해보세요.
x.scale(i,j,k,l,m) = 100;
x.lo(i,j,k,l,m) = 10;
x.up(i,j,k,l,m) = 77;
이러한 할당은 아마도 특정 문제와 관련된 것보다 더 많은 값을 설정하게 될 것입니다. 따라서 어떤 레이블 조합이 실제로 필요한지 신중하게 고려하고 달러 조건이나 필터링 세트를 사용하여 이러한 경우에 할당을 제한하는 것이 좋습니다. 자세한 내용은 섹션을 참조하세요.조건부 할당.
불필요한 데이터 메모리 지우기
어떤 시점에는 필요하지만 나중에는 필요하지 않은 데이터를 위해 많은 메모리 공간이 사용되는 경우가 있습니다. 다음의 간단한 예를 고려해 보세요.
설정 i /1*1000/
j /1*1000/;
매개크레이지 슬롯 거리(i,j)
비용(i,j);
거리(i,j) = 100+ord(i)+ord(j);
비용(i,j) = 4+8*dist(i,j);
매개크레이지 슬롯가 다음과 같다고 가정합니다.거리은 여기에서만 사용되며 프로그램의 다른 곳에서는 사용되지 않습니다. 따라서 사용자는 다음과 연결된 데이터가 차지하는 메모리 공간을 확보할 수 있습니다.거리. 옵션지우기이를 달성하기 위해 사용될 수 있습니다:
옵션 지우기 = 거리;
이것은 다음과 관련된 매트릭스의 모든 항목을 재설정합니다.거리0으로.
또는 더 이상 필요하지 않은 식별자는 할당문을 사용하여 기본값으로 재설정될 수 있습니다. 위의 예에서는 다음과 같이 작성할 수 있습니다.
거리(i,j) = 0;
이 명령문은 옵션 명령문과 동일한 효과를 갖습니다. 옵션 문의 장점은 방정식이나 크레이지 슬롯를 지우고 여러 개로 만드는 경우 특히 유용한 보다 간결한 대안을 제공한다는 것입니다.크레이지 슬롯 속성또는크레이지 슬롯 속성영향을 받았습니다.
달러 제어 옵션에 유의하세요$클리어그리고$kill또한 메모리를 확보하는 데 사용될 수 있습니다. 이는 메모리 소비에 비슷한 영향을 미치지만 부작용이 다른 컴파일 시간 지시문입니다. while$클리어값을 기본값으로 재설정합니다.$kill프로그램에서 식별자를 완전히 제거합니다. 따라서 "죽인" 식별자는 나중에 다른 선언 및 정의문에서 사용될 수 있습니다. 예를 들어 다음 코드 조각은 유효합니다.
i /1, 2 ,3/ 설정;
$나를 죽여라
i /a, b, c/를 설정합니다.
함께$클리어대신$kill이로 인해 컴파일 오류가 발생합니다.
HEAPLIMIT로 메모리 제한 설정
서버 환경 및 기타 경우(예: 가상 메모리 사용을 피하기 위해) GAMS 실행에서 사용할 수 있는 메모리 양은 제한되어야 할 수 있습니다. 명령줄 매개크레이지 슬롯힙 제한이 목적을 수행합니다. GAMS 컴파일 및 실행을 위한 메모리 양은 지정된 수(MB)로 제한됩니다. 데이터 저장소가 이 한도를 초과하면 작업이 종료됩니다.반환 코드 10, 메모리 부족. 또한, 함수힙 제한현재 제한을 조사하고 재설정하는 데 사용될 수 있습니다.
다음에 대한 메모리 사용 제한에 유의하세요.해결사 실행GAMS 프로그램 내에서는 불가능합니다. 그러나 NLP 솔버 CONOPT와 같은 일부 솔버에는 솔버가 지정된 것보다 더 많은 동적 메모리를 사용하지 않도록 보장하는 자체 heapLimit 옵션이 있습니다.
수수께끼가 작동하지 않는 코드를 복구하기 위한 조언
GAMS 실행이 종료되어 다음을 얻을 수 없다고 가정합니다.프로필 출력(예: GAMS의 메모리 부족 및 충돌로 인해). 메모리 오버런 오류로 인해 작업이 오작동할 때 일반적으로 운영 체제 버퍼 처리 절차에서 프로필 정보의 마지막 몇 줄이 손실됩니다. 이 경우 문제를 어떻게 찾을 수 있나요?
섹션에 설명된 기술을 사용하는 것이 좋습니다.모델링 기술위. 또한, 대부분의 경우 작동했던 마지막 GAMS 문을 검색할 때 코드를 연속적으로 비활성화하면 도움이 됩니다. 이는 다음을 사용하여 수행할 수 있습니다.댓글. 어느 시점에서 실행이 제대로 종료되면 사용자는 코드 성능이 다시 나빠질 때까지 비활성화된 마지막 문의 일부를 천천히 활성화합니다. 용어를 반복적으로 활성화 및 비활성화함으로써 정확한 문제 용어를 찾을 수 있습니다.저장 및 다시 시작 기능또한 특정 명령문까지 결과를 저장한 후 문제가 있다고 의심되는 명령문만 실행하는 데 사용할 수도 있습니다.