무료 슬롯 및 다시 시작 기능

GAMS는 입력 파일에 제공된 정보를 중간 파일(주로 바이너리 파일)로 무료 슬롯합니다.작업 파일또는스크래치 파일. 이러한 파일 중 일부는 GAMS와 솔버 간에 정보를 교환하는 데 사용됩니다. 일반적으로 GAMS 실행이 완료되기 직전에 삭제됩니다. 그러나 이러한 중간 파일은 입력 파일을 처리하고 결과를 무료 슬롯한 후 나중에 이 파일을 다시 로드하고 다른 입력 파일을 계속 처리하는 데 사용될 수 있습니다. 따라서, 입력 파일은 중간 파일을 사용하여 순차적으로 처리될 수 있다. 이는 예를 들어 유사한 모델이 여러 번 실행되고 모두 동일하게 큰 초기화 부분을 공유할 때 필요한 시간을 줄이는 데 도움이 될 수 있는 유용한 기능입니다.

동일한 프로세스가 다른 방식으로 설명될 수 있습니다. 평소와 같이 대규모 GAMS 프로그램이 실행되고 출력 파일이 생성된다고 가정합니다. 큰 프로그램이 두 부분으로 나누어져 있다고 가정해 보겠습니다. 첫 번째 부분이 실행되고 결과 작업 파일이 결과 목록 파일과 함께 무료 슬롯됩니다. 그런 다음 이전에 무료 슬롯된 작업 파일에서 데이터를 읽어온 후 두 번째 부분이 실행되고 두 번째 부분에 대한 새 목록 파일이 생성됩니다. 두 목록 파일의 내용은 대규모 프로그램이 중단 없이 처리되었을 때 첫 번째 실행의 출력 내용과 동일합니다. 내용의 배열만 약간 다를 뿐입니다. 파일을 분할하면 GAMS 작업을 중단하고 나중에 정보 손실 없이 다시 시작할 수 있습니다. 또한 이후 부분에서 변경 사항이 발생하거나 오류가 수정될 수 있습니다.

참고
  • 작업 파일은 실행이 끝날 때 GAMS에 알려진 모든 정보(선언, 값, 옵션 설정 및 달러 제어 옵션 포함)를 보존합니다.
  • 작업 파일은 특정 기계가 아니므로 플랫폼 간에 이식 가능합니다. 그러나 한 버전의 GAMS로 생성된 작업 파일은 이전 GAMS 버전으로 다시 시작하는 데 사용할 수 없습니다(명령줄 매개변수 제외).forceWork설정됨).
  • 절대 또는 상대 경로 이름(예: for파일 넣기)이 존재하지 않거나 디렉터리 구분 기호가 잘못되어 실행 오류가 발생할 수 있습니다. 게다가 작업 파일의 코드가 다른 플랫폼에는 존재하지 않을 수 있는 프로그램을 실행하는 경우(예:gdxxrwLinux) GAMS 실행으로 인해 실행 오류가 발생할 수도 있습니다.

이 장에서는 섹션의 무료 슬롯 및 다시 시작 기능의 기본 사항을 설명합니다.기본 사용법섹션에서 몇 가지 사용 사례를 제시합니다.사용 사례. 작업 파일의 콘텐츠에 대한 무단 액세스 방지 및 난독화는 섹션에서 논의됩니다.보안 작업 파일그리고난독화된 작업 파일입니다. GAMS에서 무료 슬롯하고 다시 시작하기 위한 모든 명령줄 매개변수에 대한 개요는 섹션에 나와 있습니다.무료 슬롯 및 다시 시작 옵션(장GAMS 호출 및 명령줄 매개변수).

기본 사용법

큰 입력 파일의 컴파일을 여러 구성요소와 단계로 나누는 메커니즘은 명령줄 매개변수에 의해 제공됩니다.무료 슬롯그리고다시 시작.

다음은 잘 알려진 운송 모델을 사용하여 무료 슬롯하고 다시 시작하는 방법을 보여줍니다.[TRNSPORT]. 먼저, 코드가 세 부분으로 분할되어 파일이 생성됩니다.transmodel.gms, transolve.gmstranreport.gms. 파일transmodel.gms무료 슬롯 문을 포함하여 무료 슬롯의 첫 번째 부분을 포함합니다.

세트
   i "통조림 공장" / 시애틀, 샌디에고 /
   j "시장" / 뉴욕, 시카고, 토피카 / ;

매개변수
   a(i) "경우에 따라 식물 i의 용량"
      /시애틀 350
           샌디에이고 600 /

   b(j) "경우에 따라 시장 j의 수요"
      / 뉴욕 325
           시카고 300
           토피카 275 / ;

테이블 d(i,j) "1000마일 단위의 거리"
                  뉴욕 시카고 토피카
   시애틀 2.5 1.7 1.8
   샌디에고 2.5 1.8 1.4 ;

스칼라 f "1000마일당 운임(달러/케이스)" /90/ ;

매개변수 c(i,j) "$1000/케이스의 운송 비용" ;
c(i,j) = f * d(i,j) / 1000 ;

변수
    x(i,j) "케이스의 선적 수량"
    z "총 운송 비용 1000$" ;
양수 변수 x ;

방정식
    비용 "목적 함수 정의"
    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/ ;

파일transolve.gmssolve 문이 포함되어 있습니다:

z를 최소화하는 lp를 사용하여 전송을 해결합니다.

그리고 세 번째 파일,tranreport.gms, 표시 문을 포함합니다:

x.l, x.m 표시 ;

3개의 파일을 (올바른 순서로) 연결하면 원본 무료 슬롯이 생성되는 것을 관찰하세요[TRNSPORT].

작업 파일 무료 슬롯

정보transmodel.gmsGAMS에 대한 다음 호출을 사용하여 무료 슬롯할 수 있습니다.

