수학 프로그램의 특수 기능

소개

이 장에서는 특정 크레이지 슬롯 유형에 유용한 특별한 GAMS 기능을 소개합니다. 기능은 다음과 같습니다크레이지 슬롯 확장, 원뿔 프로그래밍및 이를 촉진하는 기능혼합 정수또한지시자 제약, 솔버 간에 변환되지 않는 기능입니다.

특수 혼합 정수 프로그래밍(MIP) 기능

크레이지 슬롯링을 단순화하는 데 도움이 되는 일부 특수 기능이 GAMS에 추가되었습니다.혼합 정수 프로그래밍(MIP)문제. GAMS에서 MIP는 혼합 정수의 크레이지 슬롯 유형입니다.선형프로그램, 이 섹션에서는 MIP를 보다 일반적으로 사용했습니다. 비선형 표현식과 순수 이산 문제를 포함한 이산 변수가 있는 크레이지 슬롯을 고려합니다. 먼저 GAMS의 이산 변수에 대한 세부 정보를 제시한 다음 분기 프로세스의 우선 순위를 사용자 정의하는 방법에 대해 논의합니다. 다음으로 MIP에 중요한 크레이지 슬롯 속성을 다루고 GAMS를 사용한 혼합 정수 프로그래밍을 더 쉽게 만드는 몇 가지 힌트로 결론을 내릴 것입니다.

이산형 변수의 유형

변수 및변수 유형장에 소개되어 있습니다.변수. GAMS는 6가지 이산형 변수 유형을 제공합니다.바이너리, 정수, sos1, sos2, 반도체그리고세미인트. 다음 하위 섹션에서는 이러한 개별 변수 유형 각각에 대한 세부 정보와 예를 제시합니다. 크레이지 슬롯에 이산형 변수가 있는 경우 혼합 정수 크레이지 슬롯이거나 관련 크레이지 슬롯 유형 중 하나여야 합니다.MINLP또는MIQCP. 섹션 참조크레이지 슬롯 분류모든 GAMS 크레이지 슬롯 유형의 전체 목록을 보려면.

바이너리 변수

바이너리 변수는 0(영)과 1(1)의 값만 가질 수 있습니다. 다음과 같이 선언됩니다.

바이너리 변수 var_name [(index_list)] [text];

키워드바이너리이것은 이진 변수이며 일반적인 규칙을 나타냅니다.변수 선언팔로우됩니다. 또는 변수를 먼저 선언하고 다음과 같이 지정할 수 있습니다.바이너리나중에. 직교 라틴 정사각형 크레이지 슬롯의 다음 코드 조각을 고려하세요.[라틴어]:

k "행" / row1*row4 / 설정
     l "열" / col1*col4 /
     v "값" / val1*val4 /;
별칭(i,j,v);

변수 x(i,j,k,l) "셀(k,l)에 할당된 쌍 (i,j)"
          z "어떤 목적";
이진변수 x;

방정식 c1(i,j) "각 셀에 대해 하나의 항목 쌍만 선택";
c1(i,j).. sum((k,l), x(i,j,k,l)) =e= 1;

바이너리 변수에 유의하세요.x수식에 사용됨c1각 셀에는 하나의 항목 쌍만 허용된다는 제한을 크레이지 슬롯링합니다. 이진 변수는 종종 상호 배타성 또는 상보성을 부과하는 등의 논리적 조건을 크레이지 슬롯링하는 데 사용됩니다.

기본 하한은 0이고 기본 상한은 1입니다. 이산 크레이지 슬롯의 완화된 버전이 해결되면 이진 변수는 상한이 1인 양수 변수처럼 처리됩니다. 또한 이진 사양을 재정의하기 위해 무한 우선순위를 사용할 수 있습니다. 섹션을 참조하세요.분기 우선순위 설정자세한 내용은 아래를 참조하세요.

유일한 값은 0과 1이지만 솔버는 다음과 같은 이진 변수에 대한 값을 반환할 수 있습니다.닫기0 또는 1로. 모든 솔버는 허용 오차를 사용하며 값이 다음과 같은지 확인하기 위해 허용 오차를 사용합니다.충분히 가깝습니다정수 값으로. 따라서 코드를 다음과 같이 사용하는 것은 현명하지 않습니다.a(i)$(b.l(i)=1) = 예;왜냐하면 일부 요소를 놓칠 가능성이 있기 때문입니다. 이러한 코드를 작성하는 안전한 방법은 다음과 같습니다.a(i)$(b.l(i)>0.5) = 예;. 풀이 후에 이진 변수의 수준을 반올림하는 것도 가능하지만 작은 반올림이라도 실행 불가능할 수 있으므로 솔버나 솔버 링크에서는 수행되지 않습니다.

크레이지 슬롯 상태가 실행 가능한 정수 솔루션을 나타내지 않는 경우(크레이지 슬롯 상태 1 또는 8) 이진 변수는 솔버 이후에 진정한 분수 값을 가질 수도 있습니다.

정수 변수

정수 변수는 경계 사이의 값만 취할 수 있는 이산 변수입니다. 사용자는 기본값에서 두 경계를 모두 변경할 수 있습니다. 기본 하한은 0(영)이고 GAMS 내부의 기본 상한은 다음과 같습니다.+inf, 동일한 상한이 솔버에 전달됩니다.

완화된 크레이지 슬롯 유형에서는 무결성 요구사항이 완화되었습니다. 또한 무한 우선순위를 사용하여 정수 사양을 재정의할 수 있습니다. 섹션을 참조하세요.분기 우선순위 설정31731_31804

정수 변수 var_name [(index_list)] [text];

키워드정수이것은 정수 변수이고 일반적인 규칙은 다음과 같습니다.변수 선언팔로우됩니다. 또는 변수를 먼저 선언하고 다음과 같이 지정할 수 있습니다.정수나중에. 전력 스케줄링 크레이지 슬롯의 다음 코드 조각을 고려하세요.[매직]:

t "수요 차단" 설정 / 오후 12시~6시, 오전 6시~9시, 오전 9시~오후 3시, 오후 3시~6시, 오후 6시~12시 /
     g "발전기" / 유형-1, 유형-2, 유형-3 /;

변수 x(g,t) "발전기 출력(1000mw)"
           n(g,t) "사용 중인 발전기 수"
           비용 "총 운영 비용(l)";
정수 변수 n;

정수 변수n모든 시간 블록에서 사용 중인 다양한 유형의 생성기 수를 크레이지 슬롯링합니다.

유형 1의 특별 주문 세트(SOS1)

sos1변수는 변수 집합이므로 그룹 내 최대 하나의 변수가 0이 아닌 값을 가질 수 있습니다. 이 변수는 양수 값을 가질 수 있습니다. 유형 1의 특별 주문 세트는 다음과 같이 정의됩니다.

SOS1 변수 var_name (index_list) [텍스트];

키워드sos1이것은 다음을 나타냅니다.sos1변수 및 일반적인 규칙변수 선언팔로우됩니다. 또는 변수를 먼저 선언하고 다음과 같이 지정할 수 있습니다.sos1나중에. 다음 예를 고려해보세요.

SOS1 변수 s1(i), t1(k,j), w1(i,j,k) ;

가장 안쪽(가장 오른쪽) 인덱스의 구성원은 동일한 SOS 세트에 속합니다. 예를 들어 위에 정의된 집합에서s1다음을 포함하는 유형 1의 특별 주문 세트 하나를 나타냅니다.i요소,t1정의k다음으로 설정j각 요소 및w1정의(i,j)다음으로 설정k각 요소.

기본 경계는sos1변수는 0이고+inf. 다른 변수와 마찬가지로 사용자는 이러한 경계를 변경할 수 있습니다. 또한 사용자는 다음의 멤버를 요구하는 방정식을 통해 문제에 필요할 수 있는 볼록성 행을 명시적으로 제공할 수 있습니다.sos1특정 값보다 작게 설정됩니다. 이러한 볼록성 행은 각 변수에 대한 경계를 암시적으로 정의합니다.

다음 예를 고려해보세요:

SOS1 변수 s1(i); 방정식 defsoss1; 
defsoss1.. sum(i,s1(i)) =l= 3.5 ;

방정식defsoss1은(는) 요소 중 하나가 0이 아닌 값을 암시적으로 정의합니다.sos1변수s13.5보다 작거나 같을 수 있습니다. 모든 변수가s10과 같습니다.

