설명
GUSS는 관련 컬렉션의 최적화를 촉진하는 절차입니다. 해당 문제의 데이터를 수정하는 데 문제가 있습니다. GUSS를 사용하면 다음 문제를 해결할 수 있습니다. 반복적인 해결이나 분석이 필요 없이 단일 패스로 모델을 수집합니다. 여러 해결에 대한 LOOP. GUSS는 실제로 해결사가 아니라 조직화하고 다른 LP, NLP, MIP 등의 솔버와 데이터를 주고 받습니다. 이 모든 작업은 한 번에 완료됩니다. 메가 슬롯 루프 명령을 통해 여러 해결을 사용할 때보다 더 빠른 방식입니다. 특히 GUSS는 모델에 대해 사용자가 지정한 데이터에 대해 모델을 반복적으로 실행합니다. 실행할 대체 시나리오를 집합적으로 정의하는 매개변수입니다. 하면서 이는 변경된 시나리오 데이터로 기본 모델을 반복적으로 업데이트한 다음 해당 시나리오에 대해 업데이트된 모델을 해결하고 사용자가 선택한 결과를 저장합니다. 각 시나리오. GUSS는 Michael R. Bussieck, Michael C. Ferris 및 Timo Lohmann이 개발했습니다. 이는 /modlib/adddocs/gusspaper.pdf 및 솔버 매뉴얼의 GUSS 섹션. 기존 모델에 GUSS를 사용하려면 6단계가 필요합니다. 1. 실행할 시나리오 정의 2. 품목에 대한 시나리오별 데이터를 보유하는 매개변수 정의 변경될 모델에 3. 시나리오별 모델 결과를 보유할 매개변수 정의 사용자가 저장하려는 항목에 대해 4. 실행할 시나리오, 변경할 데이터를 GUSS에 알려주는 세트 정의 및 저장할 결과 5. 해당 시나리오가 실행될 것임을 식별하기 위해 해결 문 수정 6. 시나리오 결과를 보고하는 코드 개발 이 6단계는 간단한 전송 모델을 사용하여 설명됩니다.
소형 모델 유형 :LP
카테고리 : 메가 슬롯 모델 라이브러리
메인 파일 : gussex1.gms
$title 간단한 GUSS 예(GUSSEX1,SEQ=398)
$onText
GUSS는 관련 컬렉션의 최적화를 촉진하는 절차입니다.
해당 문제의 데이터를 수정하는 데 문제가 있습니다. GUSS를 사용하면 다음 문제를 해결할 수 있습니다.
반복적인 해결이나 분석이 필요 없이 단일 패스로 모델을 수집합니다.
여러 해결에 대한 LOOP. GUSS는 실제로 해결사가 아니라 조직화하고
다른 LP, NLP, MIP 등의 솔버와 데이터를 주고 받습니다. 이 모든 작업은 한 번에 완료됩니다.
메가 슬롯 루프 명령을 통해 여러 해결을 사용할 때보다 더 빠른 방식입니다.
특히 GUSS는 모델에 대해 사용자가 지정한 데이터에 대해 모델을 반복적으로 실행합니다.
실행할 대체 시나리오를 집합적으로 정의하는 매개변수입니다. 하면서
이는 변경된 시나리오 데이터로 기본 모델을 반복적으로 업데이트한 다음
해당 시나리오에 대해 업데이트된 모델을 해결하고 사용자가 선택한 결과를 저장합니다.
각 시나리오.
GUSS는 Michael R. Bussieck, Michael C. Ferris 및 Timo Lohmann이 개발했습니다.
이는 /modlib/adddocs/gusspaper.pdf 및
솔버 매뉴얼의 GUSS 섹션.
기존 모델에 GUSS를 사용하려면 6단계가 필요합니다.
1. 실행할 시나리오 정의
2. 품목에 대한 시나리오별 데이터를 보유하는 매개변수 정의
변경될 모델에
3. 시나리오별 모델 결과를 보유할 매개변수 정의
사용자가 저장하려는 항목에 대해
4. 실행할 시나리오, 변경할 데이터를 GUSS에 알려주는 세트 정의
및 저장할 결과
5. 해당 시나리오가 실행될 것임을 식별하기 위해 해결 문 수정
6. 시나리오 결과를 보고하는 코드 개발
이 6단계는 간단한 전송 모델을 사용하여 설명됩니다.
Bussieck, MR, Ferris, MC 및 Lohmann, T, GUSS: 데이터 수집 해결
메가 슬롯 내의 관련 모델. Kallrath, J, Ed, 대수 모델링 시스템: 모델링
및 실제 최적화 문제 해결. Springer, 베를린 하이델베르그, 2012, pp. 35-56.
키워드: 선형 계획법, 운송 문제, 스케줄링, GUSS, 시나리오 분석
$offText
세트
i '통조림 식물' / 시애틀, 샌디에이고 /
j 'markets' / 뉴욕, 시카고, 토피카 /;
매개변수
a(i) '경우에 따라 식물 i의 용량'
/시애틀 350
샌디에이고 600 /
b(j) '경우에 따라 시장 j의 수요'
/ 뉴욕 325
시카고 300
토피카 275 /;
테이블 d(i,j) '거리(천 마일)'
뉴욕 시카고 토피카
시애틀 2.5 1.7 1.8
샌디에고 2.4 1.4;
스칼라 f '1,000마일당 케이스당 운임(달러)' / 90 /;
매개변수 c(i,j) '케이스당 운송 비용(단위: 수천 달러)';
c(i,j) = f*d(i,j)/1000;
변수
x(i,j) '케이스의 선적 수량'
z '총 운송 비용(천 달러)';
양수 변수 x;
방정식
비용 '목적 함수 정의'
Supply(i) '공장 i의 공급 제한을 준수합니다.'
수요(j) '시장 j의 수요를 충족';
비용.. z =e= sum((i,j), c(i,j)*x(i,j));
공급(i).. sum(j, x(i,j)) =l= a(i);
수요(j)..sum(i, x(i,j)) =g= b(j);
모델 운송 / 모두 /;
ScenariosToRun 설정 'scenarios' / base, run1, run2 /;
테이블 newsupply(ScenariosToRun,i) 'updater for a'
시애틀 샌디에이고
베이스 350 600
실행1 300 650
실행2 401 549;
테이블 newdemand(ScenariosToRun,j) 'b에 대한 업데이트'
뉴욕 시카고 토피카
베이스 325 300 275
실행1 325 300 275
실행2 350 300 250;
mattrib / system.GUSSModelAttributes / 설정;
매개변수
xl(ScenariosToRun,i,j) 'x 레벨에 대한 수집기'
xm(ScenariosToRun,i,j) 'x의 한계에 대한 수집기'
Demandl(ScenariosToRun,j) '수요 수준 수집기'
Demandm(ScenariosToRun,j) '수요 한계 수집기'
srep(ScenariosToRun, mattrib) 'modelstat 등과 같은 모델 속성'
o(*) 'GUSS 옵션' / SkipBaseCase 1 /;
dict / ScenariosToRun.scenario를 설정하세요.''
오. .srep 선택
가. 매개변수 .newsupply
b. 매개변수 .newdemand
x. 레벨 .xl
x. 한계.xm
수요. 레벨 .수요
수요. 한계.수요m /;
z 시나리오 dict를 최소화하는 lp를 사용하여 전송을 해결합니다.
* 위 결과 줄의 해결 문도 표현할 수 있습니다.
* 전통적인 메가 슬롯 구문에서는 다음과 같습니다.
$onText
loop(실행할 시나리오,
a(i) = newsupply(ScenariosToRun,i);
b(j) = newdemand(ScenariosToRun,j);
z를 최소화하는 lp를 사용하여 전송을 해결합니다.
xl(ScenariosToRun,i,j) = x.l(i,j);
xm(ScenariosToRun,i,j) = x.m(i,j);
Demandl(ScenariosToRun,j) = 수요.l(j);
Demandm(ScenariosToRun,j) = 수요.m(j);
);
$offText
오류 설정(scenariostorun) '빈 솔루션';
오류(시나리오스토룬) = sum((i,j), xl(시나리오스토룬,i,j)) = 0;
abort$card(error) '일부 시나리오에 대한 솔루션이 누락되었습니다', 오류;
* 이제 scaleOpt=1로 GUSS를 다시 실행하고 솔루션을 비교하세요.
매개변수
sxl(ScenariosToRun,i,j) 'x 레벨에 대한 수집기'
sxm(ScenariosToRun,i,j) 'x의 한계에 대한 수집기'
sdemandl(ScenariosToRun,j) '수요 수준 수집기'
sdemandm(ScenariosToRun,j) '수요 한계 수집기';
sdict / ScenariosToRun.scenario를 설정하세요.''
오. .srep 선택
가. 매개변수 .newsupply
b. 매개변수 .newdemand
x. 레벨 .sxl
x. 한계.sxm
수요. 수준 .sdemandl
수요. 한계.sdemandm /;
x.scale(i,j) = 10;
수요.규모(j) = 100;
Transport.scaleOpt = 1;
z 시나리오 sdict를 최소화하는 lp를 사용하여 전송을 해결합니다.
abort$(smax((ScenariosToRun,i,j), abs(xl(ScenariosToRun,i,j)-sxl(ScenariosToRun,i,j))) > 1e-3) '잘못된 x.l 크기 조정 및 크기 조정 취소:', xl, sxl;
abort$(smax((ScenariosToRun,i,j), abs(xm(ScenariosToRun,i,j)-sxm(ScenariosToRun,i,j))) > 1e-3) '잘못된 x.m 크기 조정 및 크기 조정 취소:', xm, sxm;
abort$(smax((ScenariosToRun,j), abs(demandl(ScenariosToRun,j)-sdemandl(ScenariosToRun,j))) > 1e-3) '잘못된 Demand.l 크기 조정 및 크기 조정 취소:', Demandl, sdemandl;
abort$(smax((ScenariosToRun,j), abs(demandm(ScenariosToRun,j)-sdemandm(ScenariosToRun,j))) > 1e-3) '잘못된 Demand.m 크기 조정 및 크기 조정 취소:', Demandm, sdemandm;