> gams transmodel save=s1

이 명령줄 명령문은 출력 파일을 생성합니다transmodel.lst그리고 작업 파일s1.g00현재 작업 디렉토리에 있습니다. 명령줄 매개변수에 유의하세요.s은 다음과 동의어입니다.무료 슬롯.

작업 파일에서 다시 시작

다음 호출을 고려해보세요:

> gams transolve restart=s1

GAMS는 이름의 작업 파일을 읽습니다.s1.g00그리고 무료 슬롯된 정보를 재생성합니다transmodel.gms. 그런 다음transolve.gms이 실행되고 결과는 다음과 같습니다.transmodel.gms그리고transolve.gms처형되었습니다. 참고로 출력 파일은transmodel.lst무료 슬롯의 에코 프린트가 포함되며transolve.lstsolve 문의 에코 인쇄와 해석으로 생성된 모든 출력이 포함됩니다.

명령줄 매개변수에 유의하세요r다음의 동의어입니다다시 시작.

실행을 다시 시작하려면 계속하려면 항상 GAMS 입력 파일이 필요합니다. 다시 시작해도 작업 파일은 변경되지 않습니다. 다양한 연속 입력 파일을 사용하여 특정 실행을 여러 번 계속하기 위해 반복적으로 사용될 수 있습니다.

무료 슬롯 및 재시작 순서

순차적으로 실행해야 하는 파일이 두 개 이상인 경우 두 번째 및 기타 최종이 아닌 실행은 다음 다시 시작을 위해 입력 파일을 생성해야 합니다. 따라서 작업 파일을 무료 슬롯해야 합니다.

무료 슬롯 분할에 따라[TRNSPORT]세 개의 파일에transmodel.gms, transolve.gmstranreport.gms, 전체를 실행하는 일련의 GAMS 호출trn스포츠무료 슬롯은 다음과 같을 수 있습니다:

> gams transmodel s=s1
> gams는 r=s1 s=s2를 변환합니다.
> gams tranreport r=s2

목록 파일tranreport.gms에는 디스플레이 문의 에코 인쇄가 포함된 컴파일 출력, 디스플레이 문에서 생성된 출력이 포함된 최종 실행 요약 및 파일 요약이 포함됩니다. 세 가지 입력 파일 모두의 목록 파일은 다음과 동일한 내용을 갖습니다.trnsport.lst(다음 실행에 의해 생성됨trnsport.gms).

세 개의 파일이 일련의 순서로 처리될 수도 있음을 관찰하십시오.$포함 파일문장. 를 사용하면 장점이 있습니다.무료 슬롯그리고다시 시작대신 섹션에 기능이 제공됩니다.사용 사례아래.

일반적인 실수 방지

무료 슬롯하고 다시 시작 기능을 사용할 때 발생하는 일반적인 실수는 동일한 파일에서 GAMS를 두 번 실행하는 것입니다. 예:

> gams trnsport s=trans
> 게임 tnsport r=trans

이 경우 모든 데이터 및 방정식 정의가 반복되므로 GAMS에서 각 데이터 항목이 한 번만 정의될 수 있으므로 두 번째 실행에 대한 컴파일 오류가 발생합니다.

또한, 입력 파일의 내용이 작업 파일의 내용과 일치하는지 확인하는 것은 무료 슬롯러의 책임입니다. 단, 컴파일러는 이전에 선언되지 않은 기호에 대한 참조와 같은 불일치를 감지하면 오류를 발행합니다.

작업 파일에 기호 접두사 추가

다시 시작 파일을 작동하는 일부 보고 코드를 작성하고 이전 프로그램에서 사용되지 않은 새로운 기호 이름이 필요하다고 가정합니다. GAMS는 작업 파일의 모든 기호 앞에 지정된 문자열을 추가하여 이를 달성하는 편리하고 체계적인 방법을 제공합니다. 운송 무료 슬롯을 다시 사용하여 다음 예를 고려하십시오.[TRNSPORT]:

> gams trnsport s=접두어가 붙음 SymPrefix=aa_

모델을 해결하고 작업 파일을 무료 슬롯합니다.prefixed.g00. 명령줄 매개변수symPrefix작업 파일의 모든 기호에 접두어가 붙는 효과가 있습니다.aa_. 다음 단계에서는 다음과 같은 간단한 보고 코드를 고려하세요. 이 코드는 다음과 같은 파일에 무료 슬롯되어 있습니다.report.gms:

스칼라 i / 0 /;
loop(aa_i, i = i+1);
'통조림 공장의 수'를 표시합니다. i;

이 코드는 작업 파일에서 다시 시작하여 실행됩니다.prefixed.g00. 따라서 루핑 세트aa_i세트와 동일합니다i무료 슬롯에서[운송]. 원본 무료 슬롯의 모든 기호에는 접두사가 붙어 있으므로 보고 목적으로 편리한 기호 이름을 사용할 수 있습니다. 실행report.gms다음 호출로 달성됩니다:

> 게임 보고서 r=접두사

결과 목록 파일에는 다음 출력이 포함됩니다:

---- 통조림 공장 수 76개
            매개변수 i = 2.000

사용 사례

작업 파일의 기본 기능은 생산 비용이 많이 드는 정보를 보존하는 것입니다. 다음은 작업 파일의 여러 사용 사례에 대해 설명합니다.

무료 슬롯과 데이터의 분리

모델과 데이터의 분리는 GAMS 모델링 패러다임의 핵심 원칙 중 하나입니다. 무료 슬롯하고 다시 시작 기능을 사용하면 이러한 분리를 활용하는 데 도움이 됩니다.

