cbenders.gms : 단순 시설 위치 문제를 위한 Cplex 슬롯 사이트 추천

설명

시설 위치 문제의 간단한 버전은 다음과 같은 방법을 보여주기 위해 사용됩니다.
Benders 분해는 Cplex 12.7에서 작동합니다. 모델에는 작은 것이 포함되어 있습니다.
예이며 이중 대시 매개변수 --wmax로 시작하여
임의의 수의 창고. 나머지 세트 및 데이터 항목은 다음과 같습니다.
이 wmax로부터 계산됩니다.

BendersStrategy에 의해 구동되는 Cplex의 슬롯 사이트 추천를 실행하는 세 가지 방법이 있습니다.
매개변수. BendersStrategy 수치가 낮을수록 더 많은 정보가 필요합니다.
사용자가 제공합니다.

이 문제는 RMIP로도 해결될 수 있지만 Benders는 그렇지 않기 때문에
이중 정보를 제공하면 Cplex 로그에 다음과 같은 몇 줄이 표시됩니다.
오류가 발생하지만 무시해도 됩니다.

한 회사는 서비스를 제공하기 위해 최대 4개의 창고를 개설하는 것을 고려하고 있습니다.
9개의 다른 지역. 고정비용의 합을 최소화하는 것이 목표
창고 개설 및 다양한 운송과 관련된
창고에서 지역으로 상품을 배송하는 데 발생하는 비용입니다.

창고 오픈 여부는 바이너리 변수 ow로 표현됩니다.
창고 i에서 지역 j로 물품을 배송할지 여부가 표시됩니다.
이진 변수 oa로.

각 지역에는 지정된 양의 물품이 필요하며 각 창고는 보관할 수 있습니다.
한정된 수량의 상품만. 또한 각 지역에서 서비스를 제공해야 합니다.
정확히 하나의 창고로.

키워드: 혼합 정수 선형 프로그래밍, 벤더 분해, 기능
          위치 문제

소형 모델 유형 :MIP


카테고리 : 슬롯 사이트 추천 모델 라이브러리


메인 파일 : cbenders.gms

$title 단순 시설 위치 문제를 위한 Cplex 벤더 (CBENDERS,SEQ=415)

$onText
시설 위치 문제의 간단한 버전은 다음과 같은 방법을 보여주기 위해 사용됩니다.
Benders 분해는 Cplex 12.7에서 작동합니다. 모델에는 작은 것이 포함되어 있습니다.
예이며 이중 대시 매개변수 --wmax로 시작하여
임의의 수의 창고. 나머지 세트 및 데이터 항목은 다음과 같습니다.
이 wmax로부터 계산됩니다.

BendersStrategy에 의해 구동되는 Cplex의 슬롯 사이트 추천를 실행하는 세 가지 방법이 있습니다.
매개변수. BendersStrategy 수치가 낮을수록 더 많은 정보가 필요합니다.
사용자가 제공합니다.

이 문제는 RMIP로도 해결될 수 있지만 Benders는 그렇지 않기 때문에
이중 정보를 제공하면 Cplex 로그에 다음과 같은 몇 줄이 표시됩니다.
오류가 발생하지만 무시해도 됩니다.

한 회사는 서비스를 제공하기 위해 최대 4개의 창고를 개설하는 것을 고려하고 있습니다.
9개의 다른 지역. 고정비용의 합을 최소화하는 것이 목표
창고 개설 및 다양한 운송과 관련된
창고에서 지역으로 상품을 배송하는 데 발생하는 비용입니다.

창고 오픈 여부는 바이너리 변수 ow로 표현됩니다.
창고 i에서 지역 j로 물품을 배송할지 여부가 표시됩니다.
이진 변수 oa로.

각 지역에는 지정된 양의 물품이 필요하며 각 창고는 보관할 수 있습니다.
한정된 수량의 상품만. 또한 각 지역에서 서비스를 제공해야 합니다.
정확히 하나의 창고로.

키워드: 혼합 정수 선형 프로그래밍, 벤더 분해, 기능
          위치 문제
$offText

$ifThen wmax를 설정하지 않음
   세트
      i '창고' / w1*w4 /
      j '지역' / r1*r9 /
      k '상품' / k1*k3 /;

   매개변수
      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;
