설명
시설 위치 문제의 간단한 버전은 다음과 같은 방법을 보여주기 위해 사용됩니다. 솔루션 풀 및 이와 관련된 도구가 작동합니다. 이 예는 취해진 것입니다 CPLEX 11 사용자 매뉴얼(ILOG, CPLEX 11 사용자 매뉴얼, 2007)에서 발췌 한 회사는 서비스를 제공하기 위해 최대 4개의 창고를 개설하는 것을 고려하고 있습니다. 9개의 다른 지역. 고정비용의 합을 최소화하는 것이 목표 창고 개설 및 다양한 운송과 관련된 창고에서 지역으로 상품을 배송하는 데 발생하는 비용입니다. 창고 오픈 여부는 바이너리 변수 ow로 표현됩니다. 창고 i에서 지역 j로 물품을 배송할지 여부가 표시됩니다. 이진 변수 oa로. 각 지역에는 지정된 양의 물품이 필요하며 각 창고는 보관할 수 있습니다. 한정된 수량의 상품만. 또한 각 지역에서 서비스를 제공해야 합니다. 정확히 하나의 창고로.
소형 모델 유형 :MIP
카테고리 : 슬롯 사이트 추천 모델 라이브러리
메인 파일 : 슬롯 사이트 추천gms
$title 단순 시설 위치 문제에 대한 CPLEX 솔루션 풀(SOLNPOOL,SEQ=326)
$onText
시설 위치 문제의 간단한 버전은 다음과 같은 방법을 보여주기 위해 사용됩니다.
솔루션 풀 및 이와 관련된 도구가 작동합니다. 이 예는 취해진 것입니다
CPLEX 11 사용자 매뉴얼(ILOG, CPLEX 11 사용자 매뉴얼, 2007)에서 발췌
한 회사는 서비스를 제공하기 위해 최대 4개의 창고를 개설하는 것을 고려하고 있습니다.
9개의 다른 지역. 고정비용의 합을 최소화하는 것이 목표
창고 개설 및 다양한 운송과 관련된
창고에서 지역으로 상품을 배송하는 데 발생하는 비용입니다.
창고 오픈 여부는 바이너리 변수 ow로 표현됩니다.
창고 i에서 지역 j로 물품을 배송할지 여부가 표시됩니다.
이진 변수 oa로.
각 지역에는 지정된 양의 물품이 필요하며 각 창고는 보관할 수 있습니다.
한정된 수량의 상품만. 또한 각 지역에서 서비스를 제공해야 합니다.
정확히 하나의 창고로.
다음 GAMS 프로그램은 다음과 같은 다양한 접근 방식을 보여줍니다.
솔루션 풀을 수집합니다. GAMS는 개별 솔루션을 GDX에 저장합니다.
다른 프로그램이나 동일한 프로그램에서 추가로 사용할 수 있는 컨테이너/파일
GAMS가 실행됩니다. CPLEX는 이러한 GDX 컨테이너의 이름을 'soln_loc_pNN.gdx'로 지정합니다. 여기서 NN
발견된 솔루션의 일련 번호입니다. 다양하게 관리하려면
솔루션에서는 CPLEX에서 생성된 GDX 컨테이너의 이름이 저장됩니다.
set elements 파일*을 사용하는 set 'index'의 solnpool.gdx에서.
이 게임 실행에서는 8가지 예시가 해결되었습니다.
키워드: 혼합정수선형계획법, 시설 위치 문제, CPLEX
솔루션 풀
$offText
세트
i '창고' / w1*w4 /
j '지역' / r1*r9 /;
매개변수
f(i) '고정 비용' / w1 130, w2 150, w3 170, w4 180 /
c(i) '용량' / w1 90, w2 110, w3 130, w4 150 /
d(j) '수요' / r1 10, r2 10, r3 12, r4 15, r5 15
r6 15, r7 20, r8 20, r9 30 /;
표 t(j,i) '운송 비용'
w1 w2 w3 w4
r1 10 30 25 55
r2 10 25 25 45
r3 20 23 30 40
r4 25 10 26 40
r5 28 12 20 29
r6 36 19 16 22
r7 40 39 22 27
r8 75 65 55 35
r9 34 43 41 62;
변수
totcost '총 비용'
fcost '고정 비용'
tcost '교통비'
ow(i) '개방형 창고 표시'
oa(i,j) '지역으로의 공개 배송 아크 창고 표시';
이진 변수 ow, oa;
방정식
deftotcost '정의 총 비용'
defcost '정의 고정 비용'
deftcost '정의 운송비'
defwcap(i) '용량에 따라 창고 활용을 제한'
onew(j) '지역당 하나의 창고만'
defow(i,j) 'i에서 j로 배송되면 창고가 열립니다.';
deftotcost..totcost =e= fcost + tcost;
defcost.. fcost =e= sum(i, f(i)*ow(i));
deftcost.. tcost =e= sum((i,j), t(j,i)*oa(i,j));
defwcap(i).. sum(j, d(j)*oa(i,j)) =l= c(i);
onew(j)..sum(i, oa(i,j)) =e= 1;
defow(i,j)..ow(i) =g= oa(i,j);
모델 위치 / 모두 /;
* 솔루션을 보관할 세트, 매개변수 및 파일을 정의합니다.
세트
슬롯 사이트 추천 '솔루션 풀의 가능한 솔루션' / file1*file1000 /
solnpool(슬롯 사이트 추천) '실제 솔루션';
Scalar Cardsoln '풀에 있는 솔루션 수';
별칭 (슬롯 사이트 추천s1,s2), (*,u);
매개변수
owX(슬롯 사이트 추천i) '솔루션별 창고 표시기'
oaX(슬롯 사이트 추천i,j) '솔루션별 호 표시기'
xcostX(슬롯 사이트 추천,*) '솔루션별 비용 구조';
파일 fcpx / cplex.opt /;
옵션 limRow = 0, limCol = 0, optCr = 0, mip = cplex;
loc.opt파일 = 1;
loc.solPrint = %solPrint.quiet%;
loc.savePoint = 1;
* gdx 파일과 다른 솔루션을 로드하는 코드가 사용됩니다.
* 이 프로그램에서 여러 번 실행되므로 포함 파일에 복사됩니다.
$onEcho > readsoln.gms
Execute_load 'solnpool.gdx', solnpool = index;
Cardoln = 카드(solnpool);
디스플레이 카드솔;
oaX(슬롯 사이트 추천i,j) = 0;
owX(슬롯 사이트 추천i) = 0;
xcostX(슬롯 사이트 추천u) = 0;
루프(solnpool(슬롯 사이트 추천),
put_utility 'gdxin' / solnpool.te(슬롯 사이트 추천);
실행_로드포인트;
oaX(슬롯 사이트 추천i,j) = round(oa.l(i,j));
owX(슬롯 사이트 추천i) = round(ow.l(i));
xcostX(슬롯 사이트 추천,'totcost') = totcost.l;
xcostX(슬롯 사이트 추천,'tcost') = tcost.l;
xcostX(슬롯 사이트 추천,'fcost') = fcost.l;
xcostX(슬롯 사이트 추천,'fcost^0.96') = fcost.l**0.96;
);
* GAMS에 보고된 솔루션 복원
Execute_loadpoint 'loc_p.gdx';
$offEcho
* 1. 정기 최적화 과정에서 발견된 재직자를 수집합니다.
* Cplex 옵션 'solnpool'은 다음에서 솔루션 수집을 트리거합니다.
* GDX 컨테이너 solnpool.
putClose fcpx 'solnpool solnpool.gdx' / '스레드 1';
mip를 사용하여 loc min totcost를 해결합니다.
$include readsoln
xcostX를 표시합니다.
* 2. 일반 최적화 절차 대신 채우기 절차를 사용합니다(옵션).
* 'solnpoolpop 2'). 기본적으로 우리는 다음에 의해 결정된 20개의 솔루션을 생성합니다.
* populatelim 옵션의 기본값(하나의 스레드에만 유효함). 이것은
* 휴리스틱과 컷으로 빠르게 해결되는 간단한 모델이므로 필요합니다.
* Cplex가 대체 솔루션을 찾을 수 있는 충분한 탐색 공간을 확보할 수 있도록 합니다.
* 이는 'solnpoolintensity 4' 옵션을 사용하여 수행됩니다. 최적의 솔루션을 통해
* 해결책을 너무 빨리 찾을 수 없으므로 이 옵션의 기본값이면 충분합니다.
putClose fcpx 'solnpool solnpool.gdx' / '스레드 1' / 'solnpoolintensity 4' / 'solnpoolpop 2';
mip를 사용하여 loc min totcost를 해결합니다.
$include readsoln
xcostX를 표시합니다.
* 3. 이제 상황은 더욱 복잡해집니다. 채우기 위한 첫 번째 호출 후에 우리는 지시합니다.
* GAMS/Cplex 링크는 GAMS 프로그램 'simple.gms'를 실행하여 여부를 결정합니다.
* 채우기 프로시저를 다시 호출해야 합니다. 게다가 우리가 지시할게
* 풀에서 솔루션 11~15를 삭제하는 Cplex입니다. 이 두 라운드가 끝나면
* 풀에는 35개의 솔루션이 있습니다. 확장되는 %ncall% 사용에 유의하세요.
* 'simple.gms'의 이전 실행 횟수를 세는 정수로.
* Cplex에서 호출한 게임 실행의 0이 아닌 반환 코드는 다음으로 신호를 보냅니다.
* 이것이 마지막 통화였습니다.
putClose fcpx 'solnpool solnpool.gdx' / '스레드 1' / 'solnpoolintensity 4' / 'solnpoolpop 2'
/ 'solnpoolpoprepeat simple.gms'
/ 'solnpoolpopdel delsol.txt';
$onEchoV > simple.gms
$ifE %ncalls%>0 '검색 종료'를 중단합니다.
파일 f / delsol.txt /;
f '11 12 13 14 15'를 입력하세요.
$offEcho
mip를 사용하여 loc min totcost를 해결합니다.
$include readsoln
abort$(cardsoln <> 35) '35개의 솔루션을 얻을 것으로 예상됩니다.';
xcostX를 표시합니다.
* 4. 다음으로 채우기 절차를 호출하지만 다음과 같은 솔루션이 필요합니다.
* 최적의 3% 이내. 20개 이상을 찾으면 기꺼이
* 채우기 프로시저를 한 번 더 호출합니다. 11개가 있는 것으로 밝혀졌습니다.
* 이 품질의 솔루션이므로 채우기를 다시 호출할 필요가 없습니다.
putClose fcpx 'solnpool solnpool.gdx' / '스레드 1' / 'solnpoolintensity 4' / 'solnpoolpop 2'
/ 'solnpoolpoprepeat simple.gms'
/ 'solnpoolgap 0.03';
mip를 사용하여 loc min totcost를 해결합니다.
$include readsoln
xcostX를 표시합니다.
* 5. 차이점을 세어보면서 솔루션의 다양성을 살펴보자
* 선적 표시 변수 사이. 수를 제한하자
* 풀의 솔루션은 10개이며 10% 이내의 솔루션이 필요합니다.
* 최적.
putClose fcpx 'solnpool solnpool.gdx' / '스레드 1' / 'solnpoolintensity 4' / 'solnpoolpop 2'
/ 'solnpoolcapacity 10' / 'solnpoolgap 0.1';
mip를 사용하여 loc min totcost를 해결합니다.
$include readsoln
스칼라 aggdiff '집계된 차이' / 0 /;
루프((s1,s2)$(동일하지 않음(s1,s2) 및 solnpool(s1) 및 solnpool(s2)),
aggdiff = aggdiff + sum((i,j), oaX(s1,i,j) xor oaX(s2,i,j));
);
aggdiff 표시;
* 6. 이제 솔루션 풀 교체를 설정하여 실험을 반복합니다.
* '다양성'에 대한 전략 및 채우기 절차에서 더 많은 것을 찾도록 함
* 솔루션을 사용하면 집계된 차이가 증가해야 합니다.
putClose fcpx 'solnpool solnpool.gdx' / '스레드 1' / 'solnpoolintensity 4' / 'solnpoolpop 2'
/ 'solnpoolcapacity 10' / 'solnpoolgap 0.1'
/ 'populatelim 10000' / 'solnpoolreplace 2';
mip를 사용하여 loc min totcost를 해결합니다.
$include readsoln
스칼라 aggdiffX '집계된 차이' / 0 /;
루프((s1,s2)$(동일하지 않음(s1,s2) 및 solnpool(s1) 및 solnpool(s2)),
aggdiffX = aggdiffX + sum((i,j), oaX(s1,i,j) xor oaX(s2,i,j));
);
aggdiffX 표시;
abort$(aggdiffX < aggdiff) '우리는 *더 많은* 다양성을 기대했습니다.';
* 7. 다양성 필터를 사용하여 다양성을 미세 조정할 수 있습니다. 가정하자
* w1, w2 시설은 열려있습니다. 이 두 시설을 유지하는 솔루션을 보자
* 참고자료를 열어보세요. 우리는 다양성 필터를 사용하여 모든 것을 규정합니다.
* 솔루션 풀에 추가된 솔루션은 참조와 달라야 합니다.
* 적어도 두 개의 다른 시설을 개설하거나 폐쇄하기로 결정했습니다. 다음
* 필터는 최소 다양성을 2로 지정하여 이러한 다양성을 적용합니다.
* 참조 솔루션이 기존 솔루션이 되어 다음과 같이 보고됩니다.
* 풀의 첫 번째 솔루션.
fcpx 'solnpool solnpool.gdx' / '스레드 1' / 'solnpoolintensity 4' / 'solnpoolpop 2'를 입력하세요.
/ 'divfltlo 2' / 'writeflt ow2.flt';
매개변수 owrefsol(i) / w1 1, w2 1, w3 0, w4 0 /;
loop(i, put / 'ow.divflt("' i.tl:0 '") ' owrefsol(i):0:0;);
putClose fcpx;
mip를 사용하여 loc min totcost를 해결합니다.
$include readsoln
owX를 표시;
루프(solnpool(슬롯 사이트 추천)$(ord(슬롯 사이트 추천) > 1),
abort$(sum(i,abs(owX(슬롯 사이트 추천i) - owrefsol(i))) < 2) '솔루션은 거의 다릅니다.';);
* 8. 기존 필터를 이용하면 더 복잡한 필터를 구현할 수도 있습니다.
* 예를 들어 운송 비용이 다음보다 적도록 시행하고 싶습니다.
* 고정비용**0.96. 기존 필터는 BCH의 일부로 구현됩니다.
* 시설(/docs/bch.htm). 새로운 선임자가 나올 때마다
* Cplex에서 찾은 Cplex는 GAMS 프로그램 'incbflt'를 실행합니다. 현직
*는 'bchout_i'라는 GDX 컨테이너에서 제공됩니다. GAMS 프로그램은 다음을 수행할 수 있습니다.
* 재임자가 승인되어야 하는지 또는 거부되어야 하는지를 검사하고 결정합니다.
* 플렉스. Cplex에서 호출한 게임 실행의 0이 아닌 반환 코드는 신호를 보냅니다.
* 현직자가 수락한 Cplex에.
putClose fcpx 'solnpool solnpool.gdx' / '스레드 1' / 'solnpoolintensity 4' / 'solnpoolpop 2'
/ 'userincbcall incbflt.gms';
$onEcho > incbflt.gms
가변 tcost, fcost;
$gdxIn bchout_i
$load tcost fcost
abort$(tcost.l < fcost.l**0.96) '수락';
$offEcho
mip를 사용하여 loc min totcost를 해결합니다.
$include readsoln
xcostX를 표시합니다.
루프(solnpool(슬롯 사이트 추천),
abort$(xcostX(슬롯 사이트 추천,'tcost') >= xcostX(슬롯 사이트 추천,'fcost')) 't비용이 너무 큽니다.';);
* 9. 때로는 솔루션을 주문하고 싶을 수도 있습니다.
* 최악으로. 이를 위해 $libInclude 순위 유틸리티를 사용할 수 있습니다. 그 순위 참고하세요
* 정렬된 인덱스를 반환합니다.
putClose fcpx 'solnpool solnpool.gdx' / '스레드 1' / 'solnpoolintensity 4' / 'solnpoolpop 2';
mip를 사용하여 loc min totcost를 해결합니다.
$include readsoln
매개변수
uval(슬롯 사이트 추천) '정렬되지 않은 객관적인 값'
idx(슬롯 사이트 추천) '정렬된 인덱스 위치';
uval(슬롯 사이트 추천) = xcostX(슬롯 사이트 추천,'totcost');
* 순위를 통해 솔루션 정렬
$libInclude 순위 uval solnpool idx
파일이 정렬됨 / 'sorted.txt' /;
put fsorted '정렬된 솔루션:';
* 파일에서 가장 좋은 5개를 가져옵니다.
루프(solnpool(슬롯 사이트 추천),
if(idx(슬롯 사이트 추천) <= 5,
put #(idx(슬롯 사이트 추천)+1) @1 슬롯 사이트 추천tl:0 ':' @10 uval(슬롯 사이트 추천);
);
);
넣어닫다;
* 새로운 매개변수로 모든 솔루션을 정렬합니다.
매개변수 sval(슬롯 사이트 추천) '정렬된 목표 값';
sval(슬롯 사이트 추천 + (idx(슬롯 사이트 추천) - ord(슬롯 사이트 추천)))$solnpool(슬롯 사이트 추천) = uval(슬롯 사이트 추천);
디스플레이 sval;