로드 중...
검색 중...
일치하는 항목 없음
TransportEngine.java
1패키지com.메가 슬롯examples.transport;
2
3가져오기java.io.*;
4가져오기java.nio.file.*;
5가져오기java.util.*;
6가져오기java.nio.charset.*;
7
8가져오기 com.게임.API.*;
9
19공개 클래스운송엔진{
20
21 공개 정적 무효main(String[] args)
23 // 명령줄 인수에서 작업공간 정보 확인
24 if(args.length > 0)
25wsInfo.setSystemDirectory( 인수[0] );
26 // 현재 작업 디렉토리 아래에 "TransportEngine"이라는 이름의 작업 디렉토리를 생성
27파일 WorkingDirectory =신규파일(System.getProperty("user.dir"), "운송엔진");
28workingDirectory.mkdir();
29wsInfo.setWorkingDirectory(workingDirectory.getAbsolutePath());
30 // 사용자가 지정한 시스템 디렉터리로 GAMSWorkspace "ws"를 생성
32
33문자열 엔진_url = System.getenv("엔진_URL");
34 if(engine_url ==) {
35System.out.println("오류: 환경 변수 ENGINE_URL이 설정되지 않았습니다");
36System.exit(-1);
37}
38문자열 엔진_user = System.getenv("엔진_사용자");
39 if(engine_user ==) {
40System.out.println("오류: 환경 변수 ENGINE_USER가 설정되지 않았습니다");
41System.exit(-1);
42}
43문자열 엔진_비밀번호 = System.getenv("엔진_비밀번호");
44 if(engine_password ==) {
45System.out.println("오류: 환경 변수 ENGINE_PASSWORD가 설정되지 않았습니다");
46System.exit(-1);
47}
48문자열 Engine_namespace = System.getenv("ENGINE_NAMESPACE");
49 if(engine_namespace ==) {
50System.out.println("오류: 환경 변수 ENGINE_NAMESPACE가 설정되지 않았습니다");
51System.exit(-1);
52}
53
54 // 메가 슬롯 엔진의 모든 작업에 필요한 구성 설정
56엔진_URL,
57엔진_사용자,
58엔진_비밀번호,
59 "",
60engine_namespace
61);
62 // 엔진 작업 실행
63runEngineJob(ws, 엔진_configuration);
64
65 // 엔진 작업 실행 및 중단
66runAndInterruptEngineJob(ws, 엔진_configuration);
67
68 // 종료
69System.exit(0);
70}
71
72 /* 엔진 작업 실행 방법 예시 */
73 정적 공허runEngineJob(메가 슬롯작업공간ws,GAMSEngineConfiguration엔진_구성)
74 /* GDX 파일로 명시적으로 내보내기와 함께 메가 슬롯 구문을 사용하여 문자열의 데이터로 실행 */
75 GAMSJobtEdata = ws.addJobFromString(데이터);
76 시도해 보세요{
77System.out.println("문자열에서 데이터 실행 중");
79.setRunEngineConfiguration(engine_configuration)
80.setOutput( System.out )
81.build()
82);
83}잡기 (메가 슬롯예외e)
84System.out.println("오류: "+ 전자.getMessage());
85System.exit(-1);
86}
88tEDataDB.내보내기("tdata.gdx");
89
90Map<String, Double> ExpectLevels =신규HashMap<String, Double>();
91{
92expectedLevels.put("seattle.new-york", Double.valueOf(0.0));
93예상레벨.put("seattle.chicago", Double.valueOf(300.0));
94예상레벨.put("seattle.topeka", Double.valueOf(0.0));
95예상레벨.put("san-diego.new-york", Double.valueOf(325.0));
96expectedLevels.put("san-diego.chicago", Double.valueOf(0.0));
97expectedLevels.put("san-diego.topeka", Double.valueOf(275.0));
98}
99
100 /* 데이터 포함 파일을 정의하는 GAMSOptions 인스턴스를 사용하여 작업 실행 */
101 GAMSJobtEmodel = ws.addJobFromString(모델);
103선택.정의("gdxincname", "tdata");
104선택.setAllModelTypes("익스프레스");
105 시도해 보세요{
106System.out.println("데이터 포함 파일을 정의하는 GAMSOptions 인스턴스를 사용하여 실행 중입니다.");
108.setRunEngineConfiguration(engine_configuration)
109.setGAMSOptions( 선택 )
110 .setExtraModelFiles( 신규HashSet<String>(Arrays.asList("tdata.gdx")) )
111 .setEngineOptions( 신규HashMap<문자열, 문자열>()
112넣어("inex_string", "\"유형\": \"포함\", \"파일\": [\"*.gdx\"]"); }
113})
114.build()
115);
116
117System.out.println("데이터 포함 파일을 정의하는 GAMSOptions 인스턴스를 사용하여 모델을 실행했습니다:");
118 for (GAMSVariableRecordrec : tEmodel.아웃DB().get변수("x")) {
119System.out.print("x("+ rec.getKey(0) +", "+ rec.getKey(1) +"):");
120System.out.print(", 레벨 = "+ rec.getLevel());
121System.out.println(", 한계 = "+ rec.getMarginal());
122 더블diff = 예상레벨.get(rec.getKey(0)+"."+rec.getKey(1)).doubleValue() - rec.getLevel();
123 if(Math.abs(diff) > 0.01)
124System.out.println("예상치 못한 결과, 예상 수준: "+expectedLevels.get(rec.getKey(0)+"."+rec.getKey(1)));
125System.exit(-1);
126}
127}
128}잡기 (메가 슬롯예외e)
129System.out.println("오류: "+ 전자.getMessage());
130System.exit(-1);
131}
132
133 /* 동일하지만 암시적 데이터베이스 통신이 있음 */
134 GAMSJobtEa = ws.addJobFromString(데이터);
135 시도{
136System.out.println("문자열에서 데이터를 실행 중입니다.");
138.setRunEngineConfiguration(engine_configuration)
139.setOutput( System.out )
140.build()
141);
142}잡기 (메가 슬롯예외e)
143System.out.println("오류: "+ 전자.getMessage());
144System.exit(-1);
145}
146
147 GAMSJobtEb = ws.addJobFromString(모델);
148
151옵션.정의("gdxincname", tEa.아웃DB().getName());
152옵션.setAllModelTypes("익스프레스");
153
154 시도해 보세요{
155System.out.println("체크포인트 암시적 데이터베이스 통신을 사용하여 문자열에서 모델을 실행 중입니다.");
157.setRunEngineConfiguration(engine_configuration)
158.setGAMSOptions( 옵션 )
159.setGAMSCheckpoint(cp )
160.setDatabases(신규ArrayList<GAMSDatabase>(Arrays.asList(tEa.아웃DB())) )
161.setOutput( System.out )
162.build()
163);
164System.out.println("체크포인트 암시적 데이터베이스 통신을 사용하여 문자열에서 모델을 실행했습니다:");
165 for (GAMSVariableRecordrec : tEb.아웃DB().get변수("x")) {
166System.out.print("x("+ rec.getKey(0) +", "+ rec.getKey(1) +"):");
167System.out.print(", 레벨 = "+ rec.getLevel());
168System.out.println(", 한계 = "+ rec.getMarginal());
169 더블diff = 예상레벨.get(rec.getKey(0)+"."+rec.getKey(1)).doubleValue() - rec.getLevel();
170 if(Math.abs(diff) > 0.01)
171System.out.println("예상치 못한 결과, 예상 수준: "+expectedLevels.get(rec.getKey(0)+"."+rec.getKey(1)));
172System.exit(-1);
173}
174}
175}잡기 (메가 슬롯예외e)
176System.out.println("오류: "+ 전자.getMessage());
177System.exit(-1);
178}
179
180목록<HashMap<String, Double>> bmultExpected =신규ArrayList<HashMap<String, Double>>();
181bmultExpected.add(신규HashMap<String, Double>()
182넣어("bmult", Double.valueOf(0.9) );
183put("ms", Double.valueOf(1) );
184put("ss", Double.valueOf(1) );
185put("obj", Double.valueOf(138.31) );
186}
187} );
188bmultExpected.add(신규HashMap<String, Double>()
189넣어("bmult", Double.valueOf(1.2) );
190put("ms", Double.valueOf(4) );
191put("ss", Double.valueOf(1) );
192put("obj", Double.valueOf(184.41) );
193}
194} );
195
196 for(HashMap<String, Double> m : bmultExpected)
197문자열 bmultmodel ="bmult="+m.get("bmult")+"; lp를 사용하여 전송 최소 z 해결; ms=transport.modelstat; ss=transport.solvestat;";
198 GAMSJobtEbmult = ws.addJobFromString( bmultmodel, cp );
199 시도해 보세요{
200System.out.println("bmult를 사용하여 문자열에서 모델 실행="+m.get("bmult"));
202.setRunEngineConfiguration(engine_configuration)
203.setOutput( System.out )
204.build()
205);
206
207System.out.println("bumult를 사용하여 문자열에서 모델을 실행했습니다="+ m.get("bmult").doubleValue() +":");
208System.out.println(" 모델 상태: "+ tEbmult.아웃DB().getParameter("ms").getFirstRecord().getValue());
209System.out.println(" 해결 상태: "+ tEbmult.아웃DB().getParameter("ss").getFirstRecord().getValue());
210System.out.println(" 개체: "+ tEbmult.아웃DB().get변수("z").getFirstRecord().getLevel());
211 더블diff = tEbmult.아웃DB().getParameter("bmult").getFirstRecord().getValue() - m.get("bmult").doubleValue();
212 if(Math.abs(diff) > 0.01)
213System.out.println("예상치 못한 결과, 예상되는 bmult: "+m.get("bmult").doubleValue());
214System.exit(-1);
215}
216diff = tEbmult.아웃DB().getParameter("ms").getFirstRecord().getValue() - m.get("ms").doubleValue();
217 if(Math.abs(diff) > 0.01)
218System.out.println("예상치 못한 결과, 예상 ms: "+m.get("ms").doubleValue());
219System.exit(-1);
220}
221diff = tEbmult.아웃DB().getParameter("ss").getFirstRecord().getValue() - m.get("ss").doubleValue();
222 if(Math.abs(diff) > 0.01)
223System.out.println("예상치 못한 결과, 예상된 ss: "+m.get("ss").doubleValue());
224System.exit(-1);
225}
226diff = tEbmult.아웃DB().get변수("z").getFirstRecord().getLevel() - m.get("obj").doubleValue();
227 if(Math.abs(diff) > 0.01)
228System.out.println("예상치 못한 결과, 예상된 객체: "+m.get("obj").doubleValue());
229System.exit(-1);
230}
231
232}잡기 (메가 슬롯예외e)
233System.out.println("오류: "+ 전자.getMessage());
234System.exit(-1);
235}
236
237}
238
239 // 옵션 및 데이터베이스 삭제
240opt.dispose();
241옵션.처분();
242
243tEDataDB.dispose();
244}
245
247 정적 무효runAndInterruptEngineJob(메가 슬롯작업공간ws,GAMSEngineConfiguration엔진_구성)
248 최종 GAMSJob직업 = ws.addJobFromGamsLib("입은");
249 최종 메가 슬롯옵션opt = ws.추가옵션();
250선택.setMIP("복합체");
251선택.setOptFile(1);
252선택.setSolveLink(메가 슬롯옵션.ESolveLink.LoadLibrary);
253
254 시도해 보세요{
255파일 로그파일 = Paths.get(ws.workingDirectory(), "jclad.log").toFile();
256 부울fileCreated = logFile.createNewFile();
257
258파일 옵션File_1 = Paths.get(ws.workingDirectory(), "cplex.opt").toFile();
259FileWriter fw =신규파일 작성기(optionFile_1);
260fw.write("epgap 0\n");// 처음에는 상대 중지 허용 오차를 0으로 설정
261fw.write("대화형 1\n");// 인터럽트 시 대화형 옵션 설정 활성화
262fw.write("iafile cplex.op2\n");// 인터럽트 시 읽을 새 옵션 파일 정의
263fw.close();
264
265파일 옵션File_2 = Paths.get(ws.workingDirectory(), "cplex.op2").toFile();
266fw =신규파일 작성기(optionFile_2);
267fw.write("epgap 0.1\n");// 상대 중지 허용 오차를 0.1로 설정
268fw.close();
269
270HashSet<String> extraModelFiles =신규HashSet<문자열>(
271Arrays.asList(optionFile_1.getAbsolutePath(), optionFile_2.getAbsolutePath(),"claddat.gdx")
272);
273 최종근로자 w =신규작업자(작업, 엔진_구성, opt, extraModelFiles,신규PrintStream(로그파일));
274w.start();
275
276 그동안 () {
277 if(logFile.exists() && logFile.length()==0)
278 시도해 보세요{
279Thread.currentThread();
280Thread.sleep(500);
281}잡기( 예외 e )
282e.printStackTrace();
283}
284 계속;
285}
286
287 // 작업이 아직 종료되지 않은 경우에만 실행 중인 GAMSJob에 인터럽트 신호를 보냅니다.
288 부울중단됨 =거짓;
289 부울종료됨 = (w.getState()==Thread.State.TERMINATED);
290 if(!종료됨)
291System.out.println("인터럽트 메가 슬롯 작업을 보내는 중...");
292중단됨 = 작업.인터럽트();
293}
294System.out.println("새 옵션을 계속하기 위해 Cplex가 중단되었습니다.");
295 휴식;
296}
297
298 if(w.isAlive())
299 시도해 보세요{
300w.join();
301}잡기(InterruptedException e) e.printStackTrace();
302}
303
304 부울중단됨 =거짓;
305
306스캐너 스캔 =신규스캐너(로그파일);
307문자열 검색str ="중단되었습니다...";
308 그동안(scan.hasNext())
309문자열 라인 = scan.nextLine().toLowerCase().toString();
310 if(line.contains(searchstr))
311System.out.println(line);
312중단됨 =;
313 휴식;
314}
315}
316
317 if(!중단됨)
318System.out.println("솔버가 적어도 한 번은 중단될 것으로 예상됩니다.");
319System.exit(-1);
320}
321System.out.println("성공적으로 중단되었습니다");
322
323}잡기(FileNotFoundException e)
324e.printStackTrace();
325}잡기(IOException e)
326e.printStackTrace();
327}
328선택.처분();
329}
330
332 정적 클래스노동자확장스레드
334 GAMSJob직업;
336PrintStream 출력;
337HashSet<String> extraModelFiles;
338
346 공개노동자(GAMSJobjb,GAMSEngineConfigurationcfg,메가 슬롯옵션opt, HashSet<String> modelFiles, PrintStream 출력)
347구성 = cfg;
348직업 = jb;
349옵션 = 선택;
350출력 = 출력;
351extraModelFiles = modelFiles;
352}
353
355@재정의
356 공개 공허실행()
357 시도{
358System.out.println("메가 슬롯 엔진 작업 실행 중...");
360.setRunEngineConfiguration(구성)
361.setGAMSOptions(옵션)
362.setOutput(출력)
363 .setExtraModelFiles( extraModelFiles )
364.build()
365);
366}잡기(예외 e)
367e.printStackTrace();
368System.exit(-1);
369}
370}
371}
372
373 // 데이터
374 정적문자열 데이터 =
375 "세트 \n" +
376 " 나는 식물 통조림 / 시애틀, 샌디에고 / \n" +
377 " j 마켓 / 뉴욕, 시카고, 토피카 / ; \n" +
378 "매개변수 \n" +
379 " \n" +
380 " a(i) 경우에 따라 공장 i의 용량 \n" +
381 " / 시애틀 350 \n" +
382 " 샌디에고 600 / \n" +
383 " \n" +
384 " b(j) 경우의 시장 j 수요 \n" +
385 " / 뉴욕 325 \n" +
386 " 시카고 300 \n" +
387 " 토피카 275 / ; \n" +
388 " \n" +
389 "테이블 d(i,j) 거리(천 마일 단위) \n" +
390 " 뉴욕 시카고 토피카 \n" +
391 " 시애틀 2.5 1.7 1.8 \n" +
392 " 샌디에고 2.5 1.8 1.4 ; \n" +
393 " \n" +
394 "스칼라 f '1,000마일당 케이스당 달러 단위의 화물' / 90 / \n" +
395 " bmult '수요 승수' / 1 /;\n" +
396 " \n";
397
398 // 모델
399 정적문자열 모델 =
400 " 세트 \n"+
401 " 나는 '통조림 식물' \n"+
402 " j '시장'; \n"+
403 " \n"+
404 "매개변수 \n"+
405 " a(i) '경우에 따라 식물 i의 용량' \n"+
406 " b(j) '경우에 따라 시장 j의 수요' \n"+
407 " d(i,j) '거리(천 마일)'; \n"+
408 " \n"+
409 "스칼라 f '1,000마일당 케이스당 달러 단위의 화물'; \n"+
410 "스칼라 bmult '수요 승수'; \n"+
411 " \n"+
412 "$if gdxincname $abort '제공된 데이터 파일에 대한 포함 파일 이름이 설정되지 않았습니다'\n"+
413 "$gdxin %gdxincname% \n"+
414 "$load i j a b d f bmult \n"+
415 "$gdxin \n"+
416 " \n"+
417 "$echo 테스트 > test.txt \n"+
418 " \n"+
419 "매개변수 c(i,j) '케이스당 운송 비용(단위: 수천 달러)'; \n"+
420 " c(i,j) = f * d(i,j) / 1000 ; \n"+
421 " \n"+
422 "변수 \n"+
423 " 케이스의 x(i,j) 배송 수량 \n"+
424 " z 총 운송 비용(수천 달러) ; \n"+
425 " \n"+
426 "양수 변수 x; \n"+
427 " \n"+
428 "방정식 \n"+
429 " 비용 '목적 함수 정의' \n"+
430 " 공급(i) '공장 i의 공급 제한 준수' \n"+
431 " 수요(j) '시장 j의 수요를 충족'; \n"+
432 " \n"+
433 "비용 .. z =e= sum((i,j), c(i,j)*x(i,j)) ; \n"+
434 " \n"+
435 "공급(i) .. 합계(j, x(i,j)) =l= a(i) ; \n"+
436 " \n"+
437 "수요(j) .. sum(i, x(i,j)) =g= bmult*b(j) ; \n"+
438 " \n"+
439 "모델 전송 /all/ ; \n"+
440 " \n"+
441 "z를 최소화하는 lp를 사용하여 전송을 해결합니다; \n"+
442 " \n"+
443 "스칼라 \n"+
444 " ms '모델 상태' \n"+
445 " ss '상태 해결'; \n"+
446 " \n"+
447 "x.l, x.m 표시; \n";
448}
GAMSParameter getParameter(문자열 식별자)
GAMSVariable getVariable(문자열 식별자)
newBuilder setEngineOptions(HashMap< 문자열, 문자열 > 옵션)
newBuilder setExtraModelFiles(Set< String > modelFiles)
void runEngine(GAMSEngineRunParameters 매개변수)
메가 슬롯데이터베이스 OutDB()
void 정의(String defStr, String asStr)
void setAllModelTypes(문자열 값)
void setSolveLink(GAMSOptions.ESolveLink x)
void setSystemDirectory(문자열 디렉토리)
void setWorkingDirectory(문자열 디렉토리)
GAMSJob addJobFromString(문자열 소스)
GAMSJob addJobFromGamsLib(문자열 모델 이름)
이 예는 runEngine 메소드를 사용하여 메가 슬롯 엔진에서 GAMSJob을 실행하는 방법을 보여줍니다(메가 슬롯 44부터):