로드 중...
검색 중...
일치하는 항목 없음
Benders2Stage.cs
1사용 중시스템;
2사용 중System.Collections.Generic;
3사용 중시스템.텍스트;
4사용 중시스템.IO;
5사용 중슬롯 나라;
6
8{
25{
26 정적 공허메인(문자열[] 인수)
27{
29 if(Environment.GetCommandLineArgs().Length > 1)
30ws =신규 슬롯 나라작업공간(systemDirectory: Environment.GetCommandLineArgs()[1]);
31 그밖에
32ws =신규 슬롯 나라작업공간();
33 GAMSJob데이터 = ws.AddJobFromString(GetDataText());
34
36optData.정의.추가("useBig", "1");
37optData.정의.추가("nrScen", "100");
38
39데이터.실행(optData);
40
41optData.폐기();
42 슬롯 나라매개변수scenarioData = 데이터.아웃DB.GetParameter("시나리오데이터");
43
45선택.정의.추가("데이터인", 데이터.아웃DB.이름);
46 int맥시터 = 40;
47선택.정의.추가("맥시터", maxiter.ToString());
48opt.AllModelTypes ="복합체";
49
52
53ws.AddJobFromString(GetMasterText()).실행(선택, cpMaster, 데이터.아웃DB);
54
55 GAMSModelInstancemasteri = cpMaster.AddModelInstance();
56 슬롯 나라매개변수cutconst = masteri.SyncDB.매개변수 추가("cutconst", 1,"벤더 최적성 컷 상수");
57 슬롯 나라매개변수cutcoeff = 마스터리.SyncDB.매개변수 추가("cutcoeff", 2,"벤더 최적 계수");
58 슬롯 나라변수세타 = 마스터리.SyncDB.변수 추가("세타", 0,VarType.무료,"미래 이익 함수 변수");
59 슬롯 나라매개변수thetaFix = masteri.SyncDB.매개변수 추가("thetaFix", 0,"");
60masteri.인스턴스화("lp를 사용하는 masterproblem max zmaster", 선택,신규 GAMSModifier(cutconst),신규 GAMSModifier(cutcoeff),신규 GAMSModifier(세타,업데이트작업.Fixed,thetaFix));
61
62ws.AddJobFromString(GetSubText()).실행(선택, cpSub, 데이터.아웃DB);
63
65 슬롯 나라매개변수수신 = 서브.SyncDB.매개변수 추가("접수됨", 1,"마스터로부터 받은 유닛");
66 슬롯 나라매개변수수요 = 서브.SyncDB.매개변수 추가("수요", 1,"확률론적 수요");
67수비.인스턴스화("LP를 사용하는 하위 문제 최대 zsub", 선택,신규 GAMSModifier(수신),신규 GAMSModifier(요구));
68
69선택.폐기();
70
71 더블하한 =더블.NegativeInfinity, 상한 =더블.PositiveInfinity, objmaster =더블.PositiveInfinity;
72 intiter = 1;
73 할 것
74{
75Console.WriteLine("반복: "+ iter);
76 // 해결 마스터
77 if(1 == 반복)// 첫 번째 반복의 세타 수정
78thetaFix.AddRecord().= 0;
79 그밖에
80thetaFix.Clear();
81
83Console.WriteLine(" 스승님 "+ 마스터리.모델상태 + " : obj="+ 마스터리.SyncDB.GetVariable("z마스터").첫 번째 레코드().레벨);
84 if(1 < 반복)
85상한 = 마스터리.SyncDB.GetVariable("z마스터").첫 번째 레코드().레벨;
86objmaster = 마스터리.SyncDB.GetVariable("z마스터").첫 번째 레코드().레벨- 세타.첫 번째 레코드().레벨;
87
88 // 마스터로부터 세트를 받았습니다
89수신.지우기();
90 foreach (GAMSVariableRecordrinmasteri.SyncDB.GetVariable("접수됨"))
91{
92접수되었습니다.AddRecord(r.키).=r.레벨;
93cutcoeff.AddRecord(iter.ToString(), r.Key(0));
94}
95
96cutconst.AddRecord(iter.ToString());
97 더블objsub = 0.0;
98 // 벤더 컷: theta <= sum(s, pi(s)*v^T(s)(b-A1*x)) v는 하위 문제의 이중 솔루션이고, A1은 첫 번째 단계 제약 행렬입니다.
99 foreach (GAMSSetRecordsin데이터.아웃DB.GetSet("들"))
100{
101수요.지우기();
102 foreach (GAMSSetRecordj데이터.아웃DB.GetSet("j"))
103수요.AddRecord(j.Keys).= 시나리오데이터.기록 찾기(s.Key(0), j.Key(0)).;
104
106Console.WriteLine(" 하위 "+ 하위.모델상태 + " : obj="+ 하위.SyncDB.GetVariable("zsub").첫 번째 레코드().레벨);
107
108
109 더블확률 = 시나리오데이터.기록 찾기(s.키(0),"문제").;
110objsub += 확률 * subi.SyncDB.GetVariable("zsub").첫번째 기록().레벨;
111 foreach (GAMSSetRecordj데이터.아웃DB.GetSet("j"))
112{
113cutconst.기록 찾기(iter.ToString()).+= 확률 * 하위.SyncDB.GetEquation("시장").기록 찾기(j.Keys).한계* 수요.기록 찾기(j.Keys).;
114cutcoeff.기록 찾기(iter.ToString(), j.Key(0)).+= 확률 * 하위.SyncDB.GetEquation("판매 중").기록 찾기(j.Keys).한계;
115}
116}
117하한값 = Math.Max(하한값, objmaster + objsub);
118iter++;
119 if(iter == 맥시터 + 1)
120 던지기 신규예외("반복에서 벤더");
121
122Console.WriteLine(" 하한값: "+ 하한 +" 상한: "+ 상한 +" 객체 마스터: "+ objmaster);
123}그동안((상한 - 하한) >= 0.001 * (1 + Math.Abs(상한)));
124
125masteri.폐기();
126수비.폐기();
127}
128
129 정적문자열 GetDataText()
130{
131문자열 모델 =@"
132세트
133i 공장 /f1*f3/
134j 유통 센터 /d1*d5/
135
136매개변수
137capacity(i) 공장의 단위 용량
138/f1 500, f2 450, f3 650/
139demand(j) 유통 센터의 단위 수요
140/d1 160, d2 120, d3 270, d4 325, d5 700 /
141생산비용 단위 생산비용 /14/
142가격 판매가 /24/
143과잉 재고 제거에 따른 낭비 비용 /4/
144
145테이블 운송 비용(i,j) 단위 운송 비용
146d1 d2 d3 d4 d5
147f1 2.49 5.21 3.76 4.85 2.07
148f2 1.46 2.54 1.83 1.86 4.76
149f3 3.26 3.08 2.60 3.76 4.45;
150
151$ifthen useBig를 설정하지 않음
152설정
153의 시나리오 /lo,mid,hi/
154
155테이블 ScenarioData(s,*) 수요에 대한 가능한 결과 + 확률
156d1 d2 d3 d4 d5 문제
157lo 150 100 250 300 600 0.25
158중간 160 120 270 325 700 0.50
159안녕하세요 170 135 300 350 800 0.25;
160$else
161$nrScen이 설정되지 않은 경우 $set nrScen 10
162s 시나리오 설정 /s1*s%nrScen%/;
163매개변수 ScenarioData(s,*) 수요에 대한 가능한 결과와 확률;
164옵션 시드=1234;
165ScenarioData(s,'prob') = 1/카드;
166ScenarioData(s,j) = 수요(j)*uniform(0.6,1.4);
167$endif
168";
169
170 반환모델;
171}
172
173 정적문자열 GetMasterText()
174{
175문자열 모델 =@"
176세트
177나는 공장
178j 유통 센터
179
180매개변수
181capacity(i) 공장의 단위 용량
182생산비용 단위 생산비용
183transcost(i,j) 단위 운송 비용
184
185$데이터가 설정되지 않은 경우 $abort '데이터가 설정되지 않음'
186$gdxin %datain%
187$load i j 용량 생산 비용 거래 비용
188
189* 벤더 마스터 문제
190$maxiter가 설정되지 않은 경우 $set maxiter 25
191설정
192iter max 벤더 반복 /1*%maxiter%/
193
194매개변수
195최적 컷의 cutconst(iter) 상수
196최적 컷의 cutcoeff(iter,j) 계수
197
198변수
199배송(i,j) 배송
200제품(i) 생산
201수신(j) 수량을 시장으로 보냈습니다.
202마스터 문제의 zmaster 목적 변수
203세타 미래 이익
204양수 변수 배송;
205
206수식
207masterobj 마스터 목적 함수
208production(i) 각 공장의 생산량을 계산
209receive(j) 시장에 보낼 수량을 계산
210optcut(iter) 벤더 최적성 감소;
211
212masterobj..
213zmaster =e= theta -sum((i,j), transcost(i,j)*ship(i,j))
214- 합계(i,prodcost*product(i));
215
216receive(j).. received(j) =e= sum(i, ship(i,j));
217
218생산(i).. 제품(i) =e= 합계(j, 배송(i,j));
219product.up(i) = 용량(i);
220
221optcut(iter).. theta =l= cutconst(iter) +
222sum(j, cutcoeff(iter,j)*수신(j));
223
224모델 마스터문제 /all/;
225
226* 비구속적 컷으로 초기화
227cutconst(iter) = 1e15;
228cutcoeff(iter,j) = eps;
229";
230
231 반환모델;
232}
233
234 정적문자열 GetSubText()
235{
236문자열 모델 =@"
237세트
238나는 공장
239j 유통 센터
240
241매개변수
242수요(j) 유통 센터의 단위 수요
243가격 판매 가격
244과잉 재고 제품 제거에 따른 낭비 비용
245received(j) 수신된 1단계 결정 단위
246
247$데이터가 설정되지 않은 경우 $abort '데이터가 설정되지 않음'
248$gdxin %datain%
249$load i j 수요 가격 낭비 비용
250
251* 벤더스의 하위 문제
252
253변수
254sales(j) 매출(실제 판매)
255폐기물(j) 재고가 과잉된 제품
256하위 문제의 zsub 목적 변수
257긍정변수 매출, 낭비
258
259수식
260subobj 하위 문제 목적 함수
261판매(j) 받은 것 중 일부가 판매되었습니다.
262market(j) 매출 상한
263;
264
265하위 개체..
266zsub =e= sum(j, 가격*판매(j)) - sum(j, wastecost*waste(j));
267
268판매(j)..판매(j) + 낭비(j) =e= 받음(j);
269
270시장(j).. 판매(j) =l= 수요(j);
271
272모델 하위 문제 /subobj,판매,시장/;
273
274* 초기화 수신됨
275수신(j) = 수요(j);
276";
277
278 반환모델;
279}
280
281}
282}
이 예는 간단한 Benders 분해 방법의 순차적 구현을 보여줍니다 ...
GAMSModelInstance AddModelInstance(string modelInstanceName=null)
GAMSVariable GetVariable(문자열 변수 식별자)
GAMSParameter GetParameter(문자열 매개변수 식별자)
GAMSSet GetSet(문자열 setIdentifier)
GAMSVariable AddVariable(문자열 식별자, 정수 차원, VarType varType, 문자열 설명텍스트="")
GAMSequation GetEquation(문자열 방정식 식별자)
GAMSParameter AddParameter(문자열 식별자, 정수 차원, 문자열 설명텍스트="")
새 GAMSEquationRecord FindRecord(params 문자열[] 키)
슬롯 나라데이터베이스 OutDB
void Run(GAMSOptions gamsOptions=null, GAMSCheckpoint 체크포인트=null, TextWriter 출력=null, Boolean createOutDB=true)
슬롯 나라데이터베이스 SyncDB
void Solve(SymbolUpdateType 업데이트 유형=SymbolUpdateType.BaseCase, TextWriter 출력=null, GAMSModelInstanceOpt miOpt=null)
void 인스턴스화(문자열 모델 정의, params GAMSModifier[] 수정자)
사전< 문자열, 문자열 > 정의
새 GAMSParameterRecord FindRecord(params 문자열[] 키)
새 GAMSParameterRecord AddRecord(params 문자열[] 키)
새 GAMSVariableRecord FirstRecord()
GAMSJob AddJobFromString(문자열 gamsSource, GAMSCheckpoint 체크포인트=null, 문자열 jobName=null)
GAMSCheckpoint AddCheckpoint(string checkpointName=null)
GAMSOptions AddOptions(GAMSOptions optFrom=null)
업데이트작업