무료 슬롯과 데이터의 분리는 운송 무료 슬롯에서 설명됩니다.[TRNSPORT]. 먼저 GAMS 파일을 고려하세요.transportmodel.gms여기에는 모든 데이터와 실행 문을 제거하여 얻은 운송 문제의 대수적 표현만 포함되어 있습니다.[TRNSPORT]:

통조림 식물을 설정합니다
     j 시장 ;

매개변수 a(i) "경우에 따른 플랜트 i의 용량"
            b(j) "경우에 따라 시장 j의 수요"
            c(i,j) "1000$/케이스의 운송 비용"
            d(i,j) "1000마일 단위의 거리" ;

스칼라 f "1000마일당 $/케이스 단위의 화물" ;

변수 x(i,j) "케이스의 배송 수량"
            z "총 운송 비용 1000$" ;
양수 변수 x ;

방정식 비용 "목적 함수 정의"
           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/ ;

둘째, GAMS 파일을 고려하세요transportdata.gms무료 슬롯의 데이터와 해석 및 표시 문이 포함되어 있습니다.

i를 설정합니다 / 시애틀, 샌디에고 /
       j / 뉴욕, 시카고, 토피카 / ;

매개변수 a(i) / 시애틀 350
                    샌디에이고 600 /
            b(j) / 뉴욕 325
                    시카고 300
                    토피카 275 / ;

테이블 d(i,j)
                  뉴욕 시카고 토피카
    시애틀 2.5 1.7 1.8
    샌디에고 2.5 1.8 1.4 ;

스칼라 f / 90 / ;

c(i,j) = f * d(i,j) / 1000 ;

z 를 최소화하는 lp를 사용하여 전송을 해결합니다.
x.l, x.m 표시 ;

두 번째 파일(transportdata.gms)은 무료 슬롯 정의로 단독으로 실행할 수 없습니다.운송누락되었습니다. 그러나 첫 번째 파일()을 먼저 실행할 수 있습니다.transportmodel.gms) 작업 파일을 무료 슬롯합니다. 그런 다음 이 작업 파일에서 다시 시작하여 두 번째 파일을 실행할 수 있습니다.

> gams Transportmodel.gms s=transmod
> gams Transportdata.gms r=transmod

무료 슬롯과 데이터의 고급 분리

이전 예에서는 일부 실행 시간 명령문, 즉 할당c, 그해결디스플레이여기서 데이터 파일에서 수행됩니다. 무료 슬롯 실행 로직이 더 복잡하다면 이를 데이터 파일에 추가하고 싶지 않습니다. 따라서 이 예에서는 첫 번째 파일에서 다시 시작 파일을 생성하지만 컴파일만 하고 실행하지는 않습니다(섹션에서 컴파일 단계와 실행 단계의 차이점 참조)GAMS 컴파일 시간 및 실행 시간 단계):

$on비어 있음
i(*) 통조림 공장 세트 / /
     j(*) 시장 // ;

매개변수 a(i) "경우에 따라 플랜트 i의 용량" //
            b(j) "경우에 따라 시장 j의 수요" //
            c(i,j) "1000$/케이스의 운송 비용"
            d(i,j) "1000마일 단위의 거리" / /;

스칼라 f "1000마일당 $/케이스 단위의 화물" / 0 /;

c(i,j) = f * d(i,j) / 1000 ;

변수 x(i,j) "케이스의 배송 수량"
            z "총 운송 비용 1000$" ;
양수 변수 x ;

방정식 비용 "목적 함수 정의"
           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를 사용하여 전송을 해결합니다.
x.l, x.m 표시 ;

둘째, 무료 슬롯의 데이터는 포함하지만 다른 실행 시간 설명은 포함하지 않는 파일을 고려합니다. 이미 빈 데이터 문이 있기 때문에 (/ /) 첫 번째 파일의 데이터 항목에 대해 컴파일러에게 다음을 사용하여 실제 데이터가 포함된 두 번째 데이터 문을 허용하도록 지시해야 합니다.$onMulti:

$onMulti
세트 i / 시애틀, 샌디에고 /
       j / 뉴욕, 시카고, 토피카 / ;

매개변수 a(i) / 시애틀 350
                    샌디에이고 600 /
            b(j) / 뉴욕 325
                    시카고 300
                    토피카 275 / ;

테이블 d(i,j)
                  뉴욕 시카고 토피카
    시애틀 2.5 1.7 1.8
    샌디에고 2.5 1.8 1.4 ;

스칼라 f / 90 / ;
$off멀티

무료 슬롯을 실행하기 위해 먼저 컴파일하지만 첫 번째 무료 슬롯은 실행하지 않습니다(명령줄 매개변수 참조액션=c) 무료 슬롯 파일을 생성합니다. 다음으로 두 번째 모델을 실행합니다. 이는 연속적인 컴파일을 수행하고 두 번째 파일의 데이터 문을 컴파일한 다음 첫 번째 파일의 실행 시간 문을 실행합니다(c(i,j)=..., 해결 ...디스플레이 ...) 및 두 번째(여기에는 없음).

> gams Transportmodel.gms action=c s=transmod
> gams Transportdata.gms r=transmod

간결한 목록 파일 생성

기본적으로 GAMS 목록 파일에는 많은 구성요소가 있습니다. 장을 참조하세요.GAMS 출력41192_41320

운송 무료 슬롯의 개편을 회상[TRNSPORT]무료 슬롯 파일로trnsportmodel.gms및 데이터 및 해결 파일trnsportdata.gms에서이전 섹션. 이제 두 개의 추가 파일을 추가하는 것을 고려하십시오. 첫 번째 이름은trnsportreport.gms, 보고를 위한 사후 솔루션 계산이 포함되어 있습니다.

매개변수 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('합계','합계') = 합계(j, m('합계',j));

두 번째, 호출된 것trnsportdisplay.gms, 표시 문만 포함:

옵션 소수점 = 0;
m 표시;

이 네 개의 파일을 사용하여 다음 무료 슬롯 및 재시작 순서를 호출할 수 있습니다:

> gams trnsportmodel s=trans1
> 게임 tnsportdata r=trans1 s=trans2
> 게임 trnsportreport r=trans2 s=trans3
> 게임 tnsportdisplay r=trans3

출력 파일trnsportdisplay.lst간단합니다. 에코 인쇄, 실행 시간 및 파일 요약과는 별도로 표시 문에서 생성된 출력만 포함됩니다.

-- 52 PARAMETER m 케이스 내 상품 이동

             뉴욕 시카고 토피카 총계

시애틀 50 300 350
샌디에이고 275 275 550
총 325 300 275 900

이 방법으로 간결하고 필요한 정보만 포함하는 출력 파일을 생성하는 동시에 더 자세한 출력을 다른 목록 파일에 무료 슬롯하고 필요한 경우 검사할 수 있습니다.

증분 프로그램 개발

GAMS 프로그램은 종종 단계적으로 개발됩니다. 일반적인 접근 방식은 집합 문, 테이블 및 데이터 조작으로 시작한 다음 방정식을 선언하고 정의한 다음 모델 및 풀이 문, 마지막으로 보고서 생성을 위한 할당을 수행하는 것입니다. 모델의 각 부분이 구축되면 진단 표시 및 중단 문을 삽입하여 실행하고 오류를 확인해야 합니다. 모델의 일부가 정확하다는 자신감이 커지면 완성된 부분을 작업 파일에 무료 슬롯해 두는 것이 유용합니다. 이후 무료 슬롯된 작업 파일에서 다시 시작하여 개발 중인 작품에 대해서만 작업이 가능하므로 각 개발 실행에서 실행 시간과 생성되는 출력량이 줄어듭니다.

이 접근 방식은 결과 보고서 부분 작업 시 특히 유용합니다. 모델 인스턴스의 설정 및 솔루션이 일반적으로 컴퓨팅 시간을 지배하는 반면 보고서 부분은 콘텐츠 및 레이아웃 설정에 대한 모든 세부 정보를 만족스러운 형식으로 얻으려면 자주 실행해야 하기 때문입니다. 따라서 모델을 생성하고 해석할 수 있으며 그 결과를 작업 파일에 무료 슬롯할 수 있습니다. 그런 다음 보고서를 개발하는 동안 작업 파일에서 다시 시작할 수 있습니다.

어려운 해결 문 시퀀스 추적

해결이 어렵고 비용이 많이 드는 것으로 알려진 많은 경우에 GAMS가 많은 해결 문이 포함된 작업을 처리하도록 하는 것은 너무 위험할 수 있습니다. 하나의 해결이 정상적으로 완료되지 않으면 다음 해결이 불가능하거나 잘못된 초기 지점에서 시작되어 많은 시간과 노력이 낭비될 위험이 있습니다.

대안은 한 번에 하나의 해결을 요청하고 작업 파일을 무료 슬롯하는 것입니다. 이렇게 하면 진행하기 전에 각 해결의 결과를 주의 깊게 검사할 수 있습니다. 모든 것이 예상대로이면 작업을 다시 시작하고 다음 해결을 실행할 수 있습니다. 오류가 발생한 경우 다른 초기 지점이나 반복 또는 시간 제한과 같은 수정된 작업 제한을 사용하여 이전 풀이가 반복될 수 있습니다.

가정 분석

많은 무료 슬롯링 연습에는 '만약에' 분석, 여기서 a기본 사례이 정의되었으며 연구의 요점은 자연적으로 또는 의도적으로 상황이 변할 때 시스템이 어떻게 변하는지 확인하는 것입니다. 종종 기본 사례에 대한 다양한 변경의 효과는 별도로 고려됩니다.

무료 슬롯 및 다시 시작 기능은 이러한 분석을 용이하게 합니다. 기본 사례는 작업 파일을 사용하여 무료 슬롯한 다음 동일한 작업 파일에서 다시 시작하여 원하는 모든 시나리오를 별도로 실행할 수 있습니다. 각 시나리오에는 아마도 데이터에 대한 일부 변경(예: 방정식의 계수 또는 변수 경계)만 수행하여 변경된 모델을 해결하는 작업이 포함될 수 있습니다. 그러면 기본 사례의 솔루션이 자동으로 다음과 같이 사용됩니다.시작점) 및 보고합니다.

보안 작업 파일

무료 슬롯이 원래 개발자가 아닌 사용자에게 배포되거나 다른 개발자가 배포할 응용 프로그램에 내장된 경우 개인 정보 보호, 보안, 데이터 무결성 및 소유권 문제가 발생합니다. 무료 슬롯을 출시하기 전에 무료 슬롯의 일부 부분을 숨기거나 보호하거나 제거해야 할 수도 있습니다. 보호해야 할 정보는 숫자적이거나 상징적인 성격을 가질 수 있습니다. 예는 다음과 같습니다.

개인정보 보호

통계청에서 제공한 사회 회계 매트릭스는 재무부가 사용하는 일반 균형 무료 슬롯에 필요합니다. 통계청의 데이터는 개인정보 보호를 위해 보호되어야 하며 무료 슬롯 실험은 기밀이 높은 정책 옵션을 평가하는 데 사용됩니다. 무료 슬롯 구조의 대부분은 공개되어 있지만 대부분의 데이터는 비공개이므로 원본 데이터의 발견을 금지하는 방식으로 무료 슬롯 결과를 변환해야 합니다.

보안

