로드 중...
검색 중...
일치하는 항목 없음
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변수("zmaster").getFirstRecord().getLevel());
104 if(1 < 반복)
105상한 = 마스터리.SyncDB().getVariable("zmaster").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: "+ objmaster);
145}그동안((상한 - 하한) >= 0.001 * (1 + Math.abs(상한)));
146
147masteri.처분();
148수비.처분();
149}
150
151 정적문자열 데이터 ="세트 \n"+
152 "i 공장 /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 "$$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(문자열 식별자)
슬롯 사이트 추천데이터베이스 OutDB()
슬롯 사이트 추천데이터베이스 SyncDB()
void instantiate(String modelDefinition, GAMSModifier ... modifiers)
void 정의(String defStr, String asStr)
이 예는 간단한 Benders 분해 방법의 순차적 구현을 보여줍니다 ...