transport.gms : MIRO의 고전적인 운송 문제

설명

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

카테고리 : 슬롯 나라 데이터 유틸리티 라이브러리


메인 파일 : transport.gms 포함: transport.gms

$title 다중 버전 LP/MIP/MINLP의 운송 문제
$onText
이 문제는 다음을 충족하는 최소 비용 배송 일정을 찾습니다.
시장의 요구사항과 공장의 공급품.

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

$offText

세트
   나는 '통조림 식물'
   j '시장'
   t '사용 가능한 모델 유형' / lp, mip, minlp /
   locHdr '위치 데이터 헤더' / lat, lng /;

$onExternalInput
싱글톤 세트 유형(t) '선택된 모델 유형' / lp /;

매개변수
   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 /
       minS '최소 배송(MIP 및 MINLP만 해당)' / 100 /
       beta '베타(MINLP 전용)' / 0.95 /;

테이블 ilocData(i,locHdr) '식물 위치 정보'
               위도 길이     
시애틀 47.608013 -122.335167
샌디에이고 32.715736 -117.161087;

테이블 jlocData(j,locHdr) '시장 위치 정보'
           위도 길이     
뉴욕 40.730610 -73.935242
시카고 41.881832 -87.623177
토피카 39.056198 -95.695312;
$offExternalInput

매개변수
c(i,j) '케이스당 운송 비용(단위: 수천 달러)';
c(i,j) = f*d(i,j)/1000;

* 입력 유효성 검사
파일 로그 / miro.log /;
로그 넣기 '-------------------------'/;
로그를 넣어 '데이터 검증 중'/;
로그 넣기 '-------------------------'/;
if(sum(i, a(i)) < sum(j, b(j)),
  put log 'a:: 수요를 충족하기에 용량이 부족함'/;
그렇지 않으면
  로그 넣기 '확인'/;
);
putclose 로그;

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

모델 운송LP / 모두 /;

스칼라 bigM 빅 M;
bigM = min(smax(i,a(i)), smax(j,b(j)));

이진 변수 ship(i,j) 'i에서 j로 배송하면 1, 그렇지 않으면 0';

방정식 minship(i,j) 최소 배송
         maxship(i,j) 최대 배송;

minship(i,j) .. x(i,j) =g= minS * ship(i,j);
maxship(i,j) .. x(i,j) =l= bigM * ship(i,j);

모델 TransportMIP / TransportLP, minship, maxship / ;
옵션 optcr = 0;

방정식
   costnlp '비선형 목적함수 정의';
   비용nlp .. z =e= sum((i,j), c(i,j)*x(i,j)**beta) ;

모델 TransportMINLP / TransportMIP - 비용 + 비용nlp /;

$eval.세트 유형 유형.TL
$설정되지 않은 경우 유형 $set 유형 lp

*일부 출발점
x.l(i,j) = 1;

z를 최소화하는 %type%를 사용하여 Transport%type%를 해결합니다.
abort$(transport%type%.modelstat > 2 and Transport%type%.modelstat <> 8) "실행 가능한 솔루션을 찾을 수 없습니다."

ScheduleHdr '일정 헤더' / 'lngP', 'latP', 'lngM', 'latM', 'cap', '수요', '수량' / 설정;

$onExternalOutput
매개변수
   Schedule(i,j,scheduleHdr) '케이스별 배송 수량'
   total_cost '총 운송 비용(천 달러)';
테이블 일정;
$offExternalOutput

total_cost = z.l;
Schedule(i,j, 'lngP') = iLocData(i,'lng');
Schedule(i,j, 'latP') = iLocData(i,'lat');
Schedule(i,j, 'lngM') = jLocData(j,'lng');
Schedule(i,j, 'latM') = jLocData(j,'lat');
Schedule(i,j, 'cap') = a(i);
Schedule(i,j, '수요') = b(j);
일정(i,j, '수량') = x.l(i,j);