설명
J. 브림버그, P. 한센, K.-W. Lih, N. Mladenovic, M. Breton 2003. 송유관 설계 문제. 운영 연구, Vol 51, No. 2 228-239 키워드: 혼합 정수 선형 계획법, 파이프라인 설계, 네트워크 최적화
대형 모델 유형 :MIP
카테고리 : 슬롯 커뮤니티 모델 라이브러리
메인 파일 : 슬롯 커뮤니티gms
$title 동시 MIP를 사용하는 석유 파이프라인 설계 문제 해결(슬롯 커뮤니티SEQ=370)
$onText
J. 브림버그, P. 한센, K.-W. Lih, N. Mladenovic, M. Breton 2003.
송유관 설계 문제. 운영 연구, Vol 51, No. 2 228-239
키워드: 혼합 정수 선형 계획법, 파이프라인 설계, 네트워크 최적화
$offText
세트
n '송유관 네트워크의 노드'
nw(n) '노드의 하위 집합'
k '오일 파이프 유형'
kk(k) '파이프라인 유형 세트 감소'
regnode(n) '비포트 노드'
포트(n) '포트'
arc(n,n) '네트워크의 호';
매개변수
cap(k) 'k형 오일 파이프의 용량'
Pipecost(k) 'k 유형 용량의 화폐 단위'
p(n) '각 노드에서의 생산'
edgedist(n,n) '단방향 거리'
dist(n,n) '호의 거리';
스칼라
cap1 '1종 송유관 용량'
Pipecost1 '유형 1 파이프의 화폐 단위';
별칭(n,m);
변수
bk(n,n,k) '호의 k 유형 파이프에 대한 변수 빌드'
b(n,n) '호의 일부 파이프에 대한 변수 작성'
f(n,n) '호의 흐름 변수'
비용 '네트워크에 파이프를 설치하는 데 드는 비용';
이진변수 bk, b;
양의 변수 f;
방정식
obj '송유관 네트워크 건설 비용'
oneout(n) '각 노드당 최대 하나의 유출 흐름'
oneoutp(n) '각 생산 노드에 대해 하나의 유출 흐름'
bal(n) '흐름 보존 제약 조건'
bigM(n,n) '흐름 용량 제약'
defb(n,n) '추가 파이프 제약조건';
obj..sum(arc(nw,n), dist(arc)*(pipecost1*b(arc)
+ 합계(kk, 파이프 비용(kk)*bk(arc,kk))))
=e= 비용;
oneout(m)$(p(m) 아님).. sum((arc(m,n)), b(m,n)) =l= 1;
oneoutp(m)$p(m).. sum((arc(m,n)), b(m,n)) =e= 1;
bal(regnode(nw)).. p(nw) =e= sum(arc(nw,m), f(nw,m)) - sum(arc(m,nw), f(m,nw));
bigM(arc(nw,n)).. cap1*b(arc) + sum(kk, cap(kk)*bk(arc,kk)) =g= f(arc);
defb(arc(nw,n))..sum(kk, bk(arc,kk)) =l= b(arc);
모델 슬롯 커뮤니티 / 모두 /;
세트
k '오일 파이프 유형' / 1*6 /
n '송유관 네트워크의 노드'
/ 1 'H87', 2 '에치라', 3 'SIMBA-CONOCO-C'
4 '아지프타시', 5 '심바-코노코-B', 6 'J87'
7개 'CONN07', 8개 'MBASSI-CONOCO', 9개 'WELL09'
10 '남바-텐네코', 11 'ELF-B', 12 'NDOGO-C-ELF'
13개 '팡가아지프', 14개 '비고르노', 15개 '콘15'
16 'AGIP-PANGA-B', 17 'CONN17', 18 'MASSANGA-TENNECO-A'
19 'WELL19', 20 'MASSANGA-TENNECO-B', 21 '치발라-엘프'
22개 '아워리큘라', 23개 '루시나쉘', 24개 '콘24'
25'CONN25', 26'치보보-트리톤-A', 27'CONN27'
28 'MWENGUI-ELF', 29 'MBYA-ELF', 30 'CONN30'
31 '치보보-트리톤-B', 32 'K8', 33 '감바' /;
매개변수
cap(k) 'k형 오일 파이프의 용량'
/ 2 5, 3 10, 4 25, 5 50, 6 100 /
Pipecost(k) 'k 유형 용량의 화폐 단위'
/ 2 10, 3 15, 4 25, 5 40, 6 65 /
p(n) '각 노드에서의 생산'
/ 1 5, 2 7, 3 5, 4 6, 5 5, 6 4, 8 7, 9 3, 10 5
11 4, 12 3, 13 6, 14 9, 16 5, 18 6, 19 5, 20 4, 21 6
22 3, 23 8, 26 5, 28 5, 29 10, 31 6, 32 6 /
edgedist(n,n) '각 모서리의 일반화된 거리'
/ 1.2 3.50, 1.3 1.90, 1.4 5.40, 2.3 3.70, 2.7 1.15
3.4 4.90, 3.5 2.50, 3.7 2.60, 3.33 4.80, 4.5 5.30
4 .6 4.00, 5 .6 4.30, 5 .8 2.70, 5 .9 2.10, 5 .33 3.75
6 .8 2.60, 7 .33 1.60, 8 .9 2.20, 8 .10 2.20, 9 .12 2.30
9 .33 1.60, 10.11 2.00, 10.13 2.80, 10.33 5.30, 11.12 1.10
11.13 1.80, 12.13 2.50, 12.14 1.20, 12.33 3.00, 13.14 2.10
13.16 3.20, 14.15 1.20, 14.16 5.30, 15.16 6.30, 15.17 2.10
15.33 1.65, 16.17 4.80, 17.19 7.30, 17.24 2.70, 18.19 1.50
19.20 1.80, 19.21 0.90, 19.23 3.00, 20.21 1.30, 20.26 2.20
20.29 4.80, 21.22 2.50, 21.23 2.80, 21.26 2.90, 22.23 0.80
23.24 2.40, 23.25 3.00, 23.26 5.00, 23.29 3.70, 24.25 0.90
24.29 4.50, 25.29 3.30, 25.30 0.90, 26.27 1.20, 26.28 2.80
26.31 2.50, 27.28 2.10, 27.31 1.50, 28.29 1.30, 28.31 3.00
29.30 2.60, 29.31 4.00, 30.32 0.90 /;
세트
regnode(n) '비포트 노드'
포트(n) '포트'
arc(n,n) '네트워크의 호'
kk(k) '파이프라인 유형의 감소된 세트';
매개변수 dist(n,n) '호의 거리';
dist(m,n) = edgedist(m,n) + edgedist(n,m);
arc(m,n)$dist(m,n) = 예;
* 마지막 노드는 포트입니다.
포트(n)$(카드(n) = ord(n)) = 예;
regnode(n) = 예;
regnode(포트) = 아니오;
arc(포트,n) = 아니오;
kk(k) = 그렇습니다;
kk('1') = 아니요;
kk('2') = 아니요;
파이프비용1 = 파이프비용('2');
cap1 = cap('2');
* 제거된 파이프 라인 유형에 대한 데이터 조정
파이프비용(kk) = 파이프비용(kk) - 파이프비용1;
캡(kk) = 캡(kk) - 캡1;
nw(n) = 예;
세트
'해결사' / cbc, scip, gurobi, cplex, xpress /
mtype '모델 유형' / mip /
ss(s) '사용 가능한 솔버';
ss(s) = SolverCapability(s,'mip');
매개변수 h(s) '핸들';
슬롯 커뮤니티solveLink = %solveLink.asyncGrid%;
슬롯 커뮤니티resLim = 60;
옵션 limRow = 0, limCol = 0, solPrint = 자동, optCr = 0, optCa = 0;
루프(ss,
if(sameas('cbc', ss), 옵션 mip = cbc;);
if(sameas('cplex', ss), option mip = cplex;);
if(sameas('gurobi', ss), option mip = gurobi;);
if(sameas('scip', ss), 옵션 mip = scip;);
if(sameas('xpress', ss), option mip = xpress;);
mip를 사용하여 비용을 최소화하는 슬롯 커뮤니티 문제를 해결합니다.
h(ss) = 슬롯 커뮤니티handle;
);
매개변수 담당자, haveSolution / 0 /;
$eolCom //
* 이제 수집하세요
반복하다
루프(ss$handlecollect(h(ss))),
담당자(ss,'solveStat') = 슬롯 커뮤니티solveStat;
담당자(ss,'modelStat') = 슬롯 커뮤니티modelStat;
담당자(ss,'resUsd' ) = 슬롯 커뮤니티resUsd;
담당자(ss,'objVal') = 슬롯 커뮤니티objVal;
display$handledelete(h(ss)) '핸들 삭제 문제';
h(ss) = 0;
haveSolution$(슬롯 커뮤니티modelStat = %modelStat.optimal% 또는 슬롯 커뮤니티modelStat = %modelStat.integerSolution%) = 1;
);
if(haveSolution = 0, display$sleep(0.25) '1/4초 동안 자고 있었습니다.';);
haveSolution = 1 또는 카드(h) = 0 또는 timeelapsed > 70이 될 때까지;
디스플레이 담당자;
* 일부 솔버 프로세스가 아직 실행 중일 수 있습니다. 그리드의 경우
* 디렉토리는 스크래치 디렉토리입니다. 작업이 완료될 때까지 기다리는 것이 좋습니다.
* 종료하지 않으면 스크래치를 제거하는 데 문제가 발생합니다.
* GAMS가 종료되면 자동으로 생성되는 디렉토리입니다.
$ifThen "%gams.scrdir%"=="%gams.griddir%"
반복하다
루프(ss$handlecollect(h(ss))),
담당자(ss,'solveStat') = 슬롯 커뮤니티solveStat;
담당자(ss,'modelStat') = 슬롯 커뮤니티modelStat;
담당자(ss,'resUsd' ) = 슬롯 커뮤니티resUsd;
담당자(ss,'objVal') = 슬롯 커뮤니티objVal;
display$handledelete(h(ss)) '핸들 삭제 문제';
h(ss) = 0;
);
display$sleep(card(h)*0.25) '잠깐 자고 있었습니다.';
카드(h) = 0 또는 경과 시간 > 70까지;
디스플레이 담당자;
$endIf
abort$(haveSolution = 0) '정수 솔루션을 찾지 못했습니다.';