설명
시설 위치 문제의 간단한 버전은 다음과 같은 방법을 보여주기 위해 사용됩니다. 솔루션 풀 및 이와 관련된 도구가 작동합니다. 이 예는 취해진 것입니다 Cplex 11 사용자 매뉴얼(ILOG, Cplex 11 사용자 매뉴얼, 2007)에서 발췌 한 회사는 서비스를 제공하기 위해 최대 4개의 창고를 개설하는 것을 고려하고 있습니다. 9개의 다른 지역. 고정비용의 합을 최소화하는 것이 목표 창고 개설 및 다양한 운송과 관련된 창고에서 지역으로 상품을 배송하는 데 발생하는 비용입니다. 창고 오픈 여부는 바이너리 변수 ow로 표현됩니다. 창고 i에서 지역 j로 물품을 배송할지 여부가 표시됩니다. 이진 변수 oa로. 각 지역에는 지정된 양의 물품이 필요하며 각 창고는 보관할 수 있습니다. 한정된 수량의 상품만. 또한 각 지역에서 서비스를 제공해야 합니다. 정확히 하나의 창고로.
소형 모델 유형 :크레이지 슬롯
카테고리 : 크레이지 슬롯 테스트 라이브러리
메인 파일 : dumpsol.gms
$title 단순 시설 위치 문제에 대한 대체 솔루션(DUMPSOL,SEQ=476)
$onText
시설 위치 문제의 간단한 버전은 다음과 같은 방법을 보여주기 위해 사용됩니다.
솔루션 풀 및 이와 관련된 도구가 작동합니다. 이 예는 취해진 것입니다
Cplex 11 사용자 매뉴얼(ILOG, Cplex 11 사용자 매뉴얼, 2007)에서 발췌
한 회사는 서비스를 제공하기 위해 최대 4개의 창고를 개설하는 것을 고려하고 있습니다.
9개의 다른 지역. 고정비용의 합을 최소화하는 것이 목표
창고 개설 및 다양한 운송과 관련된
창고에서 지역으로 상품을 배송하는 데 발생하는 비용입니다.
창고 오픈 여부는 바이너리 변수 ow로 표현됩니다.
창고 i에서 지역 j로 물품을 배송할지 여부가 표시됩니다.
이진 변수 oa로.
각 지역에는 지정된 양의 물품이 필요하며 각 창고는 보관할 수 있습니다.
한정된 수량의 상품만. 또한 각 지역에서 서비스를 제공해야 합니다.
정확히 하나의 창고로.
다음 크레이지 슬롯 프로그램은 솔루션을 수집하는 방법을 보여줍니다.
여러 크레이지 슬롯 솔버에서 최적화 중에 발견되었습니다. 크레이지 슬롯는
GDX 컨테이너/파일에 개별 솔루션을 추가할 수 있습니다.
다른 프로그램이나 동일한 크레이지 슬롯 실행에서 사용됩니다. 솔버 링크의 이름은 다음과 같습니다.
이러한 GDX 컨테이너 'soln_loc_pNN.gdx', 여기서 NN은 직렬입니다.
발견된 솔루션의 수 다양한 솔루션을 관리하려면
솔버 링크에 의해 생성된 GDX 컨테이너의 이름은 다음 위치에 저장됩니다.
set elements 파일을 사용하는 set 'index'의 dumpsol.gdx*.
$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);
모델 위치 /all/ ;
* --- 솔루션을 보관할 세트, 매개변수 및 파일을 정의합니다.
가능한 솔루션을 설정합니다. /file1*file1000,soln_loc_p1*soln_loc_p1000/
solnpool(soln) 실제 솔루션;
스칼라 카드솔 솔루션 수;
* 솔버가 최적의 솔루션을 즉시 찾는 경우(예: cbc) 빈 dumpsol.gdx를 생성합니다.
Execute_unload 'dumpsol.gdx', solnpool=index;
별칭 (soln,s1,s2), (*,u);
매개변수
owX(soln,i) 솔루션별 창고 표시기
oaX(soln,i,j) 솔루션별 호 표시기
totcostX(soln) 총 비용
fcostX(soln) 고정 비용
tcostX(soln) 운송비
xcostX(soln,*) 솔루션별 비용 구조
mcostX(soln,*) 솔루션별 비용 구조;
파일 fsoln;
옵션 limrow=0, limcol=0, optcr=0;
loc.optfile=1; loc.solprint=%solPrint.quiet%; loc.savepoint = 1;
$if %크레이지 슬롯mip% == cbc $echo dumpsolutions dumpsol.gdx > cbc.opt
$if %크레이지 슬롯mip% == copt $echo solnpool dumpsol.gdx > copt.opt
$if %크레이지 슬롯mip% == cplex $echo solnpool dumpsol.gdx > cplex.opt
$if %크레이지 슬롯mip% == 구로비 $echo solnpool dumpsol.gdx > 구로비.opt
$if %크레이지 슬롯mip% == scip $echo 크레이지 슬롯/dumpsolutions = "dumpsol.gdx" > scip.opt
$if %크레이지 슬롯mip% == xpress $echo solnpool dumpsol.gdx > xpress.opt
mip를 사용하여 loc min totcost를 해결합니다.
Execute_load 'dumpsol.gdx', solnpool=index;
Cardoln = 카드(solnpool); 디스플레이 카드솔;
oaX(soln,i,j) = 0; owX(soln,i) = 0; xcostX(soln,u) = 0;
루프(solnpool(soln),
put_utility fsoln 'gdxin' / solnpool.te(soln);
실행_로드포인트;
oaX(soln,i,j) = round(oa.l(i,j));
owX(soln,i) = round(ow.l(i));
xcostX(soln,'totcost') = totcost.l;
xcostX(soln,'tcost') = tcost.l;
xcostX(soln,'fcost') = fcost.l;
);
* 크레이지 슬롯에 보고된 솔루션 복원
Execute_loadpoint 'loc_p.gdx';
xcostX를 표시합니다.
$if %크레이지 슬롯mip% == cbc $echo dumpsolutionsmerged dumpsol.gdx > cbc.op2
$if %크레이지 슬롯mip% == copt $echo solnpoolMerge dumpsol.gdx > copt.op2
$if %크레이지 슬롯mip% == cplex $echo solnpoolMerge dumpsol.gdx > cplex.op2
$if %크레이지 슬롯mip% == 구로비 $echo solnpoolMerge dumpsol.gdx > 구로비.op2
$if %크레이지 슬롯mip% == scip $echo 크레이지 슬롯/dumpsolutionsmerged = "dumpsol.gdx" > scip.op2
$if %크레이지 슬롯mip% == xpress $echo solnpoolMerge dumpsol.gdx > xpress.op2
* 솔버가 최적의 솔루션을 즉시 찾는 경우(예: cbc) 빈 dumpsol.gdx를 생성합니다.
옵션 클리어=solnpool;
Execute_unload 'dumpsol.gdx', solnpool=index, oaX=oa, owX=ow, totcostX=totcost, tcostX=tcost, fcostX=fcost;
loc.optfile=2;
mip를 사용하여 loc min totcost를 해결합니다.
Execute_load 'dumpsol.gdx', solnpool=index, oaX=oa, owX=ow, totcostX=totcost, tcostX=tcost, fcostX=fcost;
mcostX(solnpool,'totcost') = totcostX(solnpool);
mcostX(solnpool,'tcost') = tcostX(solnpool);
mcostX(solnpool,'fcost') = fcostX(solnpool);
xcostX, mcostX 표시;