설명
슬롯 나라 임베디드 코드 기능을 사용하면 외부 코드(예: 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) '일부 시나리오에 대한 솔루션 누락', 오류;