icut.gms : 정수 잘라내기 예

설명

때때로 특정 정수 솔루션을 제외해야 할 수도 있습니다.
컷이라고 하는 추가 구속조건을 추가하여 이러한 구속조건을 제외할 수 있습니다.
솔루션. k 번째 정수 해를 제외하려면 다음과 같이 작성할 수 있습니다.

   cut(k).. sum(i, abs(x(i) - xsol(i,k)) =g= 1;

절대 함수는 0/1 변수를 사용하여 시뮬레이션해야 합니다.
그리고 몇 가지 추가 제약 조건이 있습니다. 솔루션을 제외할 때
하한 또는 상한에 있으므로 추가 0/1 변수가 필요하지 않습니다.

이 예에서는 가능한 모든 항목을 열거하는 방법을 간단히 보여줍니다.
네 개의 정수 변수의 조합.

소형 모델 유형 :MIP


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


메인 파일 : icut.gms

$title 정수 잘라내기 예(ICUT,SEQ=160)

$onText
때로는 특정 정수 솔루션을 제외해야 할 수도 있습니다.
컷이라고 하는 추가 구속조건을 추가하여 이러한 구속조건을 제외할 수 있습니다.
솔루션. k 번째 정수 해를 제외하려면 다음과 같이 작성할 수 있습니다.

   cut(k).. sum(i, abs(x(i) - xsol(i,k)) =g= 1;

절대 함수는 0/1 변수를 사용하여 시뮬레이션해야 합니다.
그리고 몇 가지 추가 제약 조건이 있습니다. 솔루션을 제외할 때
하한 또는 상한에 있으므로 추가 0/1 변수가 필요하지 않습니다.

이 예에서는 가능한 모든 항목을 열거하는 방법을 간단히 보여줍니다.
네 개의 정수 변수의 조합.

슬롯 나라 Development Corporation, 공식화 및 언어 예제.

키워드: 혼합 정수 선형 계획법, 슬롯 나라 공식화 및 언어 예제,
          정수 컷, 수학
$offText

$eolCom //

세트
   i '정수변수에 대한 인덱스' / 1*4 /
   즉(i) '변수가 고정됨'
   in(i) '고정되지 않음'
   il(i) '하한의 해'
   iu(i) '상한의 해'
   ib(i) '경계 간 솔루션'
   kk '컷 식별 세트' / 1*100 /
   k(kk) 'k의 동적 부분 집합'
   bb(kk,i) '메모리 자르기'
   bl(kk,i) '메모리 자르기'
   bu(kk,i) '메모리 자르기';

변수
   x(i) '테스트 변수'
   z '일부 객관적인 변수'
   b(kk,i) '해법 간 플립플롭'
   u(kk,i) '변화'
   l(kk,i) '아래로 변경됨';

정수 변수 x;
이진변수 b;
양의 변수 u, l;

방정식
   cut(kk) '메인 컷 방정식'
   cutu(kk,i) '정수 사이의 상한'
   cutl(kk,i) '정수 사이의 하한'
   cutul(kk,i) '양수 및 음수 편차 정의'
   obj 'obj 정의';

매개변수
   cutrhs(kk) 'RHS 값 자르기'
   cutlx(kk,i) '하한 자르기'
   cutux(kk,i) '상한 자르기'
   cuts(kk,i) '절단 솔루션 값'
   report(kk,*) '보고서 변수 잘라내기'
   whatnext '루프 제어 변수';

* 솔루션을 주문할 목적 함수를 선택합니다.
obj.. z =e= sum(i, power(10,card(i) - ord(i))*x(i));

cut(k).. - sum(bu(k,i), x(i)) + sum(bl(k,i),x(i)) + sum(bb(k,i), l(bb) + u(bb)) =g= cutrhs(k);

cutu(bb(k,i)).. u(bb) =l= cutux(bb)*b(bb);

cutl(bb(k,i)).. l(bb) =l= cutlx(bb)*(1 - b(bb));

cutul(bb(k,i)).. x(i) =e= cuts(bb) + u(bb) - l(bb);

모델 열거형 / 모두 /;

* 초기 솔루션을 구하고 경계를 설정합니다.
x.lo(i) = 2;
x.up(i) = 4;
x.fx('2') = 3;   // 하나의 변수를 수정합니다.
x.up('4') = 3;   // 두 개의 값만
x.l(i) = x.lo(i);

k(kk) = 아니오;                        // 컷 세트를 비워 둡니다.
즉(i) = 예$(x.lo(i) = x.up(i));   // 고정변수 찾기
in(i) = 예 - 즉(i);               // 자유 변수 찾기

무엇다음 = 1;  // 초기 루프 제어
enum.resUsd = 0;  // 초기 CPU 사용
enum.resLim = 60;  // 문제에 60초 이상 시간을 투자하지 마세요

* 모든 해를 열거하므로 솔버가 찾은 첫 번째 해에 만족합니다.
열거형.optCr = 0;
enum.optCa = 1e06;

루프(kk$whatnext,
   il(in) = yes$(x.l(in) = x.lo(in));         // 하위에서 변수 찾기
   iu(in) = yes$(x.l(in) = x.up(in));         // 위쪽에서 변수 찾기
   ib(in) = 예 - ie(in) - iu(in) - il(in);   // 사이에 있는 변수를 찾습니다.
   k(kk) = 그렇습니다;   // 추가
   bl(kk,il) = 예;   // 잘라내기
   bu(kk,iu) = 예;   // 정보
   bb(kk,ib) = 예;   // 필요에 따라
   cutux(kk,ib) = x.up(ib) - x.l(ib);
   cutlx(kk,ib) = x.l(ib) - x.lo(ib);
   컷(kk,ib) = x.l(ib);
   cutrhs(kk) = 1 + sum(il, x.l(il)) - sum(iu, x.l(iu));
   보고서(kk,i) = x.l(i);                   // 이전 솔루션 저장
   보고서(kk,'바이너리') = 카드(bb);        // 바이너리 기억하기
   Report(kk,'CPU 시간') = enum.resUsd;     //시간 기억하기

   mip를 사용하여 enum min z를 해결합니다.

   enum.limCol = 0;                   // 끄기
   enum.limRow = 0;                   // 모두
   enum.solPrint = %solPrint.quiet%;  // 출력
   whatnext = enum.modelStat = %modelStat.optimal% 또는 enum.modelStat = %modelStat.integerSolution%;
);

enum.solveStat, enum.modelStat, 보고서 표시;