로드 중...
검색 중...
일치하는 항목 없음
Cutstock.java
1패키지com.슬롯examples.cutstock;
2
3가져오기java.io.파일;
4가져오기java.util.HashMap;
5가져오기java.util.Iterator;
6가져오기java.util.Map;
7가져오기java.util.Map.Entry;
8
11가져오기 com.게임.API.GAMSequationRecord;
12가져오기 com.감스.API.GAMSJob;
13가져오기 com.게임.API.GAMSModelInstance;
14가져오기 com.게임.API.GAMSModifier;
15가져오기 com.게임.API.슬롯옵션;
16가져오기 com.게임.API.슬롯매개변수;
18가져오기 com.감스.API.GAMSSet;
19가져오기 com.감스.API.GAMSSetRecord;
20가져오기 com.게임.API.GAMSVariableRecord;
21가져오기 com.게임.API.슬롯작업공간;
22가져오기 com.게임.API.GAMSWorkspaceInfo;
23
32공개 클래스컷스톡{
33
34 공개 정적 공허메인(문자열[] 인수)
35 // 명령줄 인수에서 작업공간 정보 확인
37 if(args.length > 0)
38wsInfo.setSystemDirectory( 인수[0] );
39 // 디렉토리 생성
40파일 WorkingDirectory =신규파일(System.getProperty("user.dir"), "컷스톡");
41workingDirectory.mkdir();
42wsInfo.setWorkingDirectory(workingDirectory.getAbsolutePath());
43 // 작업공간 생성
44 슬롯작업공간ws =신규 슬롯작업공간(wsInfo);
45
46 // GAMSOptions 인스턴스화 및 매개변수 정의
47GAMSOptions opt = ws.추가옵션();
48 슬롯데이터베이스cutstockData = ws.추가데이터베이스("csdata");
49opt.setAllModelTypes("복합단지");
50opt.setOptCR( 0.0 );// 최적으로 해결
51 int최대 패턴 = 35;
52opt.defines("pmax", String.valueOf(maxpattern));
53opt.defines("solveMasterAs", "RMIP");
54
55 // 입력 데이터 정의
56Map<String, Double> d =신규HashMap<String, Double>();
57{
58d.put("i1", Double.valueOf(97) );
59d.put("i2", Double.valueOf(610) );
60d.put("i3", Double.valueOf(395) );
61d.put("i4", Double.valueOf(211) );
62}
63Map<String, Double> w =신규HashMap<String, Double>();
64{
65w.put("i1", Double.valueOf(45) );
66w.put("i2", Double.valueOf(36) );
67w.put("i3", Double.valueOf(31) );
68w.put("i4", Double.valueOf(14) );
69
70}
71 intr = 100;// 원시 너비
72
73 GAMSSet너비 = cutstockData.추가세트("나", 1,"너비");
74 슬롯매개변수rawWidth = cutstockData.addParameter("r", 0,"원시 너비");
75 슬롯매개변수수요 = cutstockData.addParameter("d", 1,"수요");
76 슬롯매개변수너비 = cutstockData.addParameter("w", 1,"너비");
77
78rawWidth.addRecord().setValue( 100 );
79 for(문자열 i : d.keySet())
80widths.addRecord(i);
81 for(Entry<String, Double> e : d.entrySet())
82demand.addRecord( e.getKey() ).setValue( e.getValue() );
83 for(Entry<String, Double> e : w.entrySet())
84width.addRecord( e.getKey() ).setValue( e.getValue() );
85
86 // 초기 체크포인트 생성
88 GAMSJobmasterInitJob = ws.addJobFromString(마스터모델);
89masterInitJob.실행(opt, masterCP, cutstockData);
90
91 GAMSJobmasterJob = ws.addJobFromString("execute_load 'csdata', aip, pp; %solveMasterAs%를 사용하여 마스터 min z 해결;", 마스터CP);
92
93 GAMSSet패턴 = cutstockData.추가세트("pp", 1,"패턴 색인");
94 슬롯매개변수patternData = cutstockData.addParameter("aip", 2,"패턴 데이터");
95
96 // 초기 패턴: 패턴은 너비 i를 유지합니다.
97 int패턴수 = 0;
98 for(Entry<String, Double> e : w.entrySet())
99문자열[] 키 =신규String[] e.getKey(), 패턴.addRecord( Integer.toString(++patternCount) ).getKey(0) ;
100patternData.addRecord(keys).setValue( (int)(r / e.getValue()) );
101}
102
103 // 하위 작업에 대한 모델 인스턴스 생성
105ws.addJobFromString(하위 모델).실행(opt, subCP, cutstockData);
106
107 GAMSModelInstancesubMI = 하위 CP.addModelInstance();
108
109 // 수식어 demdual 정의
110 슬롯매개변수demandDual = subMI.SyncDB().addParameter("뎀듀얼", 1,"마스터의 이중 요구");
111subMI.인스턴스화("mip를 사용하여 min z 가격 책정", 선택,신규 GAMSModifier(demandDual));
112
113 // 새로운 패턴 찾기
114 부울패턴 추가됨 =사실;
115 그동안(패턴 추가됨)
116{
117masterJob.실행(opt, masterCP, cutstockData);
118 // gmssubMI.SyncDB DB에 이중 복사
119demandDual.clear();
120 for(GAMSequationRecorddem : masterJob.아웃DB().getEquation("수요"))
121demandDual.addRecord( dem.getKey(0) ).setValue( dem.getMarginal() );
122
123subMI.해결();
124
125 if(subMI.SyncDB().get변수("z").findRecord().getLevel() < -0.00001)
126 if(patternCount == maxpattern)
127System.out.println("패턴이 벗어났습니다. 최대 패턴을 늘리십시오(현재 ["+최대 패턴+"])");
128패턴 추가됨 =거짓;
129}
130 그밖에{
131System.out.println("새 패턴 값: "+ 하위MI.SyncDB().getVariable("z").findRecord().getLevel());
132 GAMSSetRecords = 패턴.addRecord( Integer.toString(++patternCount) );
133 for (GAMSVariableRecordy : subMI.SyncDB().getVariable("y")) {
134 if(y.getLevel() > 0.5)
135문자열[] 키 =신규문자열[] y.getKey(0), s.getKey(0) ;
136patternData.addRecord( 키 ).setValue( Math.round(y.getLevel()) );
137}
138}
139}
140}그밖에{
141패턴 추가됨 =거짓;
142}
143}
144
145 // 최종 MIP 해결
146opt.defines("solveMasterAs", "MIP");
147마스터Job.실행(선택, cutstockData);
148
149System.out.println("최적의 해결책: "+masterJob.아웃DB().get변수("z").findRecord().getLevel());
150
151 for (GAMSVariableRecordxp : masterJob.아웃DB().get변수("xp")) {
152 if(xp.getLevel() > 0.5)
153System.out.println(" 패턴 ["+xp.getKey(0)+"] ["+xp.getLevel()+"] 회: ");
154 슬롯매개변수param = masterJob.아웃DB().getParameter("아이피");
155@SuppressWarnings("미사용")
156 GAMSParameterRecordaip = param.getFirstRecord(신규문자열[]" ", xp.getKey(0) );
157Iterator<GAMSParameterRecord> it = param.iterator();
158 그동안(it.hasNext())
159 GAMSParameterRecordrec = it.next();
160System.out.println(" ["+rec.getKey(0)+"] : ["+ 추천getValue()+"]");
161}
162System.out.println();
163}
164}
165
166 // 관리되지 않는 리소스 정리
167cutstockData.처분();
168subMI.처분();
169opt.dispose();
170
171}
172
173 정적문자열 masterModel =
174 "$Title 재고 절단 - 마스터 문제 \n" +
175 " \n" +
176 "i 너비 설정 \n" +
177 "매개변수 \n" +
178 " w(i) 너비 \n" +
179 " d(i) 수요 \n" +
180 "스칼라 \n" +
181 " r 원시 너비; \n" +
182 "$gdxin csdata \n" +
183 "$load i w d r \n" +
184 " \n" +
185 "$if가 설정되지 않은 경우 $pmax $set pmax 1000 \n" +
186 "p개의 가능한 패턴 설정 /1*%pmax%/ \n" +
187 " p의 pp(p) 동적 하위 집합 \n" +
188 "매개변수 \n" +
189 " aip(i,p) p에서 성장하는 패턴의 너비 i 수;\n" +
190 " \n" +
191 "* 마스터 모델 \n" +
192 "가변 xp(p) 패턴이 사용되었습니다 \n" +
193 " z 목적 변수 \n" +
194 "정수 변수 xp; xp.up(p) = sum(i, d(i)); \n" +
195 " \n" +
196 "사용된 패턴의 방정식 숫자 \n" +
197 " 수요(i) 수요를 충족; \n" +
198 " \n" +
199 "numpat.. z =e= sum(pp, xp(pp)); \n" +
200 "수요(i).. sum(pp, aip(i,pp)*xp(pp)) =g= d(i); \n" +
201 " \n" +
202 "모델 마스터 /numpat, 수요/; \n" +
203 " \n";
204
205 정적문자열 하위 모델 =
206 "$Title 재고 절단 - 가격 문제는 배낭 모델입니다 \n" +
207 " \n" +
208 "i 너비 설정 \n" +
209 "매개변수 \n" +
210 " w(i) 너비; \n" +
211 "스칼라 \n" +
212 " r 원시 너비; \n" +
213 " \n" +
214 "$gdxin csdata \n" +
215 "$load i w r \n" +
216 " \n" +
217 "매개변수 \n" +
218 " 마스터 수요 제약 조건의 demdual(i) 이중 /#i eps/; \n" +
219 " \n" +
220 "변수 z, y(i) 새로운 패턴; \n" +
221 "정수 변수 y; y.up(i) = ceil(r/w(i)); \n" +
222 " \n" +
223 "방정식 defobj \n" +
224 " 배낭; \n" +
225 " \n" +
226 "defobj.. z =e= 1 - sum(i, demdual(i)*y(i)); \n" +
227 "배낭.. sum(i, w(i)*y(i)) =l= r; \n" +
228 "모델 가격 /defobj, 배낭/; \n" +
229 " \n";
230}
231
GAMSModelInstance addModelInstance()
GAMSParameter getParameter(문자열 식별자)
GAMSSet addSet(문자열 식별자, 정수 차원)
GAMSequation getEquation(문자열 식별자)
GAMSParameter addParameter(문자열 식별자, 정수 차원)
GAMSVariable getVariable(문자열 식별자)
슬롯데이터베이스 OutDB()
슬롯데이터베이스 SyncDB()
void instantiate(String modelDefinition, GAMSModifier ... modifiers)
void setSystemDirectory(문자열 디렉토리)
void setWorkingDirectory(문자열 디렉터리)
GAMSJob addJobFromString(문자열 소스)
슬롯데이터베이스 addDatabase()
이 예는 열 생성 접근 방식을 구현합니다.