집합의 요소 중 하나가 0이 아니고 숫자, 즉 3.5와 같아야 하는 경우 특별한 경우가 발생합니다. 이 경우 방정식defsoss1다음과 같습니다:

defsoss1..sum(i,s1(i)) =e= 3.5 ;

흔히 0이 아닌 값은 1과 같습니다. 결과적으로,sos1변수는 사실상 이진 변수입니다. 이는 분기 및 경계 알고리즘 수준의 솔버에 의해서만 다르게 처리됩니다. 예를 들어, 다음 중 하나를 크레이지 슬롯링하려는 다음 예를 고려하십시오.n옵션을 선택해야 합니다. 이는 다음과 같이 표현됩니다.

SOS1 변수 x(i); 방정식 defx;
defx..sum(i, x(i)) =e= 1 ;

변수x의미의 변화 없이 이진수로 만들 수 있으며 솔버가 제공하는 솔루션은 다음과 구분할 수 없습니다.sos1케이스.

특별한 순서 집합을 사용하면 분기 및 경계 알고리즘의 성능이 항상 향상되는 것은 아닙니다. 자연스럽지 않은 경우주문바이너리 변수를 사용하는 것이 더 나은 선택일 수 있습니다. 이에 대한 좋은 예는 고전적 할당 문제입니다([H.P. Williams(2013) 참조).수학적 계획법의 크레이지 슬롯 구축], Wiley, 섹션 9.3.

다음이 포함된 모든 크레이지 슬롯은sos1변수에는 MIP 솔버가 필요합니다. 왜냐하면 솔루션 프로세스에서는 최대 1개의 0이 아닌 수준 값이 존재할 수 있다는 제한을 적용해야 하기 때문입니다.

예를 들어,sos1변수가 사용됩니다. 생산 일정 크레이지 슬롯을 참조하세요.[PRODSCHX].

유형 2의 특별 주문 세트(SOS2)

sos2변수는 변수 세트입니다. 따라서 세트 내 최대 2개의 변수는 0이 아닌 값을 가질 수 있으며 이러한 변수는 인접해야 합니다. 이 요구사항은 세트가 다음과 같다는 것을 의미합니다.명령됨, 장 참조순서로 집합: 순서가 지정된 집합38069_38224

SOS2 변수 var_name [(index_list)] [text];

키워드sos2이것은 다음을 나타냅니다.sos2변수와 일반적인 규칙변수 선언팔로우됩니다. 또는 변수를 먼저 선언하고 다음과 같이 지정할 수 있습니다.sos2나중에. 다음 예를 고려해보세요.

i / i1*i5 / 설정;
SOS2 변수 s2(i), t2(k,j), w2(i,j,k);

가장 안쪽(가장 오른쪽) 색인의 구성원은 동일한 세트에 속합니다. 예를 들어 위에 정의된 집합에서s2집합의 각 구성원에 대한 요소를 포함하는 유형 2의 특수 순서 집합 하나를 나타냅니다.i. 변수는 최대 2개입니다.s20이 아닐 수 있으며 집합의 인접한 요소를 참조해야 합니다.i. 변수에 유의하세요.s2('i1')그리고s2('i2')인접하지만 변수s2('i1')그리고s2('i3')그렇지 않습니다. 더 나아가,t2정의k세트sos2변수j각 요소와 인접 요구사항은 세트를 참조함j주문해야 합니다. 마찬가지로,w2정의(i,j)다음으로 설정k각 요소와 인접 요구사항은 세트를 참조함k주문해야 합니다.

기본 경계는sos2변수는 0이고+inf. 다른 변수와 마찬가지로 사용자는 이러한 경계를 변경할 수 있습니다.sos2변수는 비선형 함수에 대한 부분별 선형 근사를 크레이지 슬롯링하는 데 가장 자주 사용됩니다. 생산 일정 크레이지 슬롯[PRODSCHX]표시SOS바이너리 형식 형식,sos1그리고sos2세트.

다음이 포함된 모든 크레이지 슬롯은sos2변수에는 MIP 솔버가 필요합니다. 솔루션 프로세스에서 인접성에 대한 제한을 적용해야 하고 0이 아닌 수준 값이 2개 이상 존재할 수 없기 때문입니다.

반연속 변수

반연속 변수는 0이거나 주어진 최소 수준 이상입니다. 이는 대수적으로 \(x=0\) 또는 \(L\leq x\leq U\)로 표현될 수 있습니다. 기본적으로 하한 \(L\)은 1이고 상한 \(U\)은 입니다.+inf. 평소와 같이 이러한 경계는 다음을 사용하여 변경될 수 있습니다.변수 속성 .lo그리고.up. 반연속 변수는 다음과 같이 정의됩니다.

SemiCont 변수 var_name [(index_list)] [text];

키워드반도체이것은 반연속 변수이며 일반적인 규칙을 나타냅니다.변수 선언팔로우됩니다. 또는 변수를 먼저 선언하고 다음과 같이 지정할 수 있습니다.반도체나중에. 다음 예를 고려해보세요.

세미콘트 변수 x;
x.lo = 1.5;  x.up = 23.1;

위의 코드 조각은 변수를 선언합니다.x0이거나 1.5와 23.1 사이의 연속 변수로 동작할 수 있는 반연속 변수입니다.

반연속 변수가 있는 모든 크레이지 슬롯에는 MIP 솔버가 필요합니다. 솔루션 프로세스는 0과 임계값 사이에 불연속 점프를 적용해야 하기 때문입니다.

참고
  • 모든 MIP 솔버가 반연속 변수를 허용하는 것은 아닙니다. 각 솔버 매뉴얼의 관련 섹션을 확인하여 관심 있는 솔버가 반연속 변수를 처리하는 방법을 확인하는 것이 좋습니다.
  • 하한은 상한보다 작아야 하며 두 경계는 모두 0보다 커야 합니다. 그렇지 않으면 GAMS가 오류를 보고합니다.
  • 변수 솔루션 목록은 다른 변수에 대해 실행 불가능한 변수를 나타내는 하한 및 상한 외부 수준을 표시할 수 있지만 반연속 변수의 경우에는 그렇지 않습니다.
  • 반연속 변수는 상한이 다음과 같은 경우 특히 유용합니다.+inf암시적 경계는 쉽게 파생될 수 없습니다. 유한한 상한을 사용할 수 있는 경우 반연속 변수를 대체하는 것이 계산상 더 효율적일 수 있습니다.sc하한 포함sc낮음연속변수에 의한x및 이진 변수 b 및 다음 방정식:
    방정식 xForceLowerBnd "b가 1인 경우 x가 scLow보다 커지도록 강제"
             xForceZero "b가 0이면 x를 0으로 강제합니다";
    xForceLowerBnd.. x =g= scLow*b;
    xForceZero.. x =l= x.up*b;

반정수 변수

반정수 변수는 0 또는 정수이며 주어진 최소값 이상입니다. 이는 대수적으로 \(x = 0\) 또는 \(x \in)으로 표현될 수 있습니다. \L,\ldots,U\\). 기본적으로 하한값 \(L\)은 1이고 GAMS 내부의 상한값 \(U\)은+inf동일한 값이 솔버에 전달됩니다. 평소와 같이 이러한 기본 경계는 다음을 사용하여 변경될 수 있습니다.변수 속성 .lo그리고.up. 완화된 크레이지 슬롯 유형에서는 무결성 요구 사항이 완화됩니다. 또한 무한 우선순위를 사용하여 정수 사양을 재정의할 수 있습니다. 섹션을 참조하세요.분기 우선순위 설정자세한 내용은 아래를 참조하세요.

반정수 변수는 다음과 같이 정의됩니다:

SemiInt 변수 var_name [(index_list)] [text];

키워드세미인트이것은 반정수 변수이고 다음의 일반적인 규칙을 나타냅니다.변수 선언팔로우됩니다. 또는 변수를 먼저 선언하고 다음과 같이 지정할 수 있습니다.세미인트나중에. 다음 예를 고려해보세요.

SemiInt 변수 x;
x.lo = 2; x.up = 25;

