슬롯 커뮤니티.gms : 선형 곱셈 모델 - 유형 3

설명

다음의 무작위 선형 곱셈 모델을 생성하고 해결합니다.
"3번을 입력하세요." 문제 인스턴스는 다음이 제안한 대로 생성됩니다.
벤슨과 보거. N. Sahinidis가 개발한 모델입니다.

대형 모델 유형 :NLP


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


메인 파일 : 슬롯 커뮤니티.gms

$title 선형 곱셈 프로그램 - 유형 3(슬롯 커뮤니티,SEQ=253)

$onText
다음의 무작위 선형 곱셈 모델을 생성하고 해결합니다.
"3번을 입력하세요." 문제 인스턴스는 다음이 제안한 대로 생성됩니다.
벤슨과 보거. N. Sahinidis가 개발한 모델입니다.

H. P. Benson과 G. M. Boger, "곱셈 프로그래밍 문제:
분석 및 효율적인 포인트 탐색 휴리스틱",
최적화 이론 및 응용 저널, 94(487-510), 1997.

M. Tawarmalani 및 N. Sahinidis, 볼록화 및 글로벌
연속 및 혼합 정수 비선형의 최적화
프로그래밍: 이론, 알고리즘, 소프트웨어 및 응용 프로그램,
클루어 학술 출판사, 2002.

키워드: 비선형 계획법, 선형 곱셈 계획법,
          전역 최적화, 오목 최소화
$offText

옵션 optCr = 0, optCa = 1.e-6, limRow = 0, limCol = 0, solPrint = off;

세트
   mm / m1*m220 /
   nn / n1*n200 /
   pp / p1*p4 /;

세트
   m(mm) '제약'
   n(nn) '변수'
   p(pp) '제품'
   c '케이스' / c1*c9 /
   i '인스턴스' / i1*i5 /;

* 해결해야 할 각 사례에 대해 서로 다른 (m,n,p) 삼중항을 사용합니다.
테이블 케이스(c,*)
         m n p
   c1 20 30 2
   c2 120 100 2
   c3 220 200 2
   c4 20 30 3
   c5 120 120 3
   c6 200 180 3
   c7 20 30 4
   c8 100 100 4
   c9 200 200 4;

매개변수
   cc(pp,nn) '비용 계수'
   A(mm,nn) '제약 계수'
   b(mm) '왼쪽'
   rep(c,*) '요약 보고서'
   실제적인
   실제의
   사실적인
   ResMin
   레스맥스
   NodMin
   노드맥스;

변수
   y(pp)
   x(nn)
   obj;

방정식
   목표
   제약조건(mm)
   제품(pp);

목적.. obj =e= prod(p, y(p));

제품(p).. y(p) =e= sum(n, cc(p,n)*x(n));

제약 조건(m).. b(m) =l= sum(n, A(m,n)*x(n));

x.lo(nn) = 1;

모델 슬롯 커뮤니티 / 모두 /;

슬롯 커뮤니티.workSpace = 32;

담당자(c,'AvgResUsd') = 0;
담당자(c,'AvgNodUsd') = 0;

루프(c,
   m(mm) = ord(mm)<= 건수(c,'m');
   n(nn) = ord(nn)<= 케이스(c,'n');
   p(pp) = ord(pp)<= 케이스(c,'p');
   mactual = 케이스(c,'m');
   실제 = 사례(c,'n');
   pacual = 케이스(c,'p');
   ResMin = inf;
   레스맥스 = 0;
   NodMin = inf;
   노드맥스 = 0;

   루프(나,
      cc(p,n) = round(uniform(1,10));
      A(m,n) = round(uniform(1,10));
      b(m) = 합계(n, A(m,n)**2);
      x.up(n) = smax(m, b(m));

* 모든 모델의 초기 시작점을 0으로 설정
      x.l(n) = 0;
      y.l(p) = 0;

      nlp를 사용하여 obj를 최소화하는 슬롯 커뮤니티를 해결합니다.

      담당자(c,'AvgResUsd') = 담당자(c,'AvgResUsd') + 슬롯 커뮤니티.resUsd;
      담당자(c,'AvgNodUsd') = 담당자(c,'AvgNodUsd') + 슬롯 커뮤니티.nodUsd;
      ResMin = min(ResMin, 슬롯 커뮤니티.resUsd);
      NodMin = min(NodMin, 슬롯 커뮤니티.nodUsd);
      ResMax = max(ResMax, 슬롯 커뮤니티.resUsd);
      NodMax = max(NodMax, 슬롯 커뮤니티.nodUsd);
   );
   담당자(c,'MinResUsd') = ResMin;
   담당자(c,'MaxResUsd') = ResMax;
   담당자(c,'MinNodUsd') = NodMin;
   담당자(c,'MaxNodUsd') = NodMax;
);
담당자(c,'AvgResUsd') = 담당자(c,'AvgResUsd')/카드(i);
담당자(c,'AvgNodUsd') = 담당자(c,'AvgnodUsd')/카드(i);

디스플레이 담당자;