무료 슬롯의 구성 요소에는 화학 반응을 수학적으로 설명하는 독점 정보가 포함되어 있습니다. 관련 대수 및 일부 데이터는 전략적으로 중요한 것으로 간주되므로 완전히 숨겨야 합니다. 그러나 최종 무료 슬롯은 전 세계 여러 지역에서 사용될 예정입니다.

무결성

무료 슬롯의 올바른 기능을 보장하려면 데이터 무결성 보호 장치가 필요합니다. 무료 슬롯의 작동을 손상시킬 수 있는 우발적인 변경으로부터 특정 데이터 및 기호 정보를 보호해야 합니다.

소위 이러한 문제를 해결하기 위해보안작업 파일이 GAMS에 도입되었습니다. 이러한 작업 파일은 다른 작업 파일처럼 작동하지만 특정 사용자의 라이센스 파일에 잠겨 있습니다. GAMS 라이선스 메커니즘을 통해 무단 액세스로부터 보호되는 안전한 작업 파일의 콘텐츠입니다.

주의
보안 작업 파일을 생성하려면 특별한 GAMS 라이센스가 필요합니다. 또한 참조사용법.
보안 작업 파일의 보안 기능은 해결사 수준으로 확장되지 않습니다. 결과적으로, 무료 슬롯을 해석할 권한이 있는 사용자는 GAMS 해석기 수준에서 무료 슬롯 인스턴스에 대한 전체 정보를 추출할 수 있습니다. 참조제한사항더 많은 정보를 원하시면.

소개 예

잘 알려진 교통 무료 슬롯[TRNSPORT]보안 작업 파일의 생성 및 배포를 설명하기 위해 다시 사용됩니다. 이 무료 슬롯을 배포하고 싶지만 독점 공식 및 데이터에 대한 우려가 있다고 가정해 보겠습니다. 또한 사용자가 의도하지 않게 무료 슬롯을 수정하는 것을 방지하고 싶습니다. 목적 함수와 공급 제약 조건은 다른 사용자에게 숨겨지고 수요 수치만 변경되도록 허용되어야 한다고 가정합니다. 더 이상 필요하지 않은 데이터도 삭제됩니다.

먼저, 무료 슬롯 라이브러리에서 무료 슬롯의 복사본이 생성되고 무료 슬롯이 실행되며 일반 작업 파일이 생성됩니다.t1생성됨:

> gamslib trnsport
> 게임 tnsport s=t1

다음, 파일t2.gms액세스 제어 명령이 생성되었습니다.

$eolcom //
 $protect all // 모든 기호를 읽기 전용으로 설정
 $purge d f // 항목 d와 f를 제거합니다.
 $hide 비용 공급 a // 목표를 보이지 않게 만듭니다.
 $expose Transport b // b 변경 허용

그리고보안작업 파일t2.g00실행하여 생성됨t2.gms다음부터 다시 시작t1.g00:

> gams t2 r=t1 s=t2 plicense=target

접근 제어 명령이 개인 정보 보호 GAMS 라이센스 옵션으로 활성화되었으므로 새로 생성된 작업 파일은 안전합니다.PLicense. 이 명령줄 매개변수는 대상 사용자의 라이센스 파일 이름을 지정합니다. 그 효과는 작업 파일입니다.t2.g00이제 대상 라이센스 파일로만 읽을 수 있습니다.

로그 출력에는 다음 줄이 포함됩니다:

GAMS 개정 124 저작권 (C) 1987-2001 GAMS 개발...
라이센스 사용자: 소스 사용자 이름
          소스 회사명
*** 다음에 대한 보안 재시작 파일 생성:
*** 대상 사용자 이름
*** 대상회사명
--- 연속 컴파일 시작
--- T2.GMS(6) 1Mb
--- 실행 시작
*** 상태: 정상완료

다음으로 시작하는 세 줄***는 대상 라이센스 파일의 내용을 요약한 것입니다. 이제부터 소스 및 대상 라이센스는 이 파일과 모든 하위 항목에 '구워집니다'. 이제 대상 사용자나 시스템에 다시 시작 파일을 보낼 수 있습니다.

대상 사용자는 새로운 데이터로 무료 슬롯을 실행하고, 새로운 GAMS 문을 추가하고, 새로운 작업 파일을 생성할 수 있습니다. 그러나 두 가지 제한 사항이 있습니다. 일부 기호는 숨겨져 있으며 이 무료 슬롯은 대상 라이선스 파일을 통해서만 실행할 수 있습니다.

예를 들어, 대상 사용자는 수요를 절반으로 줄이고 원래 솔루션을 새 솔루션과 비교하기를 원할 수 있습니다. 다음 파일은t3.gms, 이 작업을 수행합니다.

매개변수 담당자 '요약 보고서';
담당자(i,j,'베이스') = x.l(i,j);
b(j) = b(j)*0.5;

lp를 사용하여 z를 최소화하는 전송을 해결합니다.

rep(i,j,'half') = x.l(i,j);
디스플레이 담당자;

이 새 파일은 작업 파일에서 다시 시작하여 대상 시스템에서 실행될 수 있습니다.t2.g00:

> 감 t3 r=t2

결과 로그 파일에는 다음 줄이 포함됩니다:

GAMS 개정 124 저작권 (C) 1987-2001 GAMS 개발...
라이센스 사용자: 대상 사용자 이름
                대상 사용자 회사
*** 다음에 의해 생성된 보안 재시작 파일에서 다시 시작:
*** 소스 사용자 이름
*** 출처 회사명
--- 연속 컴파일 시작
--- T3.GMS(5) 1Mb
...

보안 작업 파일의 작성자/소유자가 이름으로 언급되어 있습니다. 유사한 메시지가 목록 파일에 포함됩니다.

...
실행 시간 = 0.000초 1.1Mb WIN201-124

**** 보안 무료 슬롯/다시 시작 파일 소스:
        소스 사용자 이름
        소스 회사명
