dumpopt2.gms : dumpOptGDX로 dumpOpt 테스트

설명

이 테스트는 명령줄 매개변수 dumpOptGDX의 올바른 동작을 보장합니다.
dumpOpt와 함께 사용됩니다.

기고자: Lutz Westermann, 2021년 11월

소형 모델 유형 :피망 슬롯


카테고리 : 피망 슬롯 테스트 라이브러리


메인 파일 : dumpopt2.gms

$title 'dumpOptGDX로 dumpOpt 테스트' (DUMPOPT2,SEQ=884)

$onText
이 테스트는 명령줄 매개변수 dumpOptGDX의 올바른 동작을 보장합니다.
dumpOpt와 함께 사용됩니다.

기고자: Lutz Westermann, 2021년 11월
$offText

$onCheckError레벨
옵션 CheckErrorLevel = 1;

duVals 설정 / 1*4, 11, 21 /
    restartRecov(duVals) / 1*4 /
    reWriteInput(duVals) / 11, 21 /;

$onEcho > tran1.gms
$title A 운송 문제(TRNSPORT,SEQ=1)

$onText
이 문제는 다음을 충족하는 최소 비용 배송 일정을 찾습니다.
시장의 요구사항과 공장의 공급품.

Dantzig, GB, 3.3장. 선형 프로그래밍 및 확장.
프린스턴 대학 출판부, 뉴저지주 프린스턴, 1963년.

이 공식은 다음에 자세히 설명되어 있습니다.
Rosenthal, RE, 2장: 피망 슬롯 튜토리얼. 피망 슬롯: 사용자 가이드.
Scientific Press, 캘리포니아주 레드우드 시티, 1988년.

이러한 이유로 행 번호는 책의 행 번호와 일치하지 않습니다.
댓글.

키워드: 선형 계획법, 운송 문제, 스케줄링
$offText

* 약간의 복잡성 추가

'안녕하세요'를 표시합니다.
$onEmbeddedCode 파이썬:
통과
$offEmbeddedCode

임베디드 코드 Python:
통과
endEmbeddedCode

파일 FX;
fx를 넣어;
$onPut
xxx
$offPut

세트
   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);

모델 운송 / 모두 /;
$offEcho

* 기본 사례 생성: 이는 다른 실행과 비교하고 사용할 재시작 및 GDX 파일을 생성합니다.
$call 피망 슬롯 tran1.gms lo=%피망 슬롯lo% s=base GDX=trans1base

* dumpOptGDX 없음
루프(duVals$reWriteInput(duVals),
  put_utility 'shell' / '피망 슬롯 tran1.gms lo=%피망 슬롯lo% dumpOpt=' duVals.tl:0;
  put_utility 'shell' / '피망 슬롯 tran1.dmp lo=%피망 슬롯lo% GDX=trans1' duVals.tl:0;
  put_utility 'shell' / 'gdxdiff trans1base.gdx trans1' duVals.tl:0 '.gdx > %system.nullfile%';
);

* dumpOptGDX 포함
루프(duVals$reWriteInput(duVals),
  put_utility 'shell' / '피망 슬롯 tran1.gms lo=%피망 슬롯lo% dumpOptGDX=trans1 dumpOpt=' duVals.tl:0;
  put_utility 'shell' / '피망 슬롯 tran1.dmp lo=%피망 슬롯lo% GDX=trans1' duVals.tl:0;
  put_utility 'shell' / 'gdxdiff trans1base.gdx trans1' duVals.tl:0 '.gdx > %system.nullfile%';
);

$onEcho > tran2.gms
z를 최소화하는 lp를 사용하여 전송을 해결합니다.
$offEcho

* dumpOptGDX 포함 및 포함 없이 복구 다시 시작 
루프(duVals$restartRecov(duVals),
  put_utility 'shell' / '피망 슬롯 tran2.gms lo=%피망 슬롯lo% r=base dumpOpt=' duVals.tl:0;
  put_utility 'shell' / '피망 슬롯 tran2.dmp lo=%피망 슬롯lo% GDX=trans2' duVals.tl:0;
  put_utility 'shell' / '피망 슬롯 tran2.gms lo=%피망 슬롯lo% r=base dumpOptGDX=trans2 dumpOpt=' duVals.tl:0;
  put_utility 'shell' / '피망 슬롯 tran2.dmp lo=%피망 슬롯lo% GDX=trans2' duVals.tl:0 'GDX';
  put_utility 'shell' / 'gdxdiff trans2' duVals.tl:0 '.gdx trans2' duVals.tl:0 'GDX.gdx > %system.nullfile%';
);

