설명
이 문제는 다음을 충족하는 최소 비용 배송 일정을 찾습니다. 시장의 요구사항과 수요가 있는 공장의 공급품 Cplex에서 구현한 FeasOpt 기능을 사용하여 공급을 초과합니다. 그리고 구로비.
소형 모델 유형 :LP
카테고리 : 슬롯 무료체험 모델 라이브러리
메인 파일 : feasopt1.gms
$title FeasOpt 옵션을 사용하여 분석된 실행 불가능한 운송 문제(FEASOPT1,SEQ=314)
$onText
이 문제는 다음을 충족하는 최소 비용 배송 일정을 찾습니다.
시장의 요구사항과 수요가 있는 공장의 공급품
Cplex에서 구현한 FeasOpt 기능을 사용하여 공급을 초과합니다.
그리고 구로비.
Dantzig, GB, 3.3장. 선형 프로그래밍 및 확장.
프린스턴 대학 출판부, 뉴저지주 프린스턴, 1963년.
키워드: 선형 프로그래밍, 운송 문제, 스케줄링, 솔버 옵션 feasOpt,
최소한의 완화, 실현 불가능한 문제 계산
$offText
$ifI %system.lp% == cplex $goTo cont
$ifI %system.lp% == 구로비 $goTo 계속
$ifI %system.lp% == copt $goTo cont
$exit
$label 계속
세트
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);
모델 운송 / 모두 /;
옵션 limRow = 0, limCol = 0;
* 수요 20% 증가
b(j) = 1.2*b(j);
z를 최소화하는 lp를 사용하여 전송을 해결합니다.
'Simplex 알고리즘의 첫 번째 단계는 다음과 같이 실행 불가능성을 분포했습니다.'를 표시합니다.
x.infeas, 공급.infeas, 수요.infeas;
$ifI %system.lp% == cplex 파일 fslv '솔버 옵션 파일' / cplex.opt /; Transport.optFile = 1;
$ifI %system.lp% == gurobi 파일 fslv '솔버 옵션 파일' / gurobi.opt /; Transport.optFile = 1;
$ifI %system.lp% == copt 파일 fslv '솔버 옵션 파일' / copt.opt /; Transport.optFile = 1;
* 수요 측면에서 실현불가능성을 이동하려고 노력해 보겠습니다.
putClose fslv / 'feasopt 1' / 'equation.feaspref 0' / 'demand.feaspref 1';
z를 최소화하는 lp를 사용하여 전송을 해결합니다.
display '모든 실현가능성은 수요 방정식에 포함되어야 합니다', x.infeas, Supply.infeas, Demand.infeas;
중단$(sum((i,j), x.infeas(i,j)) + sum(i,supply.infeas(i)) > 1e-6) x.infeas, Supply.infeas, Demand.infeas;
중단$(sum(j,demand.infeas(j)) < 1e-5) x.infeas, 공급.infeas, 수요.infeas;
* 수요 측면에서 실행 불가능성을 다음과 같이 분배해 보겠습니다.
* 이완 측정을 위해 제곱합을 사용
putClose fslv / 'feasopt 1' / 'feasoptmode 4' / 'equation.feaspref 0' / 'demand.feaspref 1';
z를 최소화하는 lp를 사용하여 전송을 해결합니다.
'모든 실현불가능성은 수요 방정식에 포함되어야 하며 잘 분산되어야 합니다',
x.infeas, 공급.infeas, 수요.infeas;
중단$(sum((i,j), x.infeas(i,j)) + sum(i,supply.infeas(i)) > 1e-6) x.infeas, Supply.infeas, Demand.infeas;
중단$(sum(j,demand.infeas(j)) < 1e-5) x.infeas, 공급.infeas, 수요.infeas;
* 수요와 공급에 대한 실현불가능성을 분배하려고 노력합시다
* 이완 측정을 위해 제곱합을 사용하는 측면
putClose fslv / 'feasopt 1' / 'feasoptmode 4';
z를 최소화하는 lp를 사용하여 전송을 해결합니다.
'모든 실행 불가능성은 수요 및 공급 방정식에 포함되어야 하며 잘 분산되어야 합니다.',
x.infeas, 공급.infeas, 수요.infeas;
중단$(sum((i,j), x.infeas(i,j)) > 1e-6) x.infeas, 공급.infeas, 수요.infeas;
중단$(sum(i,supply.infeas(i)) + sum(j,demand.infeas(j)) < 1e-5) x.infeas, Supply.infeas, Demand.infeas;
* 수요와 공급에 대한 실현불가능성을 분배하려고 노력합시다
* 이완 측정을 위해 제곱합을 사용하여 측면
* 또한 운송 선적을 최적화할 수 있습니다.
* 원래 목적 함수
putClose fslv / 'feasopt 1' / 'feasoptmode 3';
z를 최소화하는 lp를 사용하여 전송을 해결합니다.
'모든 실현불가능성은 수요 방정식에 있어야 하며 "최적" x로 잘 분포되어야 합니다.',
x.infeas, 공급.infeas, 수요.infeas, x.l;
중단$(sum((i,j), x.infeas(i,j)) > 1e-6) x.infeas, 공급.infeas, 수요.infeas;
중단$(sum(i,supply.infeas(i)) + sum(j,demand.infeas(j)) < 1e-5) x.infeas, Supply.infeas, Demand.infeas;
* 발견된 완화에 따라 공급과 수요를 조정할 수 있습니다.
a(i) = a(i) + 공급.infeas(i);
b(j) = b(j) - 수요.infeas(j);
* 이제 실현 가능한 모델이 생겼습니다. 우리 이전의 원시들
* 해석은 최적의 것이어야 하므로 저장하여 비교해 보겠습니다.
* 다음 해결 결과와 함께;
매개변수 xbest(i,j);
xbest(i,j) = x.l(i,j);
* 솔버에게 웜 스타트를 하라고 지시해 봅시다.
* primal Simplex를 사용하는 단지 primal에서 (copt: Dual Simplex)
$ifI %system.lp% == cplex putClose fslv / 'advind 2' / 'lpmethod 1';
$ifI %system.lp% == gurobi putClose fslv / 'usebasis 1' / 'method 0';
$ifI %system.lp% == copt putClose fslv / 'presolve 0' / 'lpmethod 1';
z를 최소화하는 lp를 사용하여 전송을 해결합니다.
* 우리는 최적해와 동일한 원초해를 갖는 것이 더 좋습니다.
* 이전 실행. 문제는 좀 위험해서
* 퇴화.
abort$(transport.modelStat <> %modelStat.optimal% 또는 sum((i,j), xbest(i,j) - x.l(i,j)) > 1e-6) x.l, xbest;