$else
* 대규모 무작위 예제 생성
$ 평가 rmax %wmax%*5
$ 평가 kmax 라운드(%wmax%/3)
   세트
      i '창고' / w1*w%wmax% /
      j '지역' / r1*r%rmax% /
      k '상품' / k1*k%kmax% /;

   매개변수
      f(i) '고정 비용'
      c(i) '용량'
      d(j) '수요'
      t(j,i) '운송 비용';

   f(i) =uniformInt(100,200);
   c(i) =uniformInt(200,300);
   d(j) = 균일Int(20,60);
   t(j,i) = 균일Int(5,100);
$endIf

매개변수 ck(i,k), dk(j,k);
ck(i,k) = round(c(i)*uniform(0.5,1.8));
dk(j,k) = round(d(j)*uniform(0.5,1.8));

변수
   totcost '총 비용'
   fcost '고정 비용'
   tcost(k) '교통비'
   ow(i) '개방형 창고 표시'
   oa(i,j) '지역으로의 개방형 선적 아크 창고 표시'
   x(i,j,k) '지역으로의 공개 배송 아크 창고를 위한 상품 k의 배송';

이진 변수 ow, oa;
양수 변수 x;

방정식
   deftotcost '정의 총 비용'
   defcost '정의 고정 비용'
   deftcost(k) '정의 운송 비용'
   defwcap(i,k) '용량에 따라 창고 활용을 제한'
   defwdem(j,k) '상품 k에 대해 지역 j에서 만족을 요구합니다'
   twow(j) '지역당 창고가 2개만 있음'
   defow(i,j) 'i에서 j로 배송되면 창고가 열립니다.'
   defx(i,j,k) 'i와 j 사이에 링크가 열려 있는 경우에만 배송';

deftotcost.. totcost =e= fcost + sum(k, tcost(k));

defcost.. fcost =e= sum(i, f(i)*ow(i));

deftcost(k).. tcost(k) =e= sum((i,j), t(j,i)*x(i,j,k));

defwcap(i,k)..sum(j, x(i,j,k)) =l= ck(i,k);

defwdem(j,k)..sum(i, x(i,j,k)) =g= dk(j,k);

twow(j)..sum(i, oa(i,j)) =l= 2;

defow(i,j)..ow(i) =g= oa(i,j);

defx(i,j,k)..ck(i,k)*oa(i,j) =g= x(i,j,k);

모델 위치 / 모두 /;

파일 fopt / cplex.opt /;
fopt 'BendersStrategy 1'을 넣어주세요
        / 'variables.BendersPartition 0';
loop(k, put / "x.BendersPartition(*,*,'" k.tl:0 "') " ord(k):0:0
            / "tcost.BendersPartition('" k.tl:0 "') " ord(k):0:0;
);
putClose fopt;

$onEcho > cplex.op2
Benders전략 2
변수.BendersPartition 0
x.Benders파티션 1
tcost.Benders파티션 1
$offEcho

$onEcho > cplex.op3
Benders전략 3
$offEcho

$onEcho > cplex.op4
벤더파티션스테이지 1
Benders전략 1
$offEcho

totcost.stage = 0;
fcost.stage = 1;
tcost.stage(k) = ord(k) + 1;
x.stage(i,j,k) = ord(k) + 1;

옵션 솔버 = cplex, optCr = 0, limRow = 0, limCol = 0, solPrint = 꺼짐,solveLink = %solveLink.loadLibrary%;

스칼라 cpxOptFile;
for(cpxOptFile = 1 ~ 4,
   loc.optFile = cpxOptFile;
   mip를 사용하여 totcost를 최소화하는 loc를 해결합니다.
   abort$(loc.modelStat <> %modelStat.optimal%) '모델 상태가 최적일 것으로 예상합니다';
   abort$(abs(totcost.l - 11661) > 1e-6) '목표는 11661이 될 것으로 예상합니다.';
);

* 분해 정보를 전달하면서 SCIP로 다시 해결
옵션 솔버 = scip;
loc.opt파일 = 0;
* 최적의 솔루션으로 시작하는 것이 너무 쉽습니다.
x.l(i,j,k) = 0;
mip를 사용하여 totcost를 최소화하는 loc를 해결합니다.
abort$(loc.modelStat <> %modelStat.optimal%) '모델 상태가 최적일 것으로 예상합니다';
abort$(abs(totcost.l - 11661) > 1e-6) '목표는 11661이 될 것으로 예상합니다.';