absmip.gms : MIP로서의 불연속 함수 abs() min() max() sign()

설명

이것은 몇 가지 어려운 기능의 MIP 공식을 보여줍니다.

소형 모델 유형 :MIP


카테고리 : 슬롯 커뮤니티 모델 라이브러리


메인 파일 : absmip.gms

$title 불연속 함수 abs, min, max 및 MIP로 서명(ABSMIP,SEQ=208)

$onText
이는 일부 어려운 기능의 MIP 공식을 보여줍니다.

슬롯 커뮤니티 Development Corporation, 공식화 및 언어 예제.

키워드: 혼합 정수 선형 계획법, 불연속 함수,
          슬롯 커뮤니티 언어 예제, 수학, 변환 기술
$offText

변수 x '다양한 기능에 대한 인수';

양수 변수
   xp 'x의 양수 부분'
   xn 'x의 음수 부분';

이진 변수 b 'x가 양수인지 음수인지 결정';

방정식
   e1 'x를 양수 부분과 음수 부분으로 분할'
   e2 'x의 양수 부분을 제한합니다'
   e3 'x의 음수 부분을 제한합니다';

e1.. x =e= xp - xn;

e2.. xp =l= abs(x.up)*b;

e3.. xn =l= abs(x.lo)*(1 - b);

변수 y '함수 평가 결과';

방정식
   defabs 'y = abs(x)의 정의'
   defzmax 'y = zmax(x) = max(x,0)의 정의'
   defzmin 'y = zmin(x) = min(x,0)의 정의';

defabs.. y =e= xp + xn;

defzmax..y =e= xp;

defzmin..y =e= - xn;

모델
   ABSM / e1, e2, e3, defabs /
   zmaxM / e1, e2, e3, defzmax /
   zminM / e1, e2, e3, defzmin /;

스칼라 tol '0에 대한 허용오차' / 1e-04 /;

바이너리 변수
   b1 'xp가 양수인지 결정합니다'
   b2 'xn이 양수인지 결정합니다';

방정식
   e2up 'XP에 대한 상한 제한'
   e2lo 'XP에 대한 낮은 제한'
   e3up 'xn에 대한 상한 제한'
   e3lo 'xn에 대한 낮은 제한'
   하나는 'b1 또는 b2'입니다.
   defsign 'y = 부호(x)의 정의';

e2up.. xp =l= abs(x.up)*b1;

e2lo.. xp =g= tol*b1;

e3up.. xn =l= abs(x.lo)*b2;

e3lo..xn =g= tol*b2;

하나.. b1 + b2 =l= 1;

설계.. y =e= b1 - b2;

모델 signM / e1, e2up, e2lo, e3up, e3lo, one, defsign /;

옵션 limCol = 0, limRow = 0, optCr = 1e-6;

세트
   실행 '테스트 실행 횟수' / 1*5 /
   nos / "v.lo", "v.up", "w.lo", "w.up" /
   mm '최소 및 최대' / 최대, 최소 /;

매개변수 bnds_unary(runs,*) / 1.lo -5, 1.up 5
                                2.lo -5, 2.up -2
                                3.로 2, 3.위 5
                                4.lo 0, 4.up 5
                                5.lo -5, 5.up 0 /;

매개변수 rep_unary;

루프(실행,
   x.lo = bnds_unary(runs,"lo"); rep_unary(mm,runs,"x.lo") = x.lo;
   x.up = bnds_unary(runs,"up"); rep_unary(mm,runs,"x.up") = x.up;

   mip를 사용하여 absM max y를 해결합니다.  rep_unary("max",runs,"abs" ) = y.l;
   mip를 사용하여 zmaxM max y를 해결합니다.  rep_unary("max",runs,"zmax") = y.l;
   mip를 사용하여 zminM max y를 해결합니다.  rep_unary("max",runs,"zmin") = y.l;
   mip를 사용하여 signM max y를 해결합니다.  rep_unary("max",runs,"sign") = y.l;
   mip를 사용하여 absM min y를 해결합니다.  rep_unary("min",runs,"abs" ) = y.l;
   mip를 사용하여 zmaxM min y를 해결합니다.  rep_unary("min",runs,"zmax") = y.l;
   mip를 사용하여 zminM min y를 해결합니다.  rep_unary("min",runs,"zmin") = y.l;
   mip를 사용하여 signM min y를 해결합니다.  rep_unary("min",runs,"sign") = y.l;
);

변수
   z '함수 평가 결과'
   v '최대/최소에 대한 인수'
   w '최대/최소 인수';

방정식
   defvwx '대체 x = v - w'
   defmXX 'z = max/min(v,w) = max/min(x,0) + w의 정의';

defvwx.. x =e= v - w;

defmXX.. z =e= y + w;

모델
   maxM / e1, e2, e3, defzmax, defvwx, defmXX /
   minM / e1, e2, e3, defzmin, defvwx, defmXX /;

매개변수 bnds_binary(runs,*) / 1.vlo -5, 1.vup 5, 1.wlo -2, 1.wup 2
                                2.vlo -2, 2.vup 2, 2.wlo -5, 2.wup 5
                                3.vlo -5, 3.vup -2, 3.wlo 2, 3.wup 5
                                4.vlo 2, 4.vup 5, 4.wlo -5, 4.wup -2
                                5.vlo -5, 5.vup 2, 5.wlo -2, 5.wup 5 /;

매개변수 rep_binary;

루프(실행,
   v.lo = bnds_binary(runs,"vlo"); rep_binary(mm,runs,"v.lo") = v.lo;
   v.up = bnds_binary(runs,"vup"); rep_binary(mm,runs,"v.up") = v.up;
   w.lo = bnds_binary(runs,"wlo"); rep_binary(mm,runs,"w.lo") = w.lo;
   w.up = bnds_binary(runs,"wup"); rep_binary(mm,runs,"w.up") = w.up;
   x.lo = -max(abs(w.up-v.lo), abs(v.up-w.lo));         x.up = -x.lo;

   mip를 사용하여 maxM max z를 해결합니다. rep_binary("max",runs,"max") = z.l;
   mip를 사용하여 minM max z를 해결합니다. rep_binary("max",runs,"min") = z.l;
   mip를 사용하여 maxM min z를 해결합니다. rep_binary("min",runs,"max") = z.l;
   mip를 사용하여 minM min z를 해결합니다. rep_binary("min",runs,"min") = z.l;
);

대표_유나리, 대표_이진 표시;