**** 보안 무료 슬롯/재시작 파일 대상:
        대상 사용자 이름
        대상 사용자 회사
...

목록 파일을 더 자세히 조사한 결과 숨겨진 변수와 방정식이 일반적인 방정식과 변수 목록 및 솔루션 인쇄에 나타나지 않는 것으로 나타났습니다. 숨겨진 항목은 공개(노출된) 무료 슬롯과 해결 문을 통해서만 액세스할 수 있습니다. 그러나 대상 사용자는 전체 무료 슬롯 인스턴스에 계속 액세스할 수 있습니다. 참조제한사항.

다음에서는 보안 작업 파일 및 접근 제어 명령에 대해 자세히 설명합니다.

사용법

보안 작업 파일은 기호 및 숫자 정보에 대한 액세스를 제어하며 특정 GAMS 사용자만 읽을 수 있습니다. 액세스 제어를 처음 생성하거나 추가하려면 특별한 GAMS 라이선스가 필요합니다. 새로운 액세스 제어 없이 안전한 작업 파일을 무료 슬롯하는 데에는 특별한 GAMS 라이선스가 필요하지 않습니다. 액세스 제어 생성 또는 추가는 GAMS 명령줄 매개변수를 사용하여 표시됩니다.PLicense, 개인정보 보호 라이센스 파일의 이름을 제공합니다. 바로가기PLICENSE=라이센스개인정보 보호 라이센스를 현재 라이센스 파일로 설정합니다. 이는 액세스 제어를 실험할 때 편리합니다.

보안 작업 파일을 처음 작성할 때 현재 라이센스 파일의 첫 번째와 두 번째 줄과 개인 정보 보호 라이센스 파일이 작업 파일에 삽입됩니다. 이 정보는 더 이상 변경할 수 없으며 원본 소스와 대상 사용자는 작업 파일에 잠겨 있습니다.

보안 작업 파일은 다른 작업 파일과 마찬가지로 사용될 수 있으며 새 작업 파일은 보안 파일에서 파생될 수 있습니다. 그러나 그 사용은 다음으로 제한됩니다.대상명령줄 매개변수로 사용자가 지정됨PLicense. 라이선스가 있는 경우 대상 사용자는 매개변수를 사용하여 기존 보안 파일에 액세스 제어를 추가할 수 있습니다.PLICENSE=라이센스그러나 소스 및 대상 사용자에 대한 원래 정보는 변경할 수 없습니다.

컴파일 단계에서 처리되는 4개의 액세스 제어 명령(ACC)이 있습니다. 이러한 명령은 프로그램의 어느 곳에나 삽입할 수 있습니다. 시간순으로 처리되며 다음 구문을 갖습니다.

$acc ident1 ident2 ...
$acc 모두

여기ident1그리고ident2아르GAMS 식별자이전에 프로그램에 정의되어 있으며acc4가지 액세스 제어 명령 중 하나를 나타냅니다.

달러 통제 옵션설명
삭제 객체와 연관된 모든 데이터를 제거합니다.
숨기기 객체를 숨기지만 무료 슬롯 계산에 사용할 수 있도록 허용합니다.
보호 객체는 수정할 수 없지만 무료 슬롯 계산에 사용할 수 있습니다.
노출 모든 개인 정보 보호 제한을 제거하고 기호는 원래 상태로 되돌아갑니다.

키워드모두GAMS 소스 코드에서 이 지점까지 정의된 모든 식별자에 ACC를 적용합니다. ACC는 동일한 GAMS 프로그램 내에서 변경 및 재정의될 수 있습니다. 그러나 다시 시작 파일에서 상속된 식별자는 변경할 수 없습니다.

실용적인 예

이 섹션에서는 운송 무료 슬롯을 사용합니다.[TRNSPORT]대상 사용자로부터 입력 데이터와 결과를 숨기는 방법을 보여줍니다. 대상 사용자는 알 수 없는 기본 사례의 백분율 변경만 볼 수 있습니다. 원본 무료 슬롯 외에도 데이터 초기화 및 보고서 무료 슬롯이 도입됩니다.

먼저, 입력 데이터를 계산하는 방법이 정의됩니다. GAMS 언어는 방법(또는 함수)에 대한 정의를 제공하지 않으므로 여기서 무료 슬롯은 우리가 에뮬레이션하려는 방법의 입력과 출력 간의 원하는 대응 관계를 대수적으로 정의하는 데 사용됩니다. 그런 다음 메서드 실행은 무료 슬롯 해결에 해당합니다. 무료 슬롯은 다음과 같습니다.

$include trnsport.gms

변수 newc(i,j) '새 스포츠 데이터';
방정식 defnewc(i,j) '새로운 전송 데이터의 정의';
defnewc(i,j).. newc(i,j) =e= f*d(i,j)/1000;

무료 슬롯 getc '새 전송 데이터 계산' / defnewc /;
cns를 사용하여 getc를 해결합니다.

무료 슬롯 해결을 통해getc(참조제약된 비선형 시스템(CNS)문제 유형 CNS에 대한 자세한 내용은 변수newc(i,j)다음의 가치를 얻게 될 것입니다f*d(i,j)/1000변수 수준 속성에 있습니다. 따라서,newc.l매개변수에 해당함c원래 무료 슬롯에서.

다음으로, 원래 무료 슬롯의 목적 함수는 이를 반영하도록 변경됩니다.규모의 경제. 또한 기본 사례 값베이스엑스나중에 보고 무료 슬롯에서 사용하기 위해 계산됩니다.

스칼라 베타 '스케일링 지수' / 1.1 /;
방정식 newcost '규모의 목적 함수';
newcost.. z =e= sum((i,j), newc.l(i,j) * x(i,j)**beta);

무료 슬롯 estrans / newcost, 공급, 수요 /;
z를 최소화하는 nlp를 사용하여 estrans를 해결합니다.

매개변수 basex(i,j) 'x의 기본 값';
basex(i,j) = x.l(i,j);

마지막으로 무료 슬롯 결과를 변환하는 방법에트란59561_59671newc), 무료 슬롯은 이 메서드를 에뮬레이션하는 데 사용됩니다.

