설명
이 모델은 다음에 저장된 몇 가지 시나리오 실행을 생성합니다. 디렉토리 트리. 디렉토리 이름은 선택 사항을 반영합니다. 일부 시나리오 세트: a1/b2/c3/. 일부 결과 GDX 파일이 저장됩니다. 디렉토리 트리의 탈퇴 노드에 있는 결과 디렉토리에 재귀적 gdxmerge는 모든 시나리오 결과를 결합합니다. 키워드: 슬롯 사이트 언어 기능, 시나리오 관리, gdxmerge
소형 모델 유형 :슬롯 사이트
카테고리 : 슬롯 사이트 모델 라이브러리
메인 파일 : scenmerge.gms
$title 시나리오를 결합하면 gdxmerge(scenmerge,SEQ=427)를 사용하여 디렉토리 트리가 생성됩니다.
$onText
이 모델은 다음 위치에 저장되는 몇 가지 시나리오 실행을 생성합니다.
디렉토리 트리. 디렉토리 이름은 선택 사항을 반영합니다.
일부 시나리오 세트: a1/b2/c3/. 일부 결과 GDX 파일이 저장됩니다.
디렉토리 트리의 탈퇴 노드에 있는 결과 디렉토리에
재귀적 gdxmerge는 모든 시나리오 결과를 결합합니다.
키워드: 슬롯 사이트 언어 기능, 시나리오 관리, gdxmerge
$offText
$log --- Python 라이브러리 %sysEnv.GMSPYTHONLIB% 사용
$onEcho > t.gms
* a, b, c에 대한 승수가 있는 전송 모델
* 명령줄 이중 대시 매개변수.
세트
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);
모델 운송 / 모두 /;
$설정하지 않은 경우 $set a 1
$설정되지 않은 경우 b $set b 1
$설정되지 않은 경우 c $set c 1
a(i) = %a%*a(i);
b(j) = %b%*b(j);
c(i,j) = %c%*c(i,j);
z를 최소화하는 lp를 사용하여 전송을 해결합니다.
스칼라 tmodelstat; tmodelstat = 운송.modelstat;
매개변수 p(j) '상품 가격'; p(j) = 수요.m(j);
x.l, x.m을 표시합니다.
'test -d 결과 실행 || mkdir 결과';
Execute_unload '결과/입력', a,b,c;
Execute_unload '결과/보고서', x, z, p, tmodelstat;
$offEcho
a,b,c를 설정합니다.
매개변수
ascen(a<) / a_low 0.9, a_med 1.0, a_high 1.1 /
bscen(b<) / b_low 0.9, b_med 1.0, b_high 1.1 /
cscen(c<) / c_low 0.9, c_med 1.0, c_high 1.1 /;
$set mkdir mkdir
$if %system.fileSys%==UNIX $set mkdir mkdir -p
루프((a,b,c),
put_utility 'shell' / 'test -d ' a.tl:0 '%system.dirsep%' b.tl:0 '%system.dirsep%' c.tl:0 ' || %mkdir% ' a.tl:0 '%system.dirsep%' b.tl:0 '%system.dirsep%' c.tl:0
put_utility 'exec.checkErrorLevel' / '슬롯 사이트 t.gms lo=2 -idir "%슬롯 사이트wdir%" -curdir ' a.tl:0 '/' b.tl:0 '/' c.tl:0 ' --a ' ascen(a):3:1 ' --b ' bscen(b):3:1 ' --c ' cscen(c):3:1
);
* 이제 트리를 탐색하고 결과를 재귀적으로 결합합니다.
$set gdxdir 결과
임베디드 코드 Python:
수입 OS
gd = -1
os.walk(os.path.normpath(r"%슬롯 사이트wdir% ".rstrip()), topdown=False)의 루트, 디렉토리, 파일의 경우:
디렉토리에 '%gdxdir%'가 있는 경우:
gd == -1인 경우:
gd = 루트.카운트(os.path.sep)
gdr = 루트;
elif는 gd가 아님 == root.count(os.path.sep):
raise NameError('%gdxdir% 하위 디렉터리가 트리의 다른 깊이에서 발견되었습니다: ' + root + ' 및 ' + gdr)
cmd = 'cd "' + 루트 + '" && gdxmerge %gdxdir%' + os.path.sep + '* 출력=' + root.split(os.path.sep)[-1]
슬롯 사이트printLog('' + 루트에서 %gdxdir% 병합)
0이 아닌 경우 == os.system(cmd + '>' + os.devnull):
raise NameError('실행 중인 문제: ' + cmd)
elif root.count(os.path.sep) < gd:
입력 = ''
디렉토리의 d에 대해:
os.path.isfile(os.path.join(root, d, d + '.gdx'))인 경우:
입력 = 입력 + ' ' + os.path.join(d, d + '.gdx')
len(입력)인 경우:
cmd = 'cd "' + 루트 + '" && gdxmerge' + 입력 + ' 출력=' + root.split(os.path.sep)[-1]
슬롯 사이트printLog('병합' + 입력 + ' in ' + 루트)
0이 아닌 경우 == os.system(cmd + '>' + os.devnull):
raise NameError('실행 중인 문제: ' + cmd)
슬롯 사이트printLog('모두 완료되었습니다. 최종 결과 파일: ' + root.split(os.path.sep)[-1] + '.gdx')
endEmbeddedCode