embmiex1.gms : 간단한 임베디드 코드 ModelInstance 예

설명

슬롯 나라 임베디드 코드 기능을 사용하면 외부 코드(예: Python)를 실행할 수 있습니다.
슬롯 나라가 실행되는 동안 디스크 액세스(예: GDX) 없이 슬롯 나라와 데이터를 교환합니다.

이 예에서는 임베디드 코드 기능과
슬롯 나라 Python OO-API 클래스 GAMSModelInstance. 이 클래스의 인스턴스는 다음을 제공합니다.
재생성하지 않고 수정하고 해결할 수 있는 모델 인스턴스에 대한 액세스
모델을 계속해서.

여기서는 libinclude pyEmbMI를 사용하여 모델 인스턴스를 한 번 생성합니다. 는
이 호출에 대한 인수는 인스턴스를 인스턴스화하는 데 필요한 모든 정보를 제공합니다.
GAMSModelInstance의 특히 우리는 해결의 관련 부분을 제공합니다
명령문과 수정자 목록. 이는 모델의 매개변수입니다.
변경될 수 있습니다. 또한 우리는 다음에 속하는 몇 가지 옵션을 제공할 수 있습니다.
-key=value 쌍을 통한 슬롯 나라/Python OO-API 클래스 GAMSOptions. 자세히 알아보기
슬롯 나라/Python OO-API에서 GAMSModelInstance 및 GAMSOptions 사용
/latest/docs/apis/python/annotated.html

이러한 시나리오 루프의 전통적인 슬롯 나라 구현은 다음과 같습니다.

loop(실행할 시나리오,
   a(i) = newsupply(ScenariosToRun,i);
   b(j) = newdemand(ScenariosToRun,j);
   z를 최소화하는 lp를 사용하여 전송을 해결합니다.
   결과x(ScenariosToRun,i,j) = x.l(i,j)
);

임베디드 코드/GAMSModelInstance 솔루션을 사용하면 이 루프는 다음과 같습니다.

loop(실행할 시나리오,
   a(i) = newsupply(ScenariosToRun,i);
   b(j) = newdemand(ScenariosToRun,j);
   계속임베디드코드:
   슬롯 나라db['a'].copy_symbol(tMI.sync_db['a'])
   슬롯 나라db['b'].copy_symbol(tMI.sync_db['b'])
   tMI.solve()
   tMI.sync_db['x'].copy_symbol(슬롯 나라db['x'])
   일시 중지EmbeddedCode x
   resultantx(ScenariosToRun,i,j) = x.l(i,j);
);

약간의 도우미 함수를 사용하면 이 코드는 더욱 유사해집니다.

loop(실행할 시나리오,
   a(i) = newsupply(ScenariosToRun,i);
   b(j) = newdemand(ScenariosToRun,j);
   계속임베디드코드:
   solvMI(tMI,['a','b'],['x'])
   일시 중지EmbeddedCode x
   resultantx(ScenariosToRun,i,j) = x.l(i,j);
);

여기서는 GUSS/Scenario Solver와 달리 슬롯 나라에서 루프 로직을 구현합니다.
루프 본문에서 GAMSModelInstance 클래스의solv 메소드를 실행합니다.
내장된 Python 코드 내부. 슬롯 나라get|set 메소드를 사용하는 대신
GAMSDatabase.copy_symbol을 사용하여 데이터를 이동하는 내장 코드 기능
슬롯 나라(슬롯 나라db) 및 GAMSModelInstance.sync_db.

이 예에서는 능력을 행사하지 않더라도
GAMSModelInstance 및 임베디드 코드는 n+1 시나리오를 정의하는 방법을 제공합니다.
n번째 시나리오의 결과(원초 및 쌍대)를 기반으로 합니다. 이것은 불가능하다
GUSS/시나리오 솔버에서.

키워드: 선형 프로그래밍, 슬롯 나라 임베디드 코드 기능, Python,
          교통 문제, 일정

소형 모델 유형 :LP


카테고리 : 슬롯 나라 모델 라이브러리


메인 파일 : embmiex1.gms

$title 단순 임베디드 코드 모델 인스턴스 예(EMBMIEX1,SEQ=417)

$onText
슬롯 나라 임베디드 코드 기능을 사용하면 외부 코드(예: Python)를 실행할 수 있습니다.
슬롯 나라가 실행되는 동안 디스크 액세스(예: GDX) 없이 슬롯 나라와 데이터를 교환합니다.

이 예에서는 임베디드 코드 기능과
슬롯 나라 Python OO-API 클래스 GAMSModelInstance. 이 클래스의 인스턴스는 다음을 제공합니다.
재생성하지 않고 수정하고 해결할 수 있는 모델 인스턴스에 대한 액세스
모델을 계속해서.

여기서는 libinclude pyEmbMI를 사용하여 모델 인스턴스를 한 번 생성합니다. 는
이 호출에 대한 인수는 인스턴스를 인스턴스화하는 데 필요한 모든 정보를 제공합니다.
GAMSModelInstance의 특히 우리는 해결의 관련 부분을 제공합니다
명령문과 수정자 목록. 이는 모델의 매개변수입니다.
변경될 수 있습니다. 또한 우리는 다음에 속하는 몇 가지 옵션을 제공할 수 있습니다.
-key=value 쌍을 통한 슬롯 나라/Python OO-API 클래스 GAMSOptions. 자세히 알아보기
슬롯 나라/Python OO-API에서 GAMSModelInstance 및 GAMSOptions 사용
/latest/docs/apis/python/annotated.html

