로드 중...
검색 중...
일치하는 항목 없음
Benders2Stage.java
1패키지com.슬롯 게임examples.benders;
2
3가져오기java.io.파일;
4
8가져오기 com.게임.API.GAMSJob;
10가져오기 com.감스.API.GAMSModifier;
14가져오기 com.감스.API.GAMSSetRecord;
16가져오기 com.감스.API.GAMSVariableRecord;
18가져오기 com.게임.API.GAMSWorkspaceInfo;
19
35공개 클래스벤더스2스테이지{
36
37 공개 정적 공허메인(문자열[] 인수)
39 if(args.length > 0)
40wsInfo.setSystemDirectory( 인수[0] );
41
42파일 WorkingDirectory =신규파일(System.getProperty("user.dir"), "Benders2Stage");
43workingDirectory.mkdir();
44wsInfo.setWorkingDirectory(workingDirectory.getAbsolutePath());
45
47
48 GAMSJobdataJob = ws.addJobFromString(데이터);
49
50GAMSOptions optData = ws.추가옵션();
51optData.정의("useBig", "1");
52optData.defines("nrScen", "100");
53
54dataJob.실행(optData);
55
56optData.dispose();
57
58 슬롯 게임매개변수scenarioData = dataJob.아웃DB().getParameter("시나리오데이터");
59
60GAMSOptions opt = ws.추가옵션();
61선택.정의("데이터인", dataJob.아웃DB().getName());
62 int맥시터 = 40;
63opt.defines("맥시터", Integer.toString(maxiter));
64opt.setAllModelTypes("복합체");
65
68
69ws.addJobFromString(마스터모델).실행(선택, cpMaster, dataJob.아웃DB());
70
71 GAMSModelInstancemasteri = cpMaster.addModelInstance();
72 슬롯 게임매개변수cutconst = masteri.SyncDB().addParameter("cutconst", 1,"벤더 최적성 컷 상수");
73 슬롯 게임매개변수cutcoeff = masteri.SyncDB().addParameter("cutcoeff", 2,"벤더 최적성 계수");
74 슬롯 게임변수세타 = 마스터리.SyncDB().추가변수("세타", 0, GAMSGlobals.VarType.FREE,"미래 이익 함수 변수");
75 슬롯 게임매개변수thetaFix = masteri.SyncDB().addParameter("thetaFix", 0,"");
76masteri.인스턴스화("lp를 사용하는 masterproblem max zmaster", 선택,
77 신규 GAMSModifier[] {신규 GAMSModifier(cutconst),신규 GAMSModifier(cutcoeff),신규 GAMSModifier(theta,GAMSGlobals.UpdateAction.FIXED,thetaFix)
78);
79
80ws.addJobFromString(하위모델).실행(선택, cpSub, dataJob.아웃DB());
81
83 슬롯 게임매개변수수신 = 서브.SyncDB().addParameter("접수됨", 1,"마스터로부터 받은 단위");
84 슬롯 게임매개변수수요 = 수비.SyncDB().addParameter("수요", 1,"확률적 수요");
85수비.인스턴스화("LP를 사용하는 하위 문제 최대 zsub", 선택,
86 신규 GAMSModifier[] {신규 GAMSModifier(수신),신규 GAMSModifier(요구)
87);
88
89opt.dispose();
90
91 더블하한 = Double.NEGATIVE_INFINITY, 상한 = Double.POSITIVE_INFINITY, objmaster = Double.POSITIVE_INFINITY;
92 intiter = 1;
93 {
94System.out.println("반복: "+ iter);
95 // 해결 마스터
96 if(1 == 반복)// 첫 번째 반복의 세타 수정
97thetaFix.addRecord().setValue( 0 );
98 그밖에
99thetaFix.clear();
100
102
103System.out.println(" 스승님 "+ 마스터리.getModelStatus() +" : obj="+ 마스터리.SyncDB().get변수("z마스터").getFirstRecord().getLevel());
104 if(1 < 반복)
105상한 = 마스터리.SyncDB().get변수("z마스터").getFirstRecord().getLevel();
106objmaster = 마스터리.SyncDB().get변수("z마스터").getFirstRecord().getLevel() - theta.getFirstRecord().getLevel();
107
108 // 마스터로부터 세트를 받았습니다
109received.clear();
110 for (GAMSVariableRecordr : 마스터리.SyncDB().get변수("수신됨")) {
111received.addRecord( r.getKeys()).setValue( r.getLevel() );
112cutcoeff.addRecord(신규String[] Integer.toString(iter), r.getKey(0) );
113}
114
115cutconst.addRecord(Integer.toString(iter));
116 더블objsub = 0.0;
117 for(GAMSSetRecords : dataJob.아웃DB().getSet("들")) {
118demand.clear();
119 for(GAMSSetRecordj : dataJob.아웃DB().getSet("j")) {
120demand.addRecord(j.getKeys()).setValue( 시나리오Data.findRecord(신규문자열[] s.getKey(0), j.getKey(0)).getValue() );
121}
122
124System.out.println(" 하위 "+ 하위.getModelStatus() +" : obj="+ 하위.SyncDB().get변수("zsub").getFirstRecord().getLevel());
125
126 더블확률 = 시나리오Data.findRecord(신규문자열[] s.getKey(0),"문제").getValue();
127objsub += 확률 * subi.SyncDB().get변수("zsub").getFirstRecord().getLevel();
128 for (GAMSSetRecordj : dataJob.아웃DB().getSet("j")) {
129 GAMSParameterRecordrecord = cutconst.findRecord(Integer.toString(iter));
130 더블newValue = 기록.getValue() + 확률 * 하위.SyncDB().getEquation("시장").findRecord(j.getKeys()).getMarginal() *demand.findRecord(j.getKeys()).getValue();
131기록.세트값( newValue );
132기록 = cutcoeff.findRecord(신규문자열[] Integer.toString(iter), j.getKey(0));
133newValue = 기록.getValue() + 확률 * 하위.SyncDB().getEquation("판매 중").findRecord(j.getKeys()).getMarginal();
134기록.세트값( newValue );
135}
136}
137
138하한 = Math.max(하한, objmaster + objsub);
139
140iter++;
141 if(iter == 맥시터 + 1)
142 던지기 신규 슬롯 게임예외("반복에서 벤더");
143
144System.out.println(" 하한값: "+ 하한 +" 상한: "+ 상한 +" 객체 마스터: "+ objmaster);
145}그동안((상한 - 하한) >= 0.001 * (1 + Math.abs(상한)));
146
147masteri.처분();
148수비.처분();
149}
150
151 정적문자열 데이터 ="세트 \n"+
152 "나는 공장 /f1*f3/ \n"+
153 "j 유통 센터 /d1*d5/ \n"+
154 " \n"+
155 "매개변수 \n"+
156 "capacity(i) 공장의 단위 용량 \n"+
157 " /f1 500, f2 450, f3 650/ \n"+
158 "demand(j) 유통 센터의 단위 수요 \n"+
159 " /d1 160, d2 120, d3 270, d4 325, d5 700 / \n"+
160 "생산 비용 단위 생산 비용 /14/ \n"+
161 "가격 판매 가격 /24/ \n"+
162 "과잉 재고 제품 제거에 따른 낭비 비용 /4/ \n"+
163 " \n"+
164 "테이블 운송 비용(i,j) 단위 운송 비용 \n"+
165 " d1 d2 d3 d4 d5 \n"+
166 " f1 2.49 5.21 3.76 4.85 2.07 \n"+
167 " f2 1.46 2.54 1.83 1.86 4.76 \n"+
168 " f3 3.26 3.08 2.60 3.76 4.45; \n"+
169 " \n"+
170 "$ifthen useBig를 설정하지 않았습니다 \n"+
171 "\n 설정"+
172 " 시나리오 /lo,mid,hi/ \n"+
173 " \n"+
174 "수요와 확률에 대한 테이블 시나리오 데이터(들,*) 가능한 결과 \n"+
175 " d1 d2 d3 d4 d5 문제 \n"+
176 " lo 150 100 250 300 600 0.25 \n"+
177 " 중간 160 120 270 325 700 0.50 \n"+
178 " 안녕하세요 170 135 300 350 800 0.25; \n"+
179 "$else \n"+
180 "$nrScen을 설정하지 않은 경우 $set nrScen 10 \n"+
181 "s 시나리오 설정 /s1*s%nrScen%/;\n"+
182 "수요와 확률에 대한 매개변수 ScenarioData(s,*) 가능한 결과;\n"+
183 "옵션 시드=1234; \n"+
184 "ScenarioData(s,'prob') = 1/카드; \n"+
185 "시나리오데이터(s,j) = 수요(j)*균일(0.6,1.4); \n"+
186 "$endif \n"+
187 " \n";
188
189 정적문자열 masterModel ="\n 세트"+
190 "나는 공장 \n"+
191 "j 유통 센터 \n"+
192 " \n"+
193 "매개변수 \n"+
194 " 용량(i) 공장의 단위 용량 \n"+
195 " 생산 비용 단위 생산 비용 \n"+
196 " 운송 비용(i,j) 단위 운송 비용 \n"+
197 " \n"+
198 "$$abort에 데이터가 설정되지 않은 경우 '데이터가 설정되지 않음' \n"+
199 "$gdxin %datain% \n"+
200 "$load i j 용량 생산 비용 거래 비용 \n"+
201 " \n"+
202 "* 벤더 마스터 문제 \n"+
203 "$if maxiter $set maxiter 25 \n"+
204 "\n설정"+
205 " iter max 벤더 반복 /1*%maxiter%/ \n"+
206 " \n"+
207 "매개변수 \n"+
208 " 최적 컷의 cutconst(iter) 상수 \n"+
209 " 최적 컷의 cutcoeff(iter,j) 계수 \n"+
210 " \n"+
211 "변수 \n"+
212 " 선박(i,j) 배송 \n"+
213 " 제품(i) 생산 \n"+
214 " 수령(j) 수량을 시장으로 보냈습니다 \n"+
215 " 마스터 문제의 zmaster 목적 변수 \n"+
216 " 세타 미래 이익 \n"+
217 "양수 변수 제공; \n"+
218 " \n"+
219 "방정식 \n"+
220 " masterobj 마스터 목적 함수 \n"+
221 " 생산량(i) 각 공장의 생산량 계산 \n"+
222 " receive(j) 시장에 보낼 수량을 계산합니다 \n"+
223 " optcut(iter) 벤더 최적성 감소; \n"+
224 " \n"+
225 "masterobj..\n"+
226 " zmaster =e= theta -sum((i,j), transcost(i,j)*ship(i,j)) \n"+
227 " - 합계(i,prodcost*제품(i)); \n"+
228 " \n"+
229 "수신(j).. 수신(j) =e= 합계(i, 선박(i,j)); \n"+
230 " \n"+
231 "생산(i).. 제품(i) =e= 합계(j, 선박(i,j)); \n"+
232 "product.up(i) = 용량(i); \n"+
233 " \n"+
234 "optcut(iter).. theta =l= cutconst(iter) + \n"+
235 " sum(j, cutcoeff(iter,j)*수신(j)); \n"+
236 " \n"+
237 "모델 마스터문제 /all/; \n"+
238 " \n"+
239 "* 컷을 비바인딩으로 초기화 \n"+
240 "cutconst(iter) = 1e15; \n"+
241 "cutcoeff(iter,j) = eps; \n"+
242 " \n";
243
244 정적문자열 하위 모델 ="\n 세트"+
245 "나는 공장 \n"+
246 " j 유통 센터 \n"+
247 " \n"+
248 "매개변수 \n"+
249 " 수요(j) 유통 센터의 단위 수요 \n"+
250 " 가격 판매 가격 \n"+
251 " 과잉 재고 제품 제거에 따른 낭비 비용 \n"+
252 " 수신됨(j) 1단계 결정 단위 수신됨 \n"+
253 " \n"+
254 "$if 데이터가 $abort에 설정되지 않은 경우 '데이터가 설정되지 않음' \n"+
255 "$gdxin %datain% \n"+
256 "$load i j 수요 가격 낭비 비용 \n"+
257 " \n"+
258 "* 벤더스의 하위 문제 \n"+
259 " \n"+
260 "변수 \n"+
261 " 판매(j) 판매(실제 판매) \n"+
262 " 폐기물(j) 재고가 과잉된 제품 \n"+
263 " 하위 문제의 zsub 목적 변수 \n"+
264 "긍정변수 매출, 낭비 \n"+
265 " \n"+
266 "방정식 \n"+
267 " subobj 하위 문제 목적 함수 \n"+
268 " 판매(j) 받은 부분이 판매되었습니다 \n"+
269 " 시장(j) 매출 상한선 \n"+
270 "; \n"+
271 " \n"+
272 "하위 개체..\n"+
273 " zsub =e= sum(j, 가격*판매(j)) - sum(j, wastecost*waste(j)); \n"+
274 " \n"+
275 "판매(j).. 판매(j) + 폐기물(j) =e= 수령(j); \n"+
276 " \n"+
277 "시장(j).. 판매(j) =l= 수요(j); \n"+
278 " \n"+
279 "모델 하위 문제 /subobj,판매,시장/; \n"+
280 " \n"+
281 "* 초기화 수신됨 \n"+
282 "수신(j) = 수요(j); \n"+
283 " \n";
284}
GAMSVariable addVariable(문자열 식별자, int 차원, GAMSGlobals.VarType varType)
GAMSParameter getParameter(문자열 식별자)
GAMSEquation getEquation(문자열 식별자)
GAMSParameter addParameter(문자열 식별자, 정수 차원)
GAMSVariable getVariable(문자열 식별자)
GAMSSet getSet(문자열 식별자)
슬롯 게임데이터베이스 OutDB()
슬롯 게임데이터베이스 SyncDB()
void instantiate(String modelDefinition, GAMSModifier ... modifiers)
void 정의(String defStr, String asStr)
void setSystemDirectory(문자열 디렉토리)
void setWorkingDirectory(문자열 디렉터리)
GAMSJob addJobFromString(문자열 소스)
이 예는 간단한 Benders 분해 방법의 순차적 구현을 보여줍니다 ...