위의 코드 조각은 변수를 선언합니다.x0이거나 2에서 25 사이의 정수 값을 취할 수 있는 반정수 변수입니다.세미인트변수는 정수 값을 가져야 합니다. 그렇지 않으면 GAMS는 크레이지 슬롯 생성 중에 오류를 표시합니다. 또한 반정수 변수가 있는 모든 크레이지 슬롯에는 MIP 솔버가 필요합니다.

참고
  • 모든 MIP 솔버가 반정수 변수를 허용하는 것은 아닙니다. 각 솔버 매뉴얼의 관련 섹션을 확인하여 관심 있는 솔버가 반정수 변수를 처리하는 방법을 확인하는 것이 좋습니다.
  • 하한은 상한보다 작아야 하며 두 경계는 모두 0보다 커야 합니다. 그렇지 않으면 GAMS가 오류를 보고합니다.
  • 변수 솔루션 목록은 다른 변수에 대해 실행 불가능한 변수를 나타내는 하한 및 상한 외부 수준을 표시할 수 있지만 반정수 변수의 경우에는 그렇지 않습니다.
  • 반정수 변수는 상한이 다음과 같은 경우 특히 유용합니다.+inf암묵적인 경계는 쉽게 파생될 수 없습니다(적절한 것과 함께IntVarUp설정). 유한한 상한을 사용할 수 있는 경우 반정수 변수를 대체하는 것이 계산상 더 효율적일 수 있습니다.si, 하한 포함si낮음, 정수 변수로i및 이진 변수 b 및 다음 방정식:
    등식 iForceLowerBnd "b가 1이면 i가 siLow보다 커지도록 강제합니다."
             iForceZero "b가 0이면 i를 0으로 강제합니다.";
    iForceLowerBnd.. i =g= siLow*b;
    iForceZero.. i =l= i.up*b;

분기 우선순위 설정

우선순위를 설정함으로써 사용자는 MIP 크레이지 슬롯에 대한 분기 및 경계 검색 중에 분기할 변수를 선택하기 위한 순서를 지정할 수 있습니다. 우선순위가 없으면 MIP 알고리즘은 어떤 변수가 분기하기에 가장 적합한지 내부적으로 결정합니다. 개별 변수의 우선순위는 다음과 같은 경우에만 사용할 수 있습니다.크레이지 슬롯 속성 .prioropt1로 설정됩니다. 해당 GAMS 문은 다음과 같습니다.

mymodel.prioropt = 1;

여기내크레이지 슬롯은 크레이지 슬롯 문에 지정된 크레이지 슬롯의 이름입니다. 기본값은 NA입니다.

크레이지 슬롯 속성인 경우.prioropt1로 설정되어 있으며,변수 속성 .이전개별 이산 변수의 우선순위를 설정하는 데 사용될 수 있습니다. 하나 있다는 점에 유의하세요..이전다차원 변수의 각 개별 구성요소에 대한 값입니다. 우선순위는 실제 값으로 설정될 수 있습니다. 기본값은 1입니다. 일반적으로 가장 중요한 변수에 가장 높은 우선순위가 부여되어야 합니다. 가장 높은 우선순위는 에서 0이 아닌 가장 낮은 값으로 표시됩니다..이전속성. 기능적으로 속성은.이전해를 검색하는 동안 분기 및 바인딩 알고리즘에서 변수가 분기되는 순서를 설정합니다. 특정를 갖는 변수.이전값은 모든 분수 변수가 더 높을 때까지 더 일찍 분기됩니다..이전값이 분기되었습니다.

참고
변수 속성.이전이산적변수는 해당 변수에 대한 개별 제한을 완화하는 데 사용될 수 있습니다..이전값을+inf변수를 영구적으로 완화합니다(또는 그 때까지.이전유한한 값이 할당됩니다). 이 완화는 크레이지 슬롯 속성과 독립적으로 수행됩니다..prioropt.

다음 예를 고려해보세요:

z.prior(i,'small') = 3;
z.prior(i,'medium') = 2;
z.prior(i,'large') = 1;

이 예에서는 변수z(i,'대형')변수 앞에서 분기됩니다.z(i,'중간'), 이는 차례로 변수 앞에서 분기됩니다.z(i,'작은').

문제에 대한 지식은 어떤 변수를 먼저 고려해야 하는지 결정하는 데 도움이 될 수 있습니다. 예를 들어 이진 변수 문제를 생각해 보세요.u공장을 건설할지 여부에 대한 예/아니오 결정을 나타내며 해당 공장 내 장비 선택을 나타내는 기타 이진 변수를 나타냅니다. 우리는 공장 내에서 어떤 특정 장비를 구입할지 고려하기 전에 공장을 지어야 하는지 여부를 자연스럽게 탐색하고 싶을 것입니다. 따라서 우리는 우선순위 값을 더 낮게 설정합니다.u. 더 높은 우선순위를 할당하여 - 속성의 더 낮은 값.이전- 빌드/비빌드 결정 변수에u, 이 논리를 트리 검색에 강제 적용하여 트리의 흥미롭지 않은 부분을 탐색하지 않은 상태로 남겨두므로 계산 시간을 단축할 수 있습니다.

참고
  • 에 주어진 값이 낮을수록.이전접미사, 분기 우선순위가 높아집니다.
  • 모든 구성원sos1또는sos2세트는 세트의 개별 구성원이 아니라 분기되는 세트 자체이므로 동일한 우선순위 값을 부여해야 합니다.
  • 모든 값이 허용되는 동안.이전많은 솔버는 모든 주어진 우선순위를 \(0,...,1000\)의 정수 범위로 확장합니다.
  • 분기 우선순위는 혼합 정수 프로그래밍 초기에 매우 중요한 기능이었습니다. 요즘에는 솔버 기본 선택을 개선하는 분기 우선순위를 찾는 것이 쉽지 않습니다.
  • 전역 비선형 최적화 솔버는 연속 변수에서도 분기됩니다(예를 참조하세요.바론). GAMS에서는 연속변수의 분기 우선순위를 설정할 수 없습니다. 이러한 분기 우선순위는 솔버 옵션 파일을 통해 전달되어야 합니다.

기타 힌트

우리는 혼합 정수 프로그래밍 솔버의 특수 기능에 더 쉽게 접근할 수 있도록 다양한 힌트를 제공하는 이 섹션으로 GAMS의 혼합 정수 크레이지 슬롯에 대한 논의를 마무리할 것입니다.

GAMS의 혼합 정수 프로그래밍을 위한 크레이지 슬롯 속성

GAMS는 여러 가지를 제공합니다.크레이지 슬롯 속성MIP 솔버 성능에 영향을 주거나 MIP 결과를 보고하는 데 사용될 수 있습니다. 이러한 크레이지 슬롯 속성은 다음과 같습니다.치트, 컷오프, 노드림, 객체, OptCA, OptCR, 사전 선택그리고TryInt.

브랜치 앤 컷 및 휴리스틱 기능

하드 MIP 문제는 절단 평면과 우수한 정수 실행 가능 솔루션을 생성하는 사용자 제공 루틴의 도움으로 더 빠르게 해결될 수 있습니다. GAMS BCH(Branch-and-Cut-and-Heuristic)는 범용 분기 및 절단 코드 프레임워크 내에서 사용자 정의 루틴의 사용을 정의, 실행 및 제어하는 ​​데 필요한 모든 주요 단계를 자동화합니다. 에 문서화되어 있습니다.분기 및 절단 및 휴리스틱 기능(BCH).

분기 및 바운드 출력

각 솔버에 대한 로그 출력은 다르지만 일부 주요 수치는 일반적으로 분기 및 경계 기반 솔버에 대해 표시됩니다. 예를 들어 CPLEX를 사용하여 선형 혼합 정수 크레이지 슬롯을 해결하면 다음과 같은 출력이 생성됩니다.

노드 절단/
   노드 왼쪽 목표 IInf 최고 정수 최고 경계 ItCnt 간격

* 0+ 0 0.0000 5.05646e+08 --- 
0.01초 후에 값이 0.000000인 것으로 확인되었습니다. (0.73틱)
      0 0 2.23031e+07 12 0.0000 2.23031e+07 17 --- 
      0 0 2.23031e+07 7 0.0000 컷: 8 23 --- 
* 0+ 0 2.23031e+07 2.23031e+07 0.00%
0.02초 후에 값이 2.2303094e+07인 것으로 확인되었습니다. (1.08틱)
 ...

