trnsindic.gms : 표시기 무료 슬롯 사이트으로 인한 전하 운송 문제 수정

설명

이 문제는 다음을 충족하는 최소 비용 배송 일정을 찾습니다.
시장의 요구 사항과 공장의 공급품은 고정 요금이 있습니다.
네트워크 아크에 무언가가 흐르는 경우.

모델은 몇 가지 암시 무료 슬롯 사이트을 공식화하는 방법을 보여줍니다.
표시기 무료 슬롯 사이트 조건을 통해 "binaryVariable = 1 => 방정식 eq가 유지됩니다".
일반적으로 bigM 공식을 사용하여 이 논리를 표현할 수 있지만 지표는
무료 슬롯 사이트 조건은 적절한 유한 bigM 없이도 이를 수행할 수 있습니다. 이 모델은 보여줍니다
bigM 및 표시기 무료 슬롯 사이트 조건을 사용하는 몇 가지 변형입니다.

소형 모델 유형 :MIP


카테고리 : 무료 슬롯 사이트 모델 라이브러리


메인 파일 : trnsindic.gms

$title 표시 제약 조건으로 인한 고정 요금 운송 문제(TRNSINDIC,SEQ=412)

$onText
이 문제는 다음을 충족하는 최소 비용 배송 일정을 찾습니다.
시장의 요구 사항과 공장의 공급품은 고정 요금이 있습니다.
네트워크 아크에 무언가가 흐르는 경우.

모델은 몇 가지 암시 제약을 공식화하는 방법을 보여줍니다.
표시기 제약 조건을 통해 "binaryVariable = 1 => 방정식 eq가 유지됩니다".
일반적으로 bigM 공식을 사용하여 이 논리를 표현할 수 있지만 지표는
제약 조건은 적절한 유한 bigM 없이도 이를 수행할 수 있습니다. 이 모델은 보여줍니다
bigM 및 표시기 제약 조건을 사용하는 몇 가지 변형입니다.

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

키워드: 혼합정수선형계획법, 운송 문제, 지시자
          제약 조건, 일정, 무료 슬롯 사이트 언어 기능
$offText

* Cplex, Gurobi, SCIP만 실행
$ifThenI %system.mip%==cplex
$ echo readFile %system.mip%.indic > cplex.opt
$elseIfI %system.mip%==구로비
$ echo readFile %system.mip%.indic > gurobi.opt
$elseIfI %system.mip%==scip
$ echo 무료 슬롯 사이트/indicatorfile="%system.mip%.indic" > scip.opt
$else
$ log *** %system.mip%에는 표시기 제약 조건이 없습니다.
$ 종료
$endIf

세트
   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) '케이스당 운송 비용(단위: 수천 달러)'
   fixcost(i,j) '수천 달러 단위의 고정 비용';

c(i,j) = f*d(i,j)/1000;
고정비용(i,j) = 10*d(i,j)/1000;

스칼라
   minshipping '최소 케이스 배송' / 100 /
   bigM '충분히 큰 수';

bigM = smax(i, a(i));

변수
   x(i,j) '케이스의 선적 수량'
   use(i,j) 'arc가 해법에 사용되면 1입니다.'
   z '총 운송 비용(천 달러)';

양수 변수 x;
바이너리 변수 사용;

방정식
   비용 '목적 함수 정의'
   Supply(i) '공장 i의 공급 제한을 준수합니다.'
   수요(j) '시장 j의 수요를 충족'
   minship(i,j) '최소 배송 보장'
   maxship(i,j) '사용 변수가 0이면 배송이 0이 되도록 보장합니다.';

비용.. z =e= sum((i,j), c(i,j)*x(i,j) + fixcost(i,j)*use(i,j));

공급(i).. sum(j, x(i,j)) =l= a(i);

수요(j)..sum(i, x(i,j)) =g= b(j);

minship(i,j).. x(i,j) =g= minshipping*use(i,j);

maxship(i,j).. x(i,j) =l= bigM*use(i,j);

옵션 limRow = 0, limCol = 0, optCr = 0;

모델 bigMModel / 모두 /;

별칭(*,m,sm);

매개변수 담당자(m,sm,*);
$macro dorep(m,sm) rep('m','sm','modelstat') = m.modelStat; rep('m','sm','solvestat') = m.solveStat; 담당자('m','sm','obj') = m.objVal

z를 최소화하는 mip를 사용하여 bigMModel을 해결합니다.
dorep(bigMModel,1);