* 일부 구축사례 확인
$onEcho > data1.gms
i / i1*i3/을 설정합니다.
매개변수 a(i) / i1 1
                 i2 2/;
$onMulti
매개변수 a(i) / i1 0, i3 3/;
스칼라 b / 7 /; 스칼라 b / 77 /;
i / i2*i5/를 설정합니다.

스칼라 y /1/, x;
$on: 그대로
i / i3*i6/을 설정합니다.
$평가 Y Y

$off축어적으로
xx 설정 /x1*x%y%/;
$on: 그대로
$ifThenE %Y%=1
  x=1;
$else
  x=2;
$endIf
$off축어적으로
$offEcho

* 새로운 기본 케이스 생성
'피망 슬롯 data1.gms lo=%피망 슬롯lo% GDX=database'를 실행합니다.

* dumpOptGDX 없음
루프(duVals$reWriteInput(duVals),
  put_utility 'shell' / '피망 슬롯 data1.gms lo=%피망 슬롯lo% dumpOpt=' duVals.tl:0;
  put_utility 'shell' / '피망 슬롯 data1.dmp lo=%피망 슬롯lo% GDX=data' duVals.tl:0;
  put_utility 'shell' / 'gdxdiff 데이터베이스.gdx 데이터' duVals.tl:0 '.gdx > %system.nullfile%';
);

* dumpOptGDX 포함
루프(duVals$reWriteInput(duVals),
  put_utility 'shell' / '피망 슬롯 data1.gms lo=%피망 슬롯lo% dumpOptGDX=data dumpOpt=' duVals.tl:0;
  put_utility 'shell' / '피망 슬롯 data1.dmp lo=%피망 슬롯lo% GDX=data' duVals.tl:0;
  put_utility 'shell' / 'gdxdiff 데이터베이스.gdx 데이터' duVals.tl:0 '.gdx > %system.nullfile%';
);

* 빈 데이터 문 처리
$onEcho > data2.gms
빈 설정(*);
$gdxOut 테스트.gdx
$unLoad 비어 있음
$gdx아웃

$gdxIn test.gdx
  $$load 비어 있음
$gdxIn

테스트 설정(*) / /
    테스트2(*) / /
    ;

내가 설정
    비어있음I(i) / /;
$offEcho

* 새로운 기본 케이스 생성
'피망 슬롯 data2.gms lo=%피망 슬롯lo% GDX=database'를 실행합니다.

* dumpOptGDX 없음
루프(duVals$reWriteInput(duVals),
  put_utility 'shell' / '피망 슬롯 data2.gms lo=%피망 슬롯lo% dumpOpt=' duVals.tl:0;
  put_utility 'shell' / '피망 슬롯 data2.dmp lo=%피망 슬롯lo% GDX=data' duVals.tl:0;
  put_utility 'shell' / 'gdxdiff 데이터베이스.gdx 데이터' duVals.tl:0 '.gdx > %system.nullfile%';
);

* dumpOptGDX 포함
루프(duVals$reWriteInput(duVals),
  put_utility 'shell' / '피망 슬롯 data2.gms lo=%피망 슬롯lo% dumpOptGDX=data dumpOpt=' duVals.tl:0;
  put_utility 'shell' / '피망 슬롯 data2.dmp lo=%피망 슬롯lo% GDX=data' duVals.tl:0;
  put_utility 'shell' / 'gdxdiff 데이터베이스.gdx 데이터' duVals.tl:0 '.gdx > %system.nullfile%';
);

* 하위 집합 다루기
$onEcho > data3.gms
i(i) / i1 / 설정;

세트 jj
    j(jj);
jj / j1 / 설정;
$offEcho