정수 변수 수정 및 최종 LP 해결...
...

솔루션은 공차를 충족합니다.

MIP 솔루션: 22303093.628684(23개 반복, 0노드)
최종 해결: 22303093.628684(0 반복)

가능한 최고: 22303113.950091
절대 간격: 20.321407
상대적 격차: 0.000001

열에 대한 간략한 설명은 다음과 같습니다:

  • 노드지금까지의 분기 및 바인딩 노드 수입니다.
  • 노드 왼쪽아직 조사되지 않은 분기 프로세스 중에 생성된 문제의 수입니다.
  • 목표완화 노드 문제의 현재 목적 함수 값을 제공합니다.
  • IInf분수 해법 수준을 갖는 이산 변수의 수를 제공합니다.
  • 최고 정수기존 솔루션을 제공합니다. 해당 열의 마지막 솔루션이 반드시 글로벌 최고 솔루션은 아닙니다.
  • 절단/최고 경계해의 현재 하한을 제공합니다.
  • ItCnt누적된 LP 반복 횟수 제공
  • 이론적 최적값과의 최대 백분율 차이를 제공합니다.

혼합 정수 크레이지 슬롯의 해결은 발견된 솔루션과 가능한 최상의 솔루션 사이의 간격으로 끝나는 것이 일반적입니다. 이는 제한(예: 시간), 솔버 옵션 및 다음과 같은 크레이지 슬롯 속성에 의해 제어될 수 있습니다..OptCR그리고.OptCA.

비선형 MIP

크레이지 슬롯러는 MIP와 NLP라는 두 가지 하드 크레이지 슬롯 유형을 결합하는 비선형 공식에 정수 제한을 적용할 수 있습니다. 이러한 MINLP 크레이지 슬롯은 솔버를 선택하여 해결할 수 있습니다. 많은 솔버. DICOPT 및 SBB는 다른 곳에서 로컬 최적을 제공합니다. ANTIGONE과 BARON은 글로벌 최적을 제공합니다. 대부분의 경우 두 가지 유형의 MINLP 솔버 모두 MIP 및 NLP 솔버를 사용하여 솔루션을 계산합니다. 그런하위 해결사솔버가 성공하려면 라이선스가 필요합니다.

크레이지 슬롯 종료 조건 및 권장 조치

풀이 과정이 완료된 후 크레이지 슬롯의 종료 조건이 크레이지 슬롯 속성에 저장된다는 점을 상기하세요.modelStat. 가능한 모든 크레이지 슬롯 상태 목록은 섹션에 나와 있습니다.크레이지 슬롯 상태. 실현 가능한 솔루션(상태 1 및 8)이 있는지 쉽게 확인할 수 있습니다. 전역 솔버로 해결된 선형 크레이지 슬롯 및 MINLP 문제는 충분한 리소스(시간)와 다음 설정이 주어지면 "최적" 상태를 달성할 수 있습니다.OptCR그리고OptCAto 0. 다른 모든 경우에서는 실행 가능한 정수 솔루션이 생성되지 않습니다. 문제가 실행 가능하지 않은 것으로 보고된 경우(상태 4,5,10 및 19), 완화된 크레이지 슬롯 버전이 이미 실행 가능하지 않은지 확인하는 것이 좋습니다. 완화된 실행 가능하지만 정수 실행 불가능한 크레이지 슬롯을 디버깅하는 것은 매우 어렵습니다.

자주 발생하는 문제

GAMS 설정 또는 문제 특성으로 인해 사용자가 자주 직면하는 몇 가지 문제가 있습니다.

기본 경계

정수 및 반정수 변수에 대한 GAMS 상한은 +inf이지만 솔버에 전달되는 경계는 100으로 다를 수 있다는 점을 알아야 합니다(토론 참조)정수 변수). 이로 인해 예상치 못한 결과가 발생할 수 있습니다(예: 실행 불가능 또는 최적으로 선언된 최적이 아닌 솔루션).

끝이 없는 퀘스트

정수 프로그래밍은 매우 바람직한 공식화 기술입니다. 그러나 정수 문제는 이론적으로 어렵고 해결 과정(최악의 경우)은 지수적으로 복잡합니다. 솔버의 솔루션 시간을 향상시키는 데 중점을 두는 방법은 여러 가지가 있습니다. 모든 크레이지 슬롯과 마찬가지로 스케일링이 중요합니다(특히 bigM 공식을 사용할 때). 특정 문제에 대해서는 다양한 공식이 존재하며, 특정 문제에 대한 문헌은 GAMS의 신속한 프로토타입 및 실험 능력과 함께 당면한 문제에 대한 최상의 결과를 얻을 수 있는 최고의 별자리입니다. 미세 조정을 위해 일부 MIP 솔버는 자동화된 조정 도구를 제공합니다(예를 들어 참조).복합 튜닝59610_59672

크레이지 슬롯 스케일링 - 스케일 옵션

좋은 확장을 위한 규칙은 전적으로 알고리즘 요구 사항을 기반으로 합니다. GAMS는 크레이지 슬롯러의 효율성을 높이기 위해 개발되었으며 가장 좋은 방법 중 하나는 크레이지 슬롯러가 다음과 같은 표기법을 사용하여 크레이지 슬롯을 작성하도록 권장하는 것 같습니다.자연스러운가능한 한. 측정 단위는 이러한 자연 표기법의 일부입니다. 그러나 크레이지 슬롯 작성자가 좋은 단위라고 생각하는 것과 잘 확장된 크레이지 슬롯을 구성하는 것 사이에는 잠재적인 충돌이 있습니다.

확장 옵션

자연 크레이지 슬롯과 잘 확장된 크레이지 슬롯 간의 변환을 용이하게 하기 위해 GAMS는 a의 개념을 도입했습니다.규모 인자, 변수 및 방정식 모두에 사용됩니다. 표기법과 정의는 매우 간단합니다. 크기 조정은 기본적으로 꺼져 있습니다. 설정크레이지 슬롯 속성 .scaleoptto 1은 스케일링 기능을 켭니다. 예를 들어,

크레이지 슬롯 mymodel /all/ ;
mymodel.scaleopt = 1;
달러를 최대화하는 nlp를 사용하여 mymodel을 해결합니다.

문은 다음 어딘가에 삽입되어야 합니다.크레이지 슬롯문장 및 이전해결문장. 다시 크기 조정을 끄려면,mymodel.scaleopt다음 해결 전에 0으로 설정되어야 합니다.

많은 측면에서 GAMS 동작은 크기 조정과 무관합니다. 예를 들어, 해결 후 GAMS에서 사용할 수 있는 솔루션 값은 원래(규모가 조정되지 않은) 크레이지 슬롯의 솔루션 값입니다. 대조적으로, 목록 파일에 있는 방정식 및 열 목록은 축소된 크레이지 슬롯, 즉 솔버에서 볼 수 있는 크레이지 슬롯에 대한 정보를 보여줍니다. 실행 불가능성, 감소된 기울기, 목적 값, 야코비안 요소 등에 대한 솔버의 모든 로그 또는 디버깅 출력에도 스케일링된 크레이지 슬롯에 대한 정보가 표시됩니다. 목표 변수 또는 기타 변수의 크기를 조정한 경우 솔버의 반복 보고서에 있는 이러한 값은 최종 GAMS 솔루션 출력에 표시되는 크기 조정되지 않은 버전과 다르게 보일 수 있습니다.

변수 확장

변수의 배율 인수는 다음을 사용하여 정의됩니다.변수 속성 .scale다음과 같은 방법으로:

myvar.scale(i,j) = c;

축척 계수c은 숫자 또는 숫자로 평가되는 숫자 표현식입니다. 기본 배율은 1입니다.

참고
GAMS에서는 모든 배율 인수가 엄격하게 양수이고 다음보다 커야 합니다.1.e-20. 아래의 배율 인수를 설정하려는 시도1.e-20크레이지 슬롯 생성 중에 오류가 발생합니다.

다차원 변수의 각 개별 구성요소에 대해 하나의 척도 값이 있다는 점에 유의하십시오.

\(c\)가 변수 \(V_u\)의 배율 인수라고 가정합니다. 또한 알고리즘에 의해 확인된 변수는 \(V_a\)라고 가정합니다. 그러면 다음과 같습니다. \( \mathbfV_a =V_u/c\). 이는 사용자가 보는 각 변수가 다음과 같다는 것을 의미합니다.나누어짐 by축척 계수.

