iobalance.gms : 계수 업데이트 및 투영: RAS 접근 방식

설명

RAS 절차(Richard A. Stone의 이름을 따서 명명)는 다음을 수행하는 반복 절차입니다.
매트릭스를 업데이트합니다. 이 수치 예는 Miller의 7.4.2장에서 가져온 것입니다.
그리고 블레어. 몇 가지 추가 최적화 공식이 적용됩니다.
이 장난감 문제.

소형 모델 유형 :NLP


카테고리 : 슬롯 모델 라이브러리


메인 파일 : iobalance.gms

$title 계수 업데이트 및 투영: RAS 접근 방식(IOBALANCE,SEQ=378)

$onText
RAS 절차(Richard A. Stone의 이름을 따서 명명)는 다음을 수행하는 반복 절차입니다.
매트릭스를 업데이트합니다. 이 수치 예는 Miller의 7.4.2장에서 가져온 것입니다.
그리고 블레어. 몇 가지 추가 최적화 공식이 적용됩니다.
이 장난감 문제.

Miller R E 및 Blair P D, 입출력 분석: 기초 및 확장,
캠브리지 대학 출판부, 뉴욕, 2009.

키워드: 선형 계획법, 비선형 계획법, 2차 제약 조건, 통계,
          RAS 접근 방식
$offText

i / 1*3 / 설정;

별칭(i,j);

테이블 a0(i,j) '알려진 기본 행렬'
         1 2 3
   1 .120 .100 .049
   2 .210 .247 .265
   3 .026 .249 .145;

표 z1(i,j) '알 수 없는 산업 흐름'
       1 2 3
   1 98 72 75
   2 65 8 63
   3 88 27 44;

매개변수
   x(j) '관측된 총 출력' / 1 421, 2 284, 3 283 /
   u(i) '관찰된 행 합계'
   v(j) '관찰된 열 합계'
   a1(i,j) '알 수 없는 행렬 A';

u(i) = sum(j, z1(i,j));
v(j) = 합계(i, z1(i,j));

a1(i,j) = z1(i,j)/x(j);

u, v, a1을 표시합니다.

* --- 1: RAS 업데이트 중
매개변수
   r(i) '행 조정'
   s(j) '열 조정';

r(i) = 1;
s(j) = 1;

매개변수 oldr, olds, maxdelta;
최대델타 = 1;

반복하다
   oldr(i) = r(i);
   olds(j) = s(j);
   r(i) = r(i)*u(i)/sum(j, r(i)*a0(i,j)*x(j)*s(j));
   s(j) = s(j)*v(j)/sum(i, r(i)*a0(i,j)*x(j)*s(j));
   maxdelta = max(smax(i, abs(oldr(i) - r(i))),smax(j, abs(olds(j) - s(j))));
   최대 델타를 표시합니다.
maxdelta < 0.005까지;

매개변수 보고서(*,i,j) '요약 보고서';
옵션 보고서:3:1:2;

보고서('A0' ,i,j) = a0(i,j);
보고서('A1' ,i,j) = a1(i,j);
보고서('RAS',i,j) = r(i)*a0(i,j)*s(j);

* --- 2: 엔트로피 공식 a*ln(a/a0)
* RAS 절차는 엔트로피 공식에 대한 솔루션을 제공합니다.
변수
   obj '객관적 값'
   a(i,j) '추정된 A 행렬'
   z(i,j) '추정된 Z 행렬';

양수 변수 a, z;

방정식
   rowbal(i) '행 합계'
   colbal(j) '열 합계'
   defobjent '엔트로피 정의';

rowbal(i).. sum(j, a(i,j)*x(j)) =e= u(i);

colbal(j)..sum(i, a(i,j)*x(j)) =e= v(j);

defobjent.. obj =e= sum((i,j), x(j)*a(i,j)*log(a(i,j)/a0(i,j)));

모델 mEntropy / rowbal, colbal, defobjent /;

* 도메인 위반을 방지하려면 작은 값을 제외해야 합니다.
a.lo(i,j) = 1e-5;

nlp min obj를 사용하여 mEntropy를 해결합니다. Report('엔트로피',i,j) = a.l(i,j);

* --- 3: 흐름 변수가 있는 엔트로피
* A 매트릭스 대신 흐름 매트릭스의 균형을 맞출 수 있습니다.
변수 zv(i,j) '산업 흐름';

방정식
   rowbalz(i) '행 합계'
   colbalz(j) '열 합계 tive'
   defobjentz '흐름을 사용한 엔트로피 목표';

rowbalz(i)..sum(j, zv(i,j)) =e= u(i);

colbalz(j)..sum(i, zv(i,j)) =e= v(j);

매개변수 zbar(i,j) '참조 흐름';

zbar(i,j) = a0(i,j)*x(j);
zv.lo(i,j) = 1;

defobjentz.. obj =e= sum((i,j), zv(i,j)*log(zv(i,j)/zbar(i,j)));

모델 mEntropyz / rowbalz, colbalz, defobjentz /;

* 세부 출력 끄기
옵션 limRow = 0, limCol = 0, solPrint = off;

nlp min obj를 사용하여 mEntropyz를 해결합니다. Report('EntropyZ',i,j) = zv.l(i,j)/x(j);

* --- 4. 절대 편차 공식으로 인해 LP가 생성됨
* MAD 평균 절대 편차
* MAPE 평균 절대 백분율 오차
* 린프 인피니티 노름
양수 변수
   ap(i,j) '양의 편차'
   an(i,j) '음의 편차'
   amax '최대 절대값 개발';

방정식
   defabs(i,j) '절대 정의'
   defmaxp(i,j) '최대 양수'
   defmaxn(i,j) '최대 부정'
   defmad 'MAD 정의'
   defmade '평균 절대 백분율 오류'
   deflinf '무한대 노름';

defabs(i,j).. a(i,j) - a0(i,j) =e= ap(i,j) - an(i,j);

defmaxp(i,j).. a(i,j) - a0(i,j) =l= amax;

defmaxn(i,j).. a(i,j) - a0(i,j) =g= -amax;

defmad.. obj =e= 1/sqr(card(i))*sum((i,j), ap(i,j) + an(i,j));

defmade.. obj =e= 100/sqr(card(i))*sum((i,j),(ap(i,j) + an(i,j))/a0(i,j));

defLinf..obj =e= amax;

모델
   mMAD / rowbal, colbal, defabs, defmad /
   mMADE / rowbal, colbal, defabs, defmade /
   mLinf / rowbal, colbal, defmaxp, defmaxn, deflinf /;

lp min obj를 사용하여 mMAD를 해결합니다. 보고서('MAD' ,i,j) = a.l(i,j);
lp min obj를 사용하여 mMADe를 푼다. 보고서('MADE',i,j) = a.l(i,j);
lp min obj를 사용하여 mLinf를 해결합니다. Report('Linf',i,j) = a.l(i,j);

* --- 5. 강력한 QP 코드로 제곱 편차를 해결할 수 있습니다.
* SD 제곱 편차
* RSD 상대 제곱 편차
방정식 defsd, defrsd;

defsd..obj =e= sum((i,j), sqr(a(i,j) + a0(i,j)));

defrsd..obj =e= sum((i,j), sqr(a(i,j) + a0(i,j))/a0(i,j));

모델
   MSD / 로우발, 콜발, defsd /
   mRSD / rowbal, colbal, defrsd /;

qcp min obj를 사용하여 MSD를 해결합니다. 보고서('SD',i,j) = a.l(i,j);
qcp min obj를 사용하여 mRSD를 해결합니다. 보고서('RSD',i,j) = a.l(i,j);

보고서 표시;