* 새로운 기본 케이스 생성
'피망 슬롯 data3.gms lo=%피망 슬롯lo% GDX=database'를 실행합니다.

* dumpOptGDX 없음
루프(duVals$reWriteInput(duVals),
  put_utility 'shell' / '피망 슬롯 data3.gms lo=%피망 슬롯lo% dumpOpt=' duVals.tl:0;
  put_utility 'shell' / '피망 슬롯 data3.dmp lo=%피망 슬롯lo% GDX=data' duVals.tl:0;
  put_utility 'shell' / 'gdxdiff 데이터베이스.gdx 데이터' duVals.tl:0 '.gdx > %system.nullfile%';
);

* dumpOptGDX 포함
루프(duVals$reWriteInput(duVals),
  put_utility 'shell' / '피망 슬롯 data3.gms lo=%피망 슬롯lo% dumpOptGDX=data dumpOpt=' duVals.tl:0;
  put_utility 'shell' / '피망 슬롯 data3.dmp lo=%피망 슬롯lo% GDX=data' duVals.tl:0;
  put_utility 'shell' / 'gdxdiff 데이터베이스.gdx 데이터' duVals.tl:0 '.gdx > %system.nullfile%';
);

* 병합된 세트 처리
$onEcho > data4.gms
i를 설정합니다.
매개변수 p(i);
$gdxIn trans1base.gdx
$load i<c.Dim1
$loadM i<c.Dim2
나는 디스플레이;
$offEcho

* 새로운 기본 케이스 생성
'피망 슬롯 data4.gms lo=%피망 슬롯lo% GDX=database'를 실행합니다.

* dumpOptGDX 없음
루프(duVals$reWriteInput(duVals),
  put_utility 'shell' / '피망 슬롯 data4.gms lo=%피망 슬롯lo% dumpOpt=' duVals.tl:0;
  put_utility 'shell' / '피망 슬롯 data4.dmp lo=%피망 슬롯lo% GDX=data' duVals.tl:0;
  put_utility 'shell' / 'gdxdiff 데이터베이스.gdx 데이터' duVals.tl:0 '.gdx > %system.nullfile%';
);

* dumpOptGDX 포함
루프(duVals$reWriteInput(duVals),
  put_utility 'shell' / '피망 슬롯 data4.gms lo=%피망 슬롯lo% dumpOptGDX=data dumpOpt=' duVals.tl:0;
  put_utility 'shell' / '피망 슬롯 data4.dmp lo=%피망 슬롯lo% GDX=data' duVals.tl:0;
  put_utility 'shell' / 'gdxdiff 데이터베이스.gdx 데이터' duVals.tl:0 '.gdx > %system.nullfile%';
);

* 더 많은 테이블
$onEcho > data5.gms
테이블 무작위EmptyTable(*,*),randomDelimTable(*,*)
$onDelim
블리,블라,블럽
t1,123
t2,456
$offDelim
;
$offEcho

* 새로운 기본 케이스 생성
'피망 슬롯 data5.gms lo=%피망 슬롯lo% GDX=database'를 실행합니다.

* dumpOptGDX 없음
루프(duVals$reWriteInput(duVals),
  put_utility 'shell' / '피망 슬롯 data5.gms lo=%피망 슬롯lo% dumpOpt=' duVals.tl:0;
  put_utility 'shell' / '피망 슬롯 data5.dmp lo=%피망 슬롯lo% GDX=data' duVals.tl:0;
  put_utility 'shell' / 'gdxdiff 데이터베이스.gdx 데이터' duVals.tl:0 '.gdx > %system.nullfile%';
);

* dumpOptGDX 포함
루프(duVals$reWriteInput(duVals),
  put_utility 'shell' / '피망 슬롯 data5.gms lo=%피망 슬롯lo% dumpOptGDX=data dumpOpt=' duVals.tl:0;
  put_utility 'shell' / '피망 슬롯 data5.dmp lo=%피망 슬롯lo% GDX=data' duVals.tl:0;
  put_utility 'shell' / 'gdxdiff 데이터베이스.gdx 데이터' duVals.tl:0 '.gdx > %system.nullfile%';
);