예를 들어, 다음 코드 조각을 고려해보세요:

양수 변수 x1, x2;
방정식 eq;
방정식.. 200*x1 + 0.5*x2 =l= 5;
x1.up = 0.01;
x2.up = 10;
x1.scale = 0.01;
x2.scale = 10;

설정으로x1.scale0.01로 그리고x2.scaleto 10, 솔버가 보는 크레이지 슬롯은 다음과 같습니다.

양수 변수 xPrime1, xPrime2;
방정식 eq;
방정식.. 2*xPrime1 + 5*xPrime2 =l= 5;
xPrime1.up = 1;
xPrime2.up = 1;

솔버는 변수를 볼 수 없다는 점에 유의하십시오.x1또는x2, 오히려 확장된(그리고 더 잘 동작하는) 변수xPrime1그리고xPrime2. 또한 변수의 상한과 하한은 변수 자체와 동일한 방식으로 자동으로 조정됩니다.

주의
  • 이산변수크기를 조정할 수 없습니다.
  • 전문가 참고. 내부적으로 GAMS는 각 변수 및 방정식과 함께 하나의 추가 속성 또는 필드(수준, 한계, 하한 및 상한 필드 제외)를 저장합니다. 변수 유형, 때로는 크레이지 슬롯 유형이나 솔버에 따라 이 필드는 GAMS 언어에서 다른 이름을 갖습니다. 연속형 변수의 경우 필드가 호출됩니다.규모, 이산 변수의 경우에는이전. DECIS로 해결된 확률론적 2단계 선형 프로그램 크레이지 슬롯의 경우 이 필드는 다음과 같습니다.단계. 필드.stage혼란스러운 결과를 초래할 수 있습니다. 다음 예를 고려해보세요.
    변수 x;
    x.스케일 = 0.1;
    x.stage 표시;
    출력은 다음과 같습니다:
    -- 3 변수 x.scale = 0.100
    필드.scale은 특정 범위(>1e-20 및 특별한 값 없음)에 있어야 하지만 이는 크레이지 슬롯 생성 시에만 확인됩니다. 필드.이전모든 숫자 및 짝수일 수 있음+inf(그러나 다른 특별한 값은 없음). 자세한 내용은.이전, 섹션 참조분기 우선순위 설정. 변수 및 방정식 필드에 대한 소개는 섹션을 참조하세요.변수 속성그리고수식 속성각각.

확장 방정식

방정식의 배율 인수는 다음을 사용하여 정의됩니다.방정식 속성 .scale다음과 같은 방법으로:

mzeqn.scale(i,j) = d;

축척 계수d은 숫자 또는 숫자로 평가되는 숫자 표현식입니다. 기본 배율은 1입니다.

\(d\)가 방정식 \(G_u\)의 배율 인자라고 가정합니다. 또한 알고리즘에 의해 보이는 방정식은 \(G_a\)라고 가정합니다. 그러면 \( \mathbfG_a =G_u/d\)가 됩니다. 이는 사용자가 보는 각 방정식이 다음과 같다는 것을 의미합니다.나누어짐 작성자축척 계수.

예를 들어, 다음 방정식을 고려해보세요:

양수 변수 y1, y2;
방정식 eq1, eq2;
eq1.. 200*y1 + 100*y2 =l= 500;
eq2.. 3*y1 - 4*y2 =g= 6;

설정으로eq1.scaleto 100, 솔버가 보는 크레이지 슬롯은 다음과 같습니다.

양수 변수 y1, y2;
방정식 eqPrime1, eq2;
eqprime1.. 2*y1 + 1*y2 =l= 5;
eq2.. 3*y1 - 4*y2 =g= 6;
참고
사용자는 잘 확장된 크레이지 슬롯을 얻기 위해 방정식과 변수 스케일링의 조합을 수행해야 할 수도 있습니다.

다음 예를 고려해보세요:

양수 변수 x1, x2;
방정식 eq1, eq2;
eq1.. 100*x1 + 5*x2 =g= 20;
eq2.. 50*x1 - 10*x2 =l= 5;
x1.up = 0.2;
x2.up = 1.5;

다음 척도 값 설정:

x1.scale = 0.1;
eq1.scale = 5;
eq2.scale = 5;

솔버는 다음과 같이 잘 조정된 크레이지 슬롯을 보게 됩니다.

양수 변수 xPrime1, x2;
방정식 eqPrime1, eqPrime2;
eqPrime1.. 2*xPrime1 + x2 =g= 4;
eqPrime2.. xPrime1 - 2*x2 =l= 1;
xPrime1.up = 2;
x2.up = 1.5;

스케일링 파생상품

비선형 크레이지 슬롯에서는 파생 상품도 잘 확장되어야 합니다. 사용자 크레이지 슬롯의 파생 상품이 \(d(G_u)/d(V_u)\)로 표시된다고 가정합니다. 또한 알고리즘에 의해 표시되는 축소 크레이지 슬롯의 도함수는 \(d(G_a)/d(V_a)\)로 표시된다고 가정합니다. 그러면 다음과 같습니다: \(\mathbfd(G_a)/d(V_a) = d(G_u)/d(V_u) \cdot c/d\), 여기서 \(c\)는 변수의 배율 인수이고 \(d\)는 방정식의 배율 인수입니다.

사용자는 관련된 방정식과 변수를 모두 스케일링하여 파생 상품의 스케일링에 영향을 미칠 수 있습니다.

중간 표현식이나 다항식 관계가 있는 경우 "일반" 또는 "참조" 값을 기준으로 배율 인수를 자동으로 계산할 수 있습니다. 예를 들면:

스칼라 xRef;
외부 참조 = 6;
y.Scale = sum(p, a(p)*power(xRef, ord(p)-1));
yDef.Scale = y.Scale;

0 또는 작은 값으로부터 보호하려면 다음과 같이 선택할 수 있습니다:

y.Scale = 최대(
  abs(sum(p, a(p)*power(x.lo, ord(p)-1))),
  abs(sum(p, a(p)*power(x.up, ord(p)-1))),
  0.01
);

이렇게 하면 축척 계수가 일반적인 경우나 경계 경우에서 변수의 크기 순서를 자동으로 반영하게 됩니다.

데이터 확장

입력 데이터 확장은 크레이지 슬롯 속성과 무관합니다..scaleopt그리고 잘 확장된 크레이지 슬롯을 달성하는 데 상당히 기여할 수 있습니다. 가능하다면 의사결정 변수와 그 한계에 대해 예상되는 가장 큰 값이 100만 미만이 되도록 입력 데이터의 단위를 정의하는 것이 좋습니다.

예를 들어, 미국 농업에서는 약 3억 2,500만 에이커가 경작되고 옥수수 수확량은 연간 90억-100억 부셸입니다. 생산 데이터를 정의할 때 토지는 1000에이커로, 기타 모든 자원은 1000단위로 입력할 수 있습니다. 우리는 또한 옥수수 작물을 수백만 부셸로 정의할 수도 있습니다. 데이터는 동시에 확장되므로 자원 보유량을 1000으로 표시하면 옥수수 수확량은 1000으로 나뉩니다. 이러한 확장으로 인해 수백만 단위의 옥수수 생산 변수가 생성됩니다. 그에 따라 소비 통계도 조정되어야 합니다. 화폐 단위는 수백만 달러 또는 수십억 달러일 수도 있습니다. 이러한 데이터 스케일링은 일반적으로 크레이지 슬롯의 계수 차이를 크게 줄여줍니다.

대형, 다차원 세트 경고

변수가 있는 경우x(i,j,k)특정 \((i,j,k)\) 조합에 대한 크레이지 슬롯에만 나타나는 경우, 0이 아닌 항목에 대한 배율 할당을 조건화해야 합니다. 예를 들면 다음과 같습니다.

x.scale(i,j,k)$ijk(i,j,k) = 표현식;

보다는

x.scale(i,j,k) = 표현식;

무조건 형식은 모든 조합 \((i,j,k)\)에 대해 배율 레코드를 생성하여 메모리 사용량이 많거나 초기화 시간이 매우 길어질 수 있습니다. a로 할당 제한$조건은 관련 항목만 기본값이 아닌 배율 값을 얻도록 보장합니다.