이러한 시나리오 루프의 전통적인 슬롯 나라 구현은 다음과 같습니다.

loop(실행할 시나리오,
   a(i) = newsupply(ScenariosToRun,i);
   b(j) = newdemand(ScenariosToRun,j);
   z를 최소화하는 lp를 사용하여 전송을 해결합니다.
   결과x(ScenariosToRun,i,j) = x.l(i,j)
);

임베디드 코드/GAMSModelInstance 솔루션을 사용하면 이 루프는 다음과 같습니다.

$libInclude pyEmbMI tMI 'lp min z 전송' -all_model_types=cplex a.Zero b.Zero
loop(실행할 시나리오,
   a(i) = newsupply(ScenariosToRun,i);
   b(j) = newdemand(ScenariosToRun,j);
   계속임베디드코드:
   슬롯 나라db['a'].copy_symbol(tMI.sync_db['a'])
   슬롯 나라db['b'].copy_symbol(tMI.sync_db['b'])
   tMI.solve()
   tMI.sync_db['x'].copy_symbol(슬롯 나라db['x'])
   일시 중지EmbeddedCode x
   resultantx(ScenariosToRun,i,j) = x.l(i,j);
);

약간의 도우미 함수를 사용하면 이 코드는 더욱 유사해집니다.

$libInclude pyEmbMI tMI 'lp min z 전송' -all_model_types=cplex a.Zero b.Zero
loop(실행할 시나리오,
   a(i) = newsupply(ScenariosToRun,i);
   b(j) = newdemand(ScenariosToRun,j);
   계속임베디드코드:
   solvMI(tMI,['a','b'],['x'])
   일시 중지EmbeddedCode x
   resultantx(ScenariosToRun,i,j) = x.l(i,j);
);

여기서는 GUSS/Scenario Solver와 달리 슬롯 나라에서 루프 로직을 구현합니다.
루프 본문에서 GAMSModelInstance 클래스의solv 메소드를 실행합니다.
내장된 Python 코드 내부. 슬롯 나라get|set 메소드를 사용하는 대신
GAMSDatabase.copy_symbol을 사용하여 데이터를 이동하는 내장 코드 기능
슬롯 나라(슬롯 나라db) 및 GAMSModelInstance.sync_db.

이 예에서는 능력을 행사하지 않더라도
GAMSModelInstance 및 임베디드 코드는 n+1 시나리오를 정의하는 방법을 제공합니다.
n번째 시나리오의 결과(원초 및 쌍대)를 기반으로 합니다. 이것은 불가능하다
GUSS/시나리오 솔버에서.

키워드: 선형 프로그래밍, 슬롯 나라 임베디드 코드 기능, Python,
          교통 문제, 일정
$offText

$log --- Python 라이브러리 %sysEnv.GMSPYTHONLIB% 사용

세트
   i '통조림 식물' / 시애틀, 샌디에고 /
   j 'markets' / 뉴욕, 시카고, 토피카 /;

매개변수
   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 '총 운송 비용(천 달러)';

양수 변수 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);

모델 운송 / 모두 /;

'실행할 시나리오' 설정 / base, run1, run2 /;

테이블 newsupply(s,i) '(용량)에 대한 업데이트 프로그램'
         시애틀 샌디에고
   베이스 350 600
   실행1 300 650
   실행2 400 550;

테이블 newdemand(s,j) 'b(수요)에 대한 업데이트'
         뉴욕 시카고 토피카
   베이스 325 300 275
   실행1 325 300 275
   실행2 350 300 250;

$set 솔버로그
$if set useSolverLog $setsolverlog 출력=sys.stdout
임베디드 코드 Python:
슬롯 나라wsWorkingDir = '.'
defsolvMI(mi, SymIn=[], SymOut=[]):
  SymIn의 Sym에 대해:
    슬롯 나라db[sym].copy_symbol(mi.sync_db[sym])
  mi.solve(%solverlog%)
  SymOut의 Sym에 대해:
    시도해 보세요:
      슬롯 나라db[sym].clear() # Sym에 대해 "writerTo" 플래그가 설정되었는지 확인하기 위해 기호를 명시적으로 지웁니다.
      mi.sync_db[sym].copy_symbol(슬롯 나라db[sym])
    제외:
      통과
일시중지임베디드코드
abort$execerror '파이썬 오류입니다. 로그를 확인하세요';

$set 라이센스
$"%슬롯 나라license%"가 아닌 경우 $set 라이센스 '"-license=%슬롯 나라license%"'
$libInclude pyEmbMI tMI 'transport us lp min z' -all_model_types=cplex %license% a.Zero b.Zero

매개변수 repX(s,i,j) 'x 수준에 대한 수집기';

루프(들,
   a(i) = 뉴스공급(s,i);
   b(j) = 새로운 수요(s,j);
   계속임베디드코드:
   solvMI(tMI,['a','b'],['x'])
   일시 중지EmbeddedCode x
   repX(s,i,j) = x.l(i,j);
);

옵션 담당자X:0:1:2;
대표X 표시;

오류 '빈 솔루션' 설정;
오류(들) = sum((i,j), repX(s,i,j)) = 0;
abort$card(error) '일부 시나리오에 대한 솔루션 누락', 오류;