* 이제 지표 제약 조건을 사용하여 동일한 문제에 대한 모델을 구축해 보겠습니다.
방정식
   iminship(i,j) '지표 제약 조건을 사용하여 최소 배송 보장'
   imaxship(i,j) '표시 제약 조건을 사용하여 사용 변수가 0인 경우 배송이 0인지 확인합니다.';

iminship(i,j).. x(i,j) =g= minshipping;

imaxship(i,j).. x(i,j) =e= 0;

모델 지표모델 / 비용, 공급, 수요, iminship, imaxship /;

파일 fslv '표시기 옵션 파일' / %system.mip%.indic /;

putClose fslv 'indic iminship(i,j)$use(i,j) 1' / 'indic imaxship(i,j)$use(i,j) 0';

표시기모델.opt파일 = 1;
z를 최소화하는 mip를 사용하여 IndicatorModel을 해결합니다.
dorep(indicatorModel,1);

* 레이블이 있는 표시기 옵션을 사용하여 동일한 작업을 수행해 보겠습니다.
루프((i,j),
   put fslv 'indic' iminship.tn(i,j) '$' use.tn(i,j) 예
          / 'indic' imaxship.tn(i,j) '$' use.tn(i,j) 아니오 /;
);
putClose fslv;

z를 최소화하는 mip를 사용하여 IndicatorModel을 해결합니다.
dorep(indicatorModel,2);

* 이제 동일한 문제에 대해 다음과 같이 사용할 수 있는 모델을 구축해 보겠습니다.
* 지표 제약이 없습니다. 이것은 다음과 같은 경우에 유용할 수 있습니다.
* 표시기 제약 조건이 있는 모델 디버깅

양수 변수 minslack(i,j), maxslack(i,j);

방정식
   xminship(i,j) '지표 제약 조건과 bigM을 사용하여 최소 배송을 보장합니다.'
   xmaxship(i,j) '지표 제약 조건과 bigM을 사용하여 0 배송 ig 사용 변수가 0인지 확인'
   bndminslack(i,j) '사용 변수가 1인 경우 minslack이 0인지 확인'
   bndmaxslack(i,j) '사용 변수가 0이면 maxslack이 0인지 확인하세요.';

xminship(i,j).. x(i,j) =g= minshipping - minslack(i,j);

xmaxship(i,j).. x(i,j) =e= 0 + maxslack(i,j);

bndminslack(i,j).. minslack(i,j) =l= bigM*(1 - use(i,j));

bndmaxslack(i,j).. maxslack(i,j) =l= bigM*use(i,j);

모델 표시기bigMModel / 비용, 공급, 수요, xminship, xmaxship, bndminslack, bndmaxslack /;

* 우선 지표를 사용하지 않고 풀어보자
지시자bigMModel.optFile = 0;
z를 최소화하는 mip를 사용하여 IndicatorbigMModel을 해결합니다.
dorep(indicatorbigMModel,1);

* 이제 지표를 사용하므로 바지가 필요하지 않습니다.
putClose fslv 'indic xminship(i,j)$use(i,j) 1' / 'indic xmaxship(i,j)$use(i,j) 0';

minslack.fx(i,j) = 0;
maxslack.fx(i,j) = 0;
표시기bigMModel.optFile = 1;
z를 최소화하는 mip를 사용하여 IndicatorbigMModel을 해결합니다.
dorep(indicatorbigMModel,2);

* bigM과 지표 제약 조건을 혼합하여 일치시킬 수도 있습니다.
putClose fslv 'indic xminship(i,j)$use(i,j) 1';

minslack.fx(i,j) = 0;
maxslack.up(i,j) = inf;
표시기bigMModel.optFile = 1;
z를 최소화하는 mip를 사용하여 IndicatorbigMModel을 해결합니다.
dorep(indicatorbigMModel,3);

$label 완료
mm(m,sm)을 설정합니다.
옵션 mm < 대표;

abort$(smax(mm,rep(mm,'modelstat')) > 1) '일부 모델은 전역 최적성으로 해결되지 않았습니다.', rep;
abort$(smax(mm,rep(mm,'solvestat')) > 1) '일부 모델에는 정상 완료가 아닌 Solvestat이 있습니다.', rep;

스칼라 차이;
diff = abs(smax(mm,rep(mm,'obj')) - smin(mm,rep(mm,'obj')));
abort$(abs(smax(mm,rep(mm,'obj')) - smin(mm,rep(mm,'obj'))) > 1e-3) '다른 객관적인 값을 얻습니다.', rep;