relief.gms : 구호임무

설명

오두막이나 마을은 10 x 10 격자의 20개 위치에 있습니다. 문제
구호 패키지를 위한 가장 좋은 두 곳의 드롭 위치를 찾는 것입니다.
마을 사람들의 이동 거리가 최소화됩니다.

우리는 이 문제를 공장 위치 문제로 보고 효율성을 추적합니다.
여러 방울의 경계. 두 방울에 대한 최적의 솔루션은 D.8과 E.2입니다.

또 다른 흥미로운 질문은 다음과 같습니다. 다른 드롭 위치가 몇 개나 있습니까?
예를 들어 가장 좋은 위치의 3%로 이동한 총 거리가 있습니다.

대형 모델 유형 :MIP


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


메인 파일 : relief.gms

$title 구호 임무 (RELIEF,SEQ=353)

$onText
오두막이나 마을은 10 x 10 그리드의 20개 위치에 있습니다. 문제
구호 패키지를 위한 가장 좋은 두 곳의 드롭 위치를 찾는 것입니다.
마을 사람들의 이동 거리가 최소화됩니다.

우리는 이 문제를 공장 위치 문제로 보고 효율성을 추적합니다.
여러 방울의 경계. 두 방울에 대한 최적의 솔루션은 D.8과 E.2입니다.

또 다른 흥미로운 질문은 다음과 같습니다. 다른 드롭 위치가 몇 개나 있습니까?
예를 들어 가장 좋은 위치의 3%로 이동한 총 거리가 있습니다.

Toczek J, 구호 임무, ORMS Today 37, 4(2010), 14페이지

키워드: 혼합 정수 선형 계획법, 공장 위치 문제, 조정 완화
$offText

$eolCom //

세트
   r '행' / A*J /
   c '열' / 1*10 /
   d '방울' / d1*d20 /;

표 dem(r,c) '구제 요구'
       1 2 3 4 5 6 7 8 9 10
   A 1
   비 1 1 1
   씨 1 1 1 1 1
   디 1 1 1
   전자 1 1
   F 1
   지 1
   H 1 1
   나
   J 1 1;

별칭 (r,rr), (c,cc);

Huts(r,c) '산장 위치'를 설정합니다.

매개변수
   dis(r,c,r,c) '유클리드 거리'
   numdrops '방울 수'
   maxdem '최대 드롭 요구량';

오두막(r,c) = dem(r,c);
maxdem = sum(huts, dem(huts));
dis(huts(r,c),rr,cc) = edist(r.pos-rr.pos,c.pos-cc.pos);

변수
   drop(r,c) '드롭 위치'
   walk(r,c,r,c) '산장에서 가장 가까운 낙하 지점까지 걸어간 거리'
   총 '걸은 총 거리';

바이너리 변수 드롭;
양수 가변 걷기;

방정식 수요, 공급, 적자, defnumdrop;

수요(오두막).. sum((r,c), walk(오두막,r,c)) =e= 1;

공급(r,c).. sum(huts, walk(huts,r,c)) =l= drop(r,c)*maxdem;

deftotal.. total =e= sum((huts,r,c), dis(huts,r,c)*walk(huts,r,c));

defnumdrop.. sum((r,c), drop(r,c)) =e= numdrops;

모델 m / 모두 /;

* -------------
* 최고의 2방울 솔루션을 얻으세요
* -------------
숫자 = 2;
옵션 limRow = 0, limCol = 0, optCr = 0,solvLink = 2, resLim = 60;
m.solPrint = 0;

mip를 사용하여 m min 총계를 해결합니다.

디스플레이 drop.l;

* -----------
* 효율적인 경계선 추적
* -----------
매개변수 QDrep '신속하고 더러운 보고서';

루프(d,
   numdrops = d.pos;
   mip를 사용하여 m min 총계를 해결합니다.
   m.solPrint = 2;
   // MIP 코드(CPLEX)가 분수 값을 반환할 수 있으므로 round()를 사용합니다.
   QDrep(r,c,d)$round(drop.l(r,c)) = sum ( 오두막, dis(huts,r,c)*walk.l(huts,r,c)) + eps*huts(r,c)*drop.l(r,c);
   QDrep('max','dist',d) = smax((huts,r,c), dis(huts,r,c)*walk.l(huts,r,c));
   QDrep('tot','dist',d) = sum ((huts,r,c), dis(huts,r,c)*walk.l(huts,r,c));
   QDrep('CPU','used',d) = m.resUsd;
);

QDrep을 표시합니다.

* ----------------------------------------------------------------
* 두 개의 드롭 포인트에 대해 최고 x% 이내의 모든 드롭 포인트를 찾습니다.
*
* n번째 정수 해를 제외하려면 다음과 같이 작성할 수 있습니다.
* cut(n).. sum(i, abs(x(i) - xsol(i,n)) =g= 1;
* abs()를 시뮬레이션하면 다음과 같은 결과가 나옵니다.
* cut(n).. sum((r,c), cutval(n,r,c)*drop(r,c)) =l= 1;
* cutval()에는 제외할 솔루션이 포함되어 있습니다.
* ----------------------------------------------------------------

세트
   nn '닫힌 해의 최대 개수' / n1*n50 /
   n(nn) '동적 집합';

매개변수
   '드롭 포인트의 총 거리' 제한
   objval(nn) '총 이동 마일'
   cutval(nn,r,c) '컷 생성을 위한 모든 가능한 솔루션';

숫자 = 2;
mip를 사용하여 m min 총계를 해결합니다.
한계 = 1.03*total.l;

방정식 cut(nn) '제거할 알려진 솔루션';

cut(n).. sum((r,c), cutval(n,r,c)*drop(r,c)) =l= 1;

모델 mm / m, 컷 /;

n(nn) = 아니오;  // 컷 세트 지우기

mm.solveStat = %solveStat.normalCompletion%;
mm.modelStat = %modelStat.optimal%;
mm.solPrint = 0;

loop(nn$(mm.solveStat = %solveStat.normalCompletion% 및
         mm.modelStat = %modelStat.optimal% 및
         total.l < 제한),
   n(nn) = 예;   //설정할 요소 추가
   cutval(nn,r,c) = round(drop.l(r,c));
   mip를 사용하여 mm min total을 해결합니다.
   mm.solPrint = 0;
   objval(nn) = total.l;
);

옵션 컷발:0:1:1;
표시 objval, cutval;

매개변수 적중;
hit(r,c) = sum(nn, cutval(nn,r,c));
조회수 표시;