설명
증강된 엡실론 제약 방법 버전 2(AUGMECON2) 이 방법은 다중 목표 정수 계획법 문제에 적용됩니다. (특히 다목표 다차원 배낭 문제) 50개의 이진 변수 X, 2개의 목적 함수 및 2개의 제약 조건 포함 AUGMECON2는 정확한 파레토 집합(모든 파레토 집합)을 생성하는 데 사용할 수 있습니다. 슬롯 사이트 추천의 솔루션) 단계 크기(즉, 그리드 포인트 사이의 간격) 제약 조건으로 사용되는 목적 함수)는 적절하게 선택되었습니다. 정수 목적 함수 문제의 경우 단계 크기를 계수합니다. 기껏해야 1과 같아야 합니다. 특정 문제의 정확한 파레토 세트는 35개의 파레토 슬롯 사이트 추천으로 구성됩니다. 솔루션. 2012 시스템의 경우 해결 시간은 약 4초입니다. 는 그리드 포인트는 491 = 두 번째 목적 함수 범위로 설정됩니다. 출력 파일 2kp50_augmecon2_results.txt에는 보상 테이블, 그리드 포인트 및 파레토 슬롯 사이트 추천 솔루션. "점프" 표시는 다음 중 하나 또는 더 많은 그리드 포인트를 건너뜁니다. 모델은 분리 가능합니다. 모델의 첫 번째 부분(라인 129까지)은 다음과 같습니다. 문제 설명과 두 번째 부분(라인 130)은 구현입니다. 방법의 추가 정보는 다음에서 확인할 수 있습니다. /modlib/adddocs/epscmmip.pdf
소형 모델 유형 :MIP
카테고리 : 슬롯 사이트 추천 모델 라이브러리
메인 파일 : epscmmip.gms
$title 다목적 슬롯 사이트 추천화를 위한 Eps-Constraint 방법의 개선된 버전(EPSCMMIP,SEQ=384)
$onText
증강 엡실론 제약 방법 버전 2(AUGMECON2)
이 방법은 다중 목표 정수 계획법 문제에 적용됩니다.
(특히 다목표 다차원 배낭 문제)
50개의 이진 변수 X, 2개의 목적 함수 및 2개의 제약 조건 포함
AUGMECON2는 정확한 파레토 집합(모든 파레토 집합)을 생성하는 데 사용할 수 있습니다.
슬롯 사이트 추천의 솔루션) 단계 크기(즉, 그리드 포인트 사이의 간격)
제약 조건으로 사용되는 목적 함수)는 적절하게
선택되었습니다. 정수 목적 함수 문제의 경우 단계 크기를 계수합니다.
기껏해야 1과 같아야 합니다.
특정 문제의 정확한 파레토 세트는 35개의 파레토 슬롯 사이트 추천으로 구성됩니다.
솔루션. 2012 시스템의 경우 해결 시간은 약 4초입니다. 는
그리드 포인트는 491 = 두 번째 목적 함수 범위로 설정됩니다. 출력 파일
2kp50_augmecon2_results.txt에는 보상 테이블, 그리드 포인트 및
파레토 슬롯 사이트 추천 솔루션. "점프" 표시는 다음 중 하나 또는
더 많은 그리드 포인트를 건너뜁니다.
모델은 분리 가능합니다. 모델의 첫 번째 부분(라인 129까지)은 다음과 같습니다.
문제 설명과 두 번째 부분(라인 130)은 구현입니다.
방법의
추가 정보는 다음에서 확인할 수 있습니다.
/modlib/adddocs/epscmmip.pdf
Mavrotas, G, Eps-constraint 방법의 효과적인 구현
다중 목표 수학 계획법 문제.
응용수학과 계산 213, 2(2009), 455-465.
Mavrotas, G 및 Florios, K, 증강 버전의 개선된 버전
정확한 파레토 세트를 찾기 위한 EPS 제약 방법(AUGMECON2)
다중 목적 정수 프로그래밍 문제.
응용수학과계산 219, 18(2013), 9652-9669
키워드: 혼합 정수 선형 계획법, 다목적 슬롯 사이트 추천화,
EPS 제약 방법, 정확한 파레토 집합, 수학
$offText
$eolCom //
$sTitle 예제 모델 정의
세트
I '제약' / i1* i2 /
J '결정 변수' / j1*j50 /
K '목적 함수' / k1* k2 /;
매개변수
dir(k) 'max의 경우 목적 함수 1, min의 경우 -1의 방향' / k1 1, k2 1 /
b(I) '제약조건의 RHS' / i1 1445, i2 1502.5 /;
테이블 c(K,J) '목적 함수 계수 C의 행렬'
j1 j2 j3 j4 j5 j6 j7 j8 j9 j10 j11 j12 j13 j14 j15 j16 j17
k1 21 69 26 92 77 30 96 80 60 61 52 92 19 10 63 34 100
k2 24 92 53 25 10 31 83 34 64 69 95 40 59 87 13 94 53
+ j18 j19 j20 j21 j22 j23 j24 j25 j26 j27 j28 j29 j30 j31 j32 j33 j34
k1 60 11 12 37 100 74 17 60 69 49 69 49 59 17 21 74 85
k2 52 61 53 78 34 89 32 28 56 52 40 41 59 35 96 72 55
+ j35 j36 j37 j38 j39 j40 j41 j42 j43 j44 j45 j46 j47 j48 j49 j50
k1 83 41 29 63 56 38 66 92 25 84 89 21 46 94 96 92
k2 100 44 90 66 59 22 72 25 36 16 56 91 61 56 66 53 ;
표 a(I,J) '기술 계수 A의 행렬'
j1 j2 j3 j4 j5 j6 j7 j8 j9 j10 j11 j12 j13 j14 j15 j16 j17
i1 84 49 68 20 97 74 60 30 13 95 19 41 17 95 73 12 66
i2 19 96 93 64 72 91 32 96 44 76 69 82 51 38 52 22 83
+ j18 j19 j20 j21 j22 j23 j24 j25 j26 j27 j28 j29 j30 j31 j32 j33 j34
i1 55 75 20 56 80 59 66 25 70 95 96 62 74 31 59 21 85
i2 27 70 56 29 89 86 48 13 95 66 94 16 44 67 90 48 29
+ j35 j36 j37 j38 j39 j40 j41 j42 j43 j44 j45 j46 j47 j48 j49 j50
i1 45 97 23 53 51 95 58 68 62 45 83 82 47 15 52 72
i2 90 54 77 28 100 86 51 62 40 54 21 55 50 62 51 77;
변수
Z(K) '목적 함수 변수'
X(J) '결정 변수';
이진변수 X;
방정식
objfun(K) '목적 함수'
con(I) '제약';
objfun(K).. sum(J, c(K,J)*X(J)) =e= Z(K);
con(I).. sum(J, a(I,J)*X(J)) =l= b(I);
모델 예 / 모두 /;
$sTitle EPS 제약 조건 방법
세트
k1(k) 'k의 첫 번째 요소'
km1(k) 'k의 첫 번째 요소를 제외한 모든 것'
kk(k) '제약 조건 allobj의 활성 목적 함수';
k1(k)$(ord(k) = 1) = 예;
km1(k) = 예;
km1(k1) = 아니오;
매개변수
rhs(k) 'eps-constraint에서 제한된 obj 함수의 오른쪽'
maxobj(k) '보수 테이블의 최대값'
minobj(k) '보수 테이블의 최소값'
numk(k) '1부터 시작하는 k의 순서 값';
스칼라
iter '총 반복 횟수'
infeas '총 실행 불가능 수'
elapsed_time '보상 및 e-sonstraint에 대한 경과 시간'
시작 '시작 시간'
'완료 시간'을 완료하세요.
변수
a_objval '목적 함수에 대한 보조 변수'
obj '지급 테이블 구성 중 보조 변수'
sl(k) 'eps 제약조건에 대한 여유 또는 잉여 변수';
양수 변수 sl;
방정식
con_obj(k) '제약된 목적 함수'
augm_obj '약하게 효율적인 솔루션을 피하기 위해 목적 함수를 강화했습니다'
allobj '하나의 표현식에 모든 목적 함수';
con_obj(km1).. z(km1) - dir(km1)*sl(km1) =e= rhs(km1);
* 첫 번째 목적 함수를 슬롯 사이트 추천화하고 나머지는 제약 조건으로 설정합니다.
* 두 번째 항은 약하게 효율적인 점을 피하기 위한 것입니다.
augm_obj..
a_objval =e= 합계(k1,dir(k1)*z(k1))
+ 1e-3*sum(km1,power(10,-(numk(km1) - 1))*sl(km1)/(maxobj(km1) - minobj(km1)));
allobj..sum(kk, dir(kk)*z(kk)) =e= obj;
모델
mod_payoff / 예시, allobj /
mod_epsmethod / 예, con_obj, augm_obj /;
매개변수 payoff(k,k) '지불 테이블 항목';
별칭(k,kp);
옵션 optCr = 0, limRow = 0, limCol = 0, solPrint = 꺼짐,solveLink = %solveLink.loadLibrary%;
* 사전 편찬 슬롯 사이트 추천화를 적용한 보수 테이블 생성
루프(kp,
kk(kp) = 그렇습니다;
반복하다
obj를 최대화하는 mip를 사용하여 mod_payoff를 해결합니다.
보수(kp,kk) = z.l(kk);
z.fx(kk) = z.l(kk); // 슬롯 사이트 추천화된 마지막 목표의 값을 고정합니다.
kk(k++1) = kk(k); // 목적 함수를 순환합니다.
kk(kp)까지;
kk(kp) = 아니오;
* 새로운 반복에 대한 목적 함수의 고정 값을 해제합니다.
z.up(k) = inf;
z.lo(k) = -inf;
);
if(mod_payoff.modelStat <> %modelStat.optimal% 및
mod_payoff.modelStat <> %modelStat.integerSolution%,
'mod_payoff에 대한 슬롯 사이트 추천의 솔루션 없음';)을 중단합니다.
파일 fx / 2kp50_augmecon2_results.txt /;
fx 'PAYOFF TABLE'/을 입력합니다.
루프(kp,
loop(k, put payoff(kp,k):12:2;);
넣어 /;
);
minobj(k) = smin(kp,payoff(kp,k));
maxobj(k) = smax(kp,payoff(kp,k));
* 그리드 포인트는 다음의 범위(최대값과 최소값의 차이)로 계산됩니다.
* 보수 테이블의 두 번째 목적 함수
$ 그리드 포인트를 설정하지 않은 경우 $set 그리드 포인트 491
세트
g '그리드 포인트' / g0*g%gridpoints% /
그리드(k,g) '그리드';
매개변수
Gridrhs(k,g) '그리드 점에서 EPS 제약 조건의 RHS'
maxg(k) '목표 그리드의 최대 지점'
posg(k) '목표의 그리드 위치'
firstOffMax '일부 카운터'
lastZero '일부 카운터'
* numk(k) '1로 시작하는 k의 순서 값'
numg(g) '0으로 시작하는 g의 서수 값'
step(k) '목적 함수의 그리드 점 단계'
jump(k) '이동하는 그리드 점으로 점프';
lastZero = 1;
루프(km1,
numk(km1) = lastZero;
lastZero = lastZero + 1;
);
numg(g) = ord(g) - 1;
그리드(km1,g) = 예; // 여기서는 다양한 목표에 대해 다양한 그리드 간격을 정의할 수 있습니다.
maxg(km1) = smax(그리드(km1,g), numg(g));
step(km1) = (maxobj(km1) - minobj(km1))/maxg(km1);
Gridrhs(grid(km1,g))$(dir(km1) = -1) = maxobj(km1) - numg(g)/maxg(km1)*(maxobj(km1) - minobj(km1));
Gridrhs(grid(km1,g))$(dir(km1) = 1) = minobj(km1) + numg(g)/maxg(km1)*(maxobj(km1) - minobj(km1));
넣다 / '그리드 포인트' /;
루프(g,
loop(km1, putgridrhs(km1,g):12:2;);
넣어 /;
);
put / '효율적인 솔루션' /;
* 그리드 점을 걷고 모델이 실행 불가능해지거나
* 계산된 여유 변수가 단계 크기보다 큰 경우
위치(km1) = 0;
반복 = 0;
인페아스 = 0;
시작 = jnow;
반복하다
rhs(km1) = sum(grid(km1,g)$(numg(g) = posg(km1)),gridrhs(km1,g));
mip를 사용하여 a_objval을 최대화하는 mod_eps 메서드를 해결합니다.
iter = 반복 + 1;
if(mod_epsmethod.modelStat<>%modelStat.optimal% 및
mod_epsmethod.modelStat<>%modelStat.integerSolution%,
인페아스 = 인페아스 + 1; // 슬롯 사이트 추천이 아닌 것은 이 경우 실행 불가능합니다.
iter:5:0, ' 실행 불가능' /;
lastZero = 0;
loop(km1$(posg(km1) > 0 및 lastZero = 0), lastZero = numk(km1));
posg(km1)$(numk(km1) <= lastZero) = maxg(km1); // 더 까다로운 rhs(km1) 값에 대해서는 모든 해석을 건너뜁니다.
그렇지 않으면
iter:5:0;을 입력하세요.
loop(k, z.l(k):12:2;);
점프(km1) = 1;
* 첫 번째 off max(최종 그리드 포인트에 도달하지 않은 obj 함수)를 찾습니다.
* 이 obj.fun이 k이면 1..k번째 목적 함수에 점프를 할당합니다.
* 점프는 가장 안쪽 목적 함수(km=1)에 대해 계산됩니다.
점프(km1)$(numk(km1) = 1) = 1 + Floor(round(sl.L(km1),6)/step(km1));
loop(km1$(jump(km1) > 1), '점프';);
넣어 /;
);
* 그리드에서 앞으로 진행
firstOffMax = 0;
loop(km1$(posg(km1) < maxg(km1) 및 firstOffMax = 0),
posg(km1) = min((posg(km1) + 점프(km1)),maxg(km1));
firstOffMax = numk(km1);
);
posg(km1)$(numk(km1) < firstOffMax) = 0;
abort$(iter > 1000) '1000회 이상 반복했는데 뭔가 잘못된 것 같습니다.';
sum(km1$(abs(posg(km1) - maxg(km1))<1e-6),1) = 카드(km1) 및 firstOffMax = 0이 될 때까지;
마무리 = jnow;
elapsed_time = (완료 - 시작)*60*60*24;
놓다 /;
put '실행 불가능성 = ', infeas:5:0 /;
put '경과 시간: ',elapsed_time:10:2, ' 초' /;