GAMS의 원뿔형 프로그래밍

원뿔형 프로그래밍 크레이지 슬롯은 아핀 세트와 비선형 원뿔의 곱의 교차점에 대한 선형 함수를 최소화합니다. 2차(2차) 원뿔과 관련된 문제 클래스를 2차 원뿔 프로그램(SOCP)이라고 합니다. 이는 특수 사례로 선형 및 (볼록) 2차 계획을 포함하는 비선형 볼록 문제입니다.

Conic 프로그램을 사용하면 엔지니어링 및 재무 관리 문제를 포함하여 다양한 응용 프로그램 크레이지 슬롯을 공식화할 수 있습니다. 예를 들어 포트폴리오 최적화, 구조 공학의 트러스 토폴로지 설계, 유한 충격 응답(FIR) 필터 설계 및 신호 처리, 안테나 배열 중량 설계, 파지력 최적화, 2차 프로그래밍, 견고한 선형 프로그래밍 및 표준 최소화 문제가 있습니다.

자세한 내용은 참조참조 및 링크이 섹션의 끝 부분에 있습니다.

원추형 프로그래밍 소개

원추형 계획법은 추가 비선형 제약 조건 \(x \in C\)을 갖춘 일반화된 선형 계획법으로 생각할 수 있습니다. 여기서 \(C\)는 볼록 원뿔이 되어야 합니다. 결과적인 문제 클래스는 다음과 같습니다.원뿔형 최적화다음 형식을 갖습니다:

\[ \begin배열rl \text최소화 & c^Tx \\ \text대상에 따라 & Ax \le r^c, \\ & x \in [l^x, u^x] \\ & x \in C \\ \end배열

여기서 \(A\in \mathbbR^m \times n\)는 제약 행렬, \(x \in \mathbbR^n\) 결정 변수 및 \(c \in \mathbbR^n\) 목적 함수 비용 계수. 벡터 \(r^c \in \mathbbR^m\)은 우변을 나타내고 벡터 \(l^x, u^x \in \mathbbR^n\)은 결정 변수 \(x\)의 하한 및 상한을 나타냅니다.

이제 결정 변수 세트 \(x\)를 세트 \(S^t, t=1,...,k\)로 분할하여 각 결정 변수 \(x\)가 최대 하나의 세트 \(S^t\)의 구성원이 되도록 합니다. 예를 들어 다음과 같이 할 수 있습니다.

\[ S^1 = (x_1, x_4, x_7) \quad \text및 \quad S^2 = (x_6, x_5, x_3, x_2). \]

\(x_S^t\)는 집합 \(S^t\)에 속하는 변수 \(x\)를 나타냅니다. 그런 다음 정의하십시오.

\begin방정식*

여기서 \(C_t\)는 다음 형식 중 하나를 가져야 합니다.

  • 2차 원뿔(로렌츠 또는 아이스크림콘이라고도 함):

    \[ C_t = \왼쪽 \ x \in \mathbbR^n^t : x_1 \ge \sqrt\sum_j=2^n^tx_j^2 \right \. \]

  • 회전됨2차 원뿔(쌍곡선 제약 조건이라고도 함):

    \[ C_t = \왼쪽 \ x \in \mathbbR^n^t : 2x_1x_2 \ge \sum_j=3^n^tx_j^2, ~x_1,x_2 \ge 0 \right \. \]

이 두 가지 유형의 원뿔을 사용하면 2차, 2차 제약 및 기타 여러 종류의 비선형 볼록 최적화 문제를 공식화할 수 있습니다.

GAMS에서 원뿔 제약 조건 구현

원뿔 제약 조건을 작성하는 권장 방법은 2차 공식을 사용하는 것입니다. 많은 솔버에는 a에서 원뿔 제약 조건을 식별하는 기능이 있습니다.QCP완벽한 형태는 아니지만 설명된 형태에 맞게 쉽게 재구성할 수 있는 크레이지 슬롯입니다. 그러나 일부 솔버(즉, MOSEK)에서는 원뿔 제약 조건이 위에 주어진 형식과 정확하게 일치할 것으로 기대합니다. 이전 버전에서는 이 형식이 특수 유형의 방정식에 의해 시행되었습니다.=c=방정식 유형. 더욱이, 이러한 솔버에는 간단한 재공식화 단계로 쉽게 충족될 수 있는 다른 요구 사항(예: 분리형 원뿔)이 있습니다. 앞으로 몇 년 동안 솔버 측면에서 많은 진전이 있을 것으로 예상되므로 여기서는 자세히 다루지 않습니다.

다음 제약 조건을 사용하여 원뿔 문제를 일반 NLP로 공식화할 수 있음을 관찰하십시오.

  • 2차 원뿔:
    x('1') =g= sqrt[ sum(i$[not sameas(i,'1')], sqr[x(i)]) ];
  • 회전된 2차 원뿔:
    2*x('1')*x('2') =g= sum(i$[not sameas(i,'1') and not sameas(i,'2')], sqr[x(i)]);
    여기x('1')그리고x('2')양수 변수입니다.

다음 예는 원뿔 프로그래밍 문제에 대한 다양한 공식을 보여줍니다. 원뿔형 최적화 프로그램은 일반적으로 재구성된(NLP) 원뿔 문제에 대한 일반적인 NLP 방법보다 성능이 뛰어납니다.

회전된 원추 제약 조건의 사용을 보여주는 다음 예를 고려하십시오. 우리는 일반 NLP 형식과 원뿔형(원뿔 제약 조건 포함)으로 원래 문제를 재구성할 것입니다.

원래 문제는:

\beginalign \text최소화 \; & \sum_i=1^n \fracd_ix_i \\ \text대상이 됨\; & a\,x \le b \\ & x_i \in [l_i,u_i], & i=1,\ldots,n \end정렬

여기서 \(x \in \mathbbR^n\)은 결정 변수이고, \(d, a, l, u \in \mathbbR^n\)은 \(l_i>0\) 및 \(d_i \ge 0\) 및 \(b \in을 갖는 매개변수입니다. \mathbbR\)는 스칼라 매개변수입니다. 원래 크레이지 슬롯은 다음 방정식을 사용하여 GAMS로 작성될 수 있습니다.

defobj..sum(n, d(n)/x(n)) =e= obj;
e1..sum(n, a(n)*x(n)) =l= b;
크레이지 슬롯 원본 /defobj, e1/;
x.lo(n) = l(n);
x.up(n) = u(n);

우리는 목적 함수의 치환 \(t_i=1/x_i\)을 사용하고 제약 조건을 추가하여 동등한 QCP 공식을 작성할 수 있습니다. 최소화 문제 \(d_i \ge 0\) 및 \(x_i \ge l_i > 0\)을 다룰 때 등식 \(t_ix_i=1\)을 부등식 \(t_ix_i \ge 1\)으로 완화할 수 있으며, 이는 볼록 실행 가능 집합과 동일한 문제를 발생시킵니다.

\beginalign \text최소화 \; & \sum_i=1^n d_i t_i \\ \text대상이 됨\; & a\,x \le b \\ & t_i x_i \ge 1, & i=1,\ldots,n \\ & x \in [l,u], \\ & t \ge 0, \\ \end정렬

여기서 \(t \in \mathbbR^n\)은 새로운 결정 변수입니다. 이 QCP의 GAMS 공식은 다음과 같습니다.

defobjc..sum(n, d(n)*t(n)) =e= obj;
e1..sum(n, a(n)*x(n)) =l= b;
coneqcp(n)..t(n)*x(n) =g= 1;

크레이지 슬롯 cqcp /defobjc, e1, coneqcp/;
t.lo(n) = 0;
x.lo(n) = l(n);
x.up(n) = u(n);

제약조건 \(t_i x_i \ge 1\)은 거의 회전된 원뿔 형태임을 참고하세요. \(z_i = \sqrt2\)를 사용하여 변수 \(z \in \mathbbR^n\)을 도입하면 다음과 같이 원뿔 제약 조건을 사용하여 문제를 다시 공식화할 수 있습니다.

\beginalign \text최소화 \; & \sum_i=1^n d_i t_i \\ \text대상이 됨\; & a\,x \le b \\ & z_i = \sqrt2, & i=1,\ldots,n \\ & 2 t_i x_i \ge z_i^2, & i=1,\ldots,n \\ & x \in [l,u],\\ & t \ge 0, \\ \end정렬

원뿔 방정식을 사용한 GAMS 공식은 다음과 같습니다:

defobjc..sum(n, d(n)*t(n)) =e= obj;
e1..sum(n, a(n)*x(n)) =l= b;
e2(n).. z(n) =e= sqrt(2);
coneperfect(n).. 2*x(n)*t(n) =g= sqr(z(n));

크레이지 슬롯 cperfect /defobjc, e1, e2, coneperfect/;
t.lo(n) = 0;
x.lo(n) = l(n);
x.up(n) = u(n);

전체 크레이지 슬롯은 아래에 나열되어 있습니다:

n / n1*n10 / 설정;
매개변수 d(n), a(n), l(n), u(n);
스칼라 b;

d(n) = 균일(1,2);
a(n) = 균일(10,50);
l(n) = 균일(0.1,10);
u(n) = l(n) + 균일(0,12-l(n));

변수 x(n);
x.l(n) = 균일(l(n), u(n));
b = sum(n, x.l(n)*a(n));

변수 t(n), z(n), obj;
방정식 defobjc, defobj, e1, e2(n), coneqcp(n), coneperfect(n), conenlp(n);

defobjc..sum(n, d(n)*t(n)) =e= obj;
defobj..sum(n, d(n)/x(n)) =e= obj;
e1..sum(n, a(n)*x(n)) =l= b;
coneqcp(n)..t(n)*x(n) =g= 1;
e2(n).. z(n) =e= sqrt(2);
coneperfect(n).. 2*x(n)*t(n) =g= sqr(z(n));

크레이지 슬롯 cqcp /defobjc, e1, coneqcp/;
크레이지 슬롯 cperfect /defobjc, e1, e2, coneperfect/;
크레이지 슬롯 원본 /defobj, e1/;

t.lo(n) = 0;
x.lo(n) = l(n);
x.up(n) = u(n);

옵션 qcp=cplex;
qcp를 사용하여 cqcp min obj를 해결합니다.
옵션 qcp=모섹;
qcp를 사용하여 cperfect min obj를 해결합니다.
nlp를 사용하여 원본 최소 객체를 해결합니다.

GAMS의 샘플 원뿔 크레이지 슬롯

GAMS 크레이지 슬롯 라이브러리의 원뿔형 크레이지 슬롯에는 다음이 포함됩니다.

  • [EMFL]: 여러 시설 위치 문제,
  • [FDESIGN]: 선형 위상 저역통과 필터 설계,
  • [IMMUN]: 재무 최적화: 위험 관리,
  • [PMEANVAR]: 가변 상한 및 하한을 갖는 평균-분산 크레이지 슬롯,
  • [QP7]: 회전된 2차 원뿔을 사용한 포트폴리오 투자 크레이지 슬롯(Markowitz 크레이지 슬롯을 사용한 2차 프로그램),
  • [ROBUSTLP]: SOCP로서의 강력한 선형 프로그래밍,
  • [스프링체인]: 조각별 선형 스프링을 사용한 시스템의 평형
  • [TRUSSM]: 다중 로드를 사용한 트러스 토폴로지 설계

참조 및 링크

  • A. Ben-Tal 및 A. Nemirovski, 최신 볼록 최적화 강의: 분석, 알고리즘 및 엔지니어링 응용, 최적화에 관한 MPS/SIAM 시리즈, SIAM Press, 2001.
  • M. Lobo, L. Vandenberghe, S. Boyd 및 H. Lebret,2차 원뿔 프로그래밍의 응용, 선형 대수학 및 그 응용, 284:193-228, 1998년 11월, 제어, 신호 및 이미지 처리의 선형 대수학에 관한 특별 호.
  • MOSEK ApS,MOSEK 크레이지 슬롯링 요리책, 2015.
  • 지. Pataki G 및 S. Schmieta, 반정정-2차-선형 프로그램의 DIMACS 라이브러리. 기술. 대표, 컬럼비아 대학교 컴퓨터 최적화 연구 센터, 2002.
  • 반부정 및 관련 최적화 문제에 대한 일곱 번째 Dimacs 구현 문제.

표시 제약 조건

표시기 제약조건은 제약조건 적용 여부를 제어하기 위해 바이너리 변수를 지정하여 변수 간의 관계를 표현하는 방법입니다. 예를 들어 표시기 제약 조건은 주어진 변수가 작용하는 경우에만 표현하기 위한 고정 요금이 있는 문제에 유용합니다.

소위 Big M 공식은 크레이지 슬롯에서 표현식의 상한을 추정해야 합니다. 대부분의 경우 크레이지 슬롯 데이터는 그러한 계수에 대해 상대적으로 작은 수를 결정하는 데 사용될 수 있습니다. 어떤 경우에는 작은 Big M 값을 찾는 것이 불가능하며 결과 솔루션에서 세류 흐름이 나타나거나 기타 원치 않는 부작용이 있을 수 있습니다. 지표 제약의 주요 목적은 Big M 공식의 이러한 한계를 극복하는 것입니다. 일반적으로 Big M 공식의 원치 않는 부작용이 존재하지 않는 경우 지표 제약 조건의 사용은 보증되지 않습니다.

다음 예를 고려해보세요:

constr01.. x1 + x2 + x3 =l= 1e+9*y; // 문제가 발생할 수 있습니다.

여기서 우리는 \(x\) 값에 의존하여 합계가 10억 미만이 되는 Big M 공식을 사용합니다. 이 공식은 일부 상황에서 수치적 불안정이나 바람직하지 않은 솔루션을 유발할 수 있습니다. 또는 표시기 제약 조건을 사용할 수 있습니다.

constr01$(y=0).. x1 + x2 + x3 =l= 0; // 대안

\(y\)는 바이너리 변수라는 점에 유의하세요;논리적 조건\(y=0\)인 경우에만 제약 조건이 활성화되도록 합니다. 불행히도,$()식은 내생 변수를 허용하지 않으며 그러한 의미를 지정하려면 다른 방법이 필요합니다. 표시기는 COPT, CPLEX, GUROBI, SCIP 및 XPRESS에서 지원됩니다.

명시적인 지표 제약 없이 지표의 공식화를 언급해야 합니다. 우리는 SOS1 제약 조건을 사용하여 여유 변수와 이진 변수의 SOS1 세트를 가짐으로써 이진 변수를 기반으로 제약 조건이 유지되는지 여부를 표현할 수 있습니다.SOS1(slack,1-y):

양수 변수 여유;
constr01.. x1 + x2 + x3 =l= 느슨함; // 대안

SOS1 제약 조건의 변수 중 하나만 0이 아닐 수 있다는 점을 기억하십시오. 따라서 만약1년0이 아닙니다(예:y=0) 그런 다음느슨함0이어야 합니다. 즉, 제약 조건이 유지됩니다. 만일1-y=00이 아닙니다. 즉,y=1그런 다음느슨함다음의 모든 설정에 대해 제약 조건을 실행 가능하게 만드는 데 사용할 수 있습니다.x1, x2x3. 여기에 관련되지 않은 두 개의 변수가 있습니다.느슨함그리고ySOS1 제약 조건의 일부이며 이를 GAMS에서 올바르게 공식화하려면 몇 가지 트릭이 필요합니다.

oo / 여유, yExpr / 설정;
SOS1 변수 indic(oo);
방정식 iOn, iOff;
양의 변수 여유;
constr01.. x1 + x2 + x3 =l= 느슨함;
iOn..indic('slack') =e= 슬랙;
iOff.. indic('yExpr') =e= 1-y;

GAMS의 표시기 제약

이 섹션의 나머지 부분에서는 GAMS를 사용할 때 표시기 제약 조건을 지정하는 방법을 설명합니다. 표시기 제약 조건이 지원되는지 여부와 해당 사양에서 발생할 수 있는 차이점에 대한 자세한 내용은 해당 솔버 매뉴얼을 참조하세요.

위의 예는 솔버 옵션 파일의 추가 정보와 결합된 제약 조건으로 구현됩니다. CPLEX:cplex.opt:

constr01.. x1 + x2 + x3 =l= 0;

및 옵션 파일의 다음 항목:

인딕 constr01$y 0

이것은 다음과 같은 효과를 갖습니다: 방정식constr01은 표시 제약 조건이 되며 이진 변수가 값 0을 취하는 솔루션에서 활성화됩니다. 솔루션의 \(y\) 값이 1이면 제약 조건이 활성화되지 않습니다.

표시기 제약 조건을 입력하는 이 방법은 옵션 파일이 크레이지 슬롯을 변경하기 때문에 위험하다는 점에 유의하십시오(보통 옵션 파일은 알고리즘 성능에 어느 정도 영향을 미칩니다). 따라서 솔버 옵션 파일의 표시기 옵션을 처리하는 데 문제가 있으면 솔버가 중단됩니다.

주의
크레이지 슬롯이 표시기 매핑을 포함하는 옵션 파일 없이 솔버에 제공되는 경우(또는 이를 이해하지 못하는 솔버에인딕키워드), 매우 다른 크레이지 슬롯이 해결될 것입니다. 현재 표시기 제약 조건을 구현하려면 사용자의 상당한 주의가 필요합니다.

솔버 옵션 파일에 방정식/이진 변수 매핑을 입력하는 두 가지 방법이 있습니다: 색인 형식을 사용하는 것과 라벨을 사용하는 것.

색인이 생성됨 형식은 GAMS 구문에서 구문을 차용한 편리한 약식 표기법입니다. 이진 변수에 대한 인덱스가 방정식의 인덱스 세트에 이미 존재해야 합니다.

달러 조건에 내생 변수가 있는 유효하지 않은 GAMS 구문의 다음 예를 고려하십시오:

equ1(i,j,k)$(ord(i) < ord(j) 및 bin1(i,k)=1).. lhs =l= rhs;

이것은 GAMS 파일에서 다음 방정식으로 지정될 수 있습니다:

equ1(i,j,k)$(ord(i) < ord(j)).. lhs =l= rhs;

그리고 다음 항목이 포함된 솔버 옵션 파일:

인도 equ1(i,j,k)$bin1(i,k) 1

라벨 형식이진 변수 인덱스가 방정식 인덱스에 존재하지 않거나 이진 변수가 다음으로 조정되는 경우에 사용됩니다.지연 또는 리드. 이러한 경우 지표 제약 조건의 모든 개별 방정식과 변수의 매핑을 지정해야 합니다. 다음은 예시입니다.

i /i1*i3/, j /j1*j2/ 설정;
이진변수 bin1(j);
방정식 equ1(i,j);

equ1(i,j)$(bin1(j++1)=0).. lhs =e= 0;

위의 예는 유효한 GAMS 코드가 아닙니다. 대신 다음과 같이 레이블 형식을 사용하여 유효한 GAMS 방정식과 솔버 옵션 파일을 결합합니다.

equ1(i,j).. lhs =e= 0;

및 솔버 옵션 파일

인딕 equ1('i1','j1')$bin1('j2') 0
인도식 equ1('i1','j2')$bin1('j1') 0
인도식 equ1('i2','j1')$bin1('j2') 0
인도식 equ1('i2','j2')$bin1('j1') 0
인도식 equ1('i3','j1')$bin1('j2') 0
인도어 equ1('i3','j2')$bin1('j1') 0

이러한 옵션 파일의 행은 수동으로 입력할 필요가 없다는 점에 유의하십시오. GAMS를 사용하여 쉽게 생성할 수 있습니다.Put 작성 시설. 예를 들어 위의 줄은 다음과 같이 생성될 수 있습니다.

파일 fcpx / cplex.opt /;
fcpx.pc=8;
loop((i,j), put fcpx 'indic' equ1(i,j) '$' bin1(j++1) '0'/);
putclose fcpx;
주의
인덱스 형식과 라벨 형식을 혼합하여 일치시킬 수 없습니다. 와 같은 표현은eq(i,j,k)$x(i,k)그리고eq('i1','j2','k3')$x('i1','k6')유효합니다. 다음과 같은 조합이 가능합니다.eq(i,'j2',k)$x(i,k)지원되지 않습니다.

표시 바이너리 변수가 표시 제약 조건에만 존재하므로 그렇게 되는 상황이 있습니다.아님생성GAMS에 의해 솔버에 전달됩니다. 이러한 경우 솔버는 다음과 같은 오류 메시지를 표시합니다.

오류: 열이 변수 유형이 아닙니다.

이 문제를 해결하는 쉬운 방법이 있습니다. 이진 표시 변수를 크레이지 슬롯에 인위적으로 추가하는 것입니다. 예를 들어 계수와 함께 추가될 수 있습니다.eps목표에:

defobj.. z =e= ... + eps*sum(j, bin1(j));

GAMS를 사용한 표시 제약 조건의 예

이 하위 섹션에서는 크레이지 슬롯의 일부에 대해 설명합니다.[TRNSINDIC]. 이 크레이지 슬롯은 동일한 문제를 해결하기 위해 Big M 공식과 지표 제약 조건을 사용합니다. 또한, 이 둘 사이를 쉽게 전환할 수 있는 공식이 제시됩니다. 잘 알려진 크레이지 슬롯을 기반으로 한 고정 요금 네트워크의 예입니다.[TRNSPORT].

그것을 기억하세요i통조림 공장 세트이고j은 일부 제품의 케이스가 배송될 시장 집합입니다. 먼저 기본 크레이지 슬롯은 이진 변수를 도입하여 MIP로 재구성됩니다.사용(i,j)그리고 두 개의 새로운 방정식:

이진 변수 use(i,j)는 arc가 솔루션에 사용되는 경우 1입니다.

방정식 minship(i,j)는 최소 배송을 보장합니다.
                maxship(i,j) 사용 변수가 0인 경우 배송이 0이 되도록 보장합니다.

minship(i,j).. x(i,j) =g= minshipping*use(i,j);
maxship(i,j).. x(i,j) =l= bigM*use(i,j);

참고최소배송는 배송될 수 있는 최소 케이스 수를 나타내는 스칼라입니다.빅엠평소처럼 충분히 큰 숫자입니다.

다음으로 동일한 문제가 표시기 제약 조건으로 해결됩니다. 두 개의 새로운 방정식이 재구성되고 표시기 제약 조건에 대한 정보가 포함된 CPLEX 옵션 파일이 추가됩니다.

방정식 iminship(i,j)는 표시기 제약 조건을 사용하여 최소 배송을 보장합니다.
           imaxship(i,j) 표시 제약 조건을 사용하여 사용 변수가 0인 경우 배송이 0이 되도록 보장합니다.

iminship(i,j).. x(i,j) =g= minshipping;
imaxship(i,j).. x(i,j) =e= 0;

크레이지 슬롯 표시기크레이지 슬롯 /비용, 공급, 수요, iminship, imaxship/ ;

file fcpx Cplex 옵션 파일 / cplex.opt /;
putclose fcpx '인딕 iminship(i,j)$use(i,j) 1' / '인딕 imaxship(i,j)$use(i,j) 0';
표시기크레이지 슬롯.optfile = 1;

z를 최소화하는 mip를 사용하여 IndicatorModel을 해결합니다.

옵션 파일에는 두 방정식 각각에 대한 항목이 포함되어 있습니다. 또한 이진 변수는사용방정식에서 옵션 파일로 이동했습니다. 그러나 이는 크레이지 슬롯의 목적 방정식에도 포함되므로 문제가 되지 않습니다. 방정식/이진 변수 매핑에 대한 색인 형식이 옵션 파일에 사용되었는지 확인합니다. 또는 레이블 형식을 사용할 수 있습니다.

루프((i,j),
     put fcpx 'indic' iminship.tn(i,j) '$' use.tn(i,j) 예
            / 'indic' imaxship.tn(i,j) '$' use.tn(i,j) no / );
  putclose fcpx;

마지막 단계에서 크레이지 슬롯은 지표 제약이 있거나 없이 동일한 문제가 해결될 수 있도록 다시 공식화됩니다. 이는 표시기 제약 조건이 있는 크레이지 슬롯을 디버깅하는 데 특히 유용할 수 있습니다. 자세한 내용은 참조[TRNSINDIC].

표시기 제약이 있는 크레이지 슬롯의 또 다른 예는 크레이지 슬롯입니다.[쌍선형]여기서 이중선형 곱 용어를 나타내는 다양한 공식이 시연됩니다.