변수 델타(i,j) '기본 값의 백분율 변화';
방정식 defdelta(i,j) '델타 정의';
defdelta(i,j)$basex(i,j).. delta(i,j) =e= 100*(x.l(i,j)-basex(i,j))/basex(i,j);

무료 슬롯 대표 / defdelta /;
cns를 사용하여 담당자를 해결합니다.

위의 GAMS 코드가 파일에 무료 슬롯되었다고 가정p1.gms. 이 파일에서 GAMS를 실행하면,

> 게임 p1 s=p1

다음 이름으로 작업 파일을 생성합니다.p1.g00.

다음에서는 대상 사용자가 정의할 것으로 예상되는 것과 유사한 일부 테스트가 실행됩니다. a에서 해결해야 할 세 가지 시나리오루프파일에 정의되어 있습니다u1.gms:

s / 하나, 둘, 셋 / 설정;
매개변수 sbeta(s) / 1개 1.25, 2개 1.5, 3개 2.0 /
          SF(들) / 1개 85, 2개 75, 3개 50 /;
매개변수 보고서 '요약 보고서';

루프(들,
   베타 = s베타(들);
   f = SF(들);
   cns를 사용하여 getc를 해결합니다.
   z를 최소화하는 nlp를 사용하여 estrans를 해결합니다.
   cns를 사용하여 담당자를 해결합니다.
   보고서(i,j,s) = delta.l(i,j);
   보고서('','베타',s) = 베타;
   보고서('','f',s) = f;
   보고서('obj','z',s) = z.l
);

보고서 표시;

파일u1.gms작업 파일에서 다시 시작하여 실행 가능p1.g00:

> 게임 u1 r=p1

display 문은 다음과 같은 출력을 생성합니다:

-- 109 PARAMETER 보고서 요약 보고서

                           하나 둘 셋

시애틀 .뉴욕 -4.050 -6.967 -8.083
시애틀 .시카고 -18.797 -27.202 -31.550
시애틀 .topeka 233.958 348.468 404.187
샌디에고.뉴욕 3.605 6.201 7.194
샌디에고.시카고 28.138 40.719 47.228
san-diego.topeka -15.512 -23.104 -26.799
         .베타 1.250 1.500 2.000
         .f 85.000 75.000 50.000
obj .z 526.912 1652.963 13988.774

모든 기호는 여전히 완전히 노출되어 있습니다. 무료 슬롯에 액세스 제어를 추가해야 합니다.p1.gms대상 클라이언트가 사용할 수 있기 전에. 보호해야 할 정보는 원본 거리 매트릭스와 파생된 정보입니다. 권장되는 절차는 먼저 모든 것을 숨긴 다음 무료 슬롯의 선택된 부분에만 액세스할 수 있도록 하는 것입니다. 액세스 제어 정보는 파일에 수집됩니다.s1.gms:

$모두 숨기기
$expose getc estrans 담당자
$expose i j z 델타
$expose f 베타 a b

초기 작업파일 p1, 보안작업파일 사용s1.g00실행하여 생성됨

> gams s1 r=p1 s=s1 plicense=license

대상 사용자의 관점에서 시스템을 테스트하기 위해 현재 GAMS 시스템의 라이센스가 대상 사용자에게도 사용됩니다.

보안 작업 파일을 테스트하려면 문제가 발생합니다.u1.gms다시 실행되고 작업 파일에서 다시 시작됩니다.s1:

> 게임 u1 r=s1

결과 목록 파일을 검사하면 숨겨진 변수와 관련된 방정식, 변수 및 솔루션 목록이 더 이상 표시되지 않는 것을 관찰합니다. 숨겨진 변수를 참조하려고 하면 컴파일 오류가 발생합니다.

제한사항

보안 작업 파일의 설계 목표 중 하나는 GAMS 시스템의 다른 구성 요소에 대한 영향을 최소화하는 것이었습니다. 보안 환경 내에서 사용되는 솔버는 일반 환경 내에서 호출되는 것처럼 작동해야 합니다. 이는 무료 슬롯에 대한 특정 정보가 다음과 같은 솔버를 사용하여 쉽게 복구될 수 있음을 의미합니다.변환또는 다음과 같은 솔버 옵션CPLEX용 writelp, CBC용 writemps또는SCIP용 게임/대화형.

예를 들어, 보안 작업 파일을 고려해보세요t2.g00섹션에서소개 예. 이제 대상 사용자는 숨겨진 방정식을 포함하여 전체 무료 슬롯 인스턴스를 재현할 수 있습니다.공급또는 목적 함수비용다음 GAMS 코드를 실행하여 다음에서 다시 시작t2.g00:

옵션 mip = scip;
Transport.optfile = 1;
$echo gams/interactive = "표시 문제 종료" > scip.opt
mip를 사용하여 전송 최소 z를 해결합니다.

이것은 로그 출력을 생성합니다:

64478_65880

작업 파일을 잠금 해제하려면 라이센스가 필요하기 때문에 이 접근 방식은 대상 사용자에게만 가능하다는 점에 유의하십시오. 또한 무료 슬롯의 원래 대수학은 여전히 GAMS에 의해 보호되며, 생성된 무료 슬롯 인스턴스(원래 변수 및 방정식 이름 포함)와 변수 및 방정식 기호만 이 방식으로 사용할 수 있습니다.

보안 작업 파일의 추가 제한은 소스 및 대상 라이센스 파일이 보안 작업 파일에 잠겨 있어 변경할 수 없다는 것입니다. 대상 사용자가 새 라이선스 파일을 받은 경우(예: 시스템 업그레이드로 인해) 대상 사용자는 보안 작업 파일을 더 이상 읽을 수 없으며 다시 생성해야 합니다.

난독화된 작업 파일

GAMS는 작업 파일에서 실행되는 특정 무료 슬롯과 관련된 모든 이름 및 기타 문서를 변경할 수 있는 제한된 기능 세트를 제공합니다. 이는 신뢰할 수 없는 컴퓨팅 환경(예: 공용 클라우드 시설)에서 무료 슬롯을 해결해야 하는 경우 유용할 수 있습니다. 결과가 보안 환경으로 돌아오면 변경된 이름을 다시 원래 이름으로 변환할 수 있습니다.

기호, 세트 요소 및 설명 텍스트에 대한 모든 문자열이 난독화된 이름으로 대체된 작업 파일을 an이라고 합니다.난독화됨작업 파일. GAMS는 기호 이름이나 라벨 이름의 원래 길이를 유지하여 난독화하지만 이를 일련의 문자열로 대체합니다. 예를 들어 길이가 3인 기호의 경우 생성됩니다.A00, A01, A02, ...,Z__. 설명 텍스트에 사용되는 방법은 비슷하지만 여기서 GAMS는 항상 작은따옴표 문자를 사용하므로 이상하게 보이는 레이블이 많이 생성될 수 있습니다. 항목 이름, 라벨 및 설명 텍스트 외에도 목록 파일의 제목 및 부제목이 난독화되어 있습니다. GAMS 실행 시 의미가 있는 다른 문자열(예: 파일 이름)은 변경할 수 없습니다. 문자열 풀의 변경에도 불구하고 난독화된 작업 파일은 일반 작업 파일의 모든 기능을 갖습니다.

섹션에서 불러오기작업 파일 무료 슬롯명령줄 매개변수를 사용하여 작업 파일이 생성됨무료 슬롯. 난독화된 작업 파일은 변형으로 생성됩니다.무료 슬롯난독화. 난독화된 작업 파일의 생성은 종종 일반 작업 파일의 생성과 결합됩니다. 왜냐하면 후자가 난독화된 작업 파일의 정보를 원래 무료 슬롯의 네임스페이스로 다시 변환하는 데 필요하기 때문입니다.

다음에서는 난독화된 작업 파일의 의도된 사용을 설명합니다. 먼저 GAMS 무료 슬롯(여기[TRNSPORT])은 일반 작업 파일과 난독화된 작업 파일로 컴파일됩니다.

> gamslib trnsport
> gams trnsport action=compile s=0named so=0난독화

참고로 명령줄 매개변수는액션=컴파일은 무료 슬롯을 컴파일하기만 하고 실행하지는 않습니다. 일반 작업 파일의 이름은 다음과 같습니다.0named.g00그리고 난독화된 작업 파일의 이름은0난독화.g00.

다음 단계에서는 난독화된 작업 파일이 비보안 시스템으로 이동되고 GAMS가 빈 GAMS 무료 슬롯 파일의 이 작업 파일에서 다시 시작됩니다. 그러면 원래 무료 슬롯이 실행됩니다(여기trn스포츠), 그러나 모든 이름은 난독화되어 있습니다. 이 실행의 결과는 여전히 난독화된 다른 작업 파일에 무료 슬롯됩니다.1난독화됨.g00.

> 에코 *비어 있음 > 비어 있음.gms
> 빈 게임 r=0난독화 s=1난독화

작업 파일1난독화됨.g00이제 신뢰할 수 있는 시스템으로 다시 돌아옵니다. 결과를 얻으려면의 한계 값을 말하십시오.공급방정식, 난독화되지 않은 형태로 GAMS는 값을 기록하는 무료 슬롯에서 다시 실행됩니다.공급.mGDX 파일로공급.gdx. 이 무료 슬롯은 난독화된 작업 파일에서 다시 시작됩니다.1난독화됨.g00, 그러나 추가적으로 원래 생성된 난독화되지 않은 작업 파일0named.g00명령줄 매개변수를 통해 전달됩니다.RestartNamed(짧은:rn):

> echo "execute_unload '공급', 공급.m;" > unload.gms
> gams 언로드 r=1난독화 rn=0named

작업 파일을 기억하세요.0named.g00초기 컴파일의 결과이며 원래 네임스페이스의 이름을 포함합니다. 신뢰할 수 있는 환경을 벗어나지 않았습니다. 옵션 결합의 효과r그리고rn그렇군요모두다음을 통해 지정된 작업 파일에서 읽은 기호 및 레이블 이름, 설명 텍스트, 목록 파일 제목 및 자막을 제외하고 난독화된 작업 파일의 콘텐츠를 가져옵니다.rn.

GAMS는 자동으로 다음 세 가지 확인을 수행합니다.보장이름이 지정되고 난독화된 작업 파일이 일관성이 있음:

  1. 라벨과 기호의 개수는 동일해야 합니다.
  2. 문자열 풀의 크기는 동일해야 합니다.
  3. 처음 10개의 라벨은 문자열 풀의 동일한 주소를 가리킵니다.

    처음 두 개의 검사는 난독화된 네임스페이스에서의 실행이 새로운 기호나 라벨 또는 심지어 새로운 문자열(예: from을 도입할 수 없음을 의미합니다.'이것은 새로운 문자열입니다' 표시). 따라서 위의 난독화된 작업 파일에서 실행하는 데 사용된 빈 GAMS 프로그램은 난독화된 기호 및 레이블을 알 수 없기 때문에 유용한 코드로 대체하기가 어렵습니다.