설명
때때로 특정 정수 솔루션을 제외해야 할 수도 있습니다. 컷이라고 하는 추가 구속조건을 추가하여 이러한 구속조건을 제외할 수 있습니다. 솔루션. 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, 보고서 표시;