로드 중...
검색 중...
일치하는 항목 없음
Tsp.java
1패키지com.슬롯 커뮤니티examples.tsp;
2
3가져오기java.io.파일;
4가져오기java.util.ArrayList;
5가져오기java.util.Collection;
6가져오기java.util.HashMap;
7가져오기java.util.List;
8가져오기java.util.Map;
9
13가져오기 com.감스.API.GAMSJob;
14가져오기 com.게임.API.GAMSModelInstance;
15가져오기 com.게임.API.GAMSModifier;
18가져오기 com.게임.API.GAMSSet;
19가져오기 com.게임.API.GAMSSetRecord;
21가져오기 com.게임.API.GAMSWorkspaceInfo;
22
32공개 클래스티스푼{
33
34 공개 정적 공허메인(문자열[] 인수)
35
37 // 시스템 디렉토리가 인수로 전달되었는지 확인
38 if(args.length > 0)
39wsInfo.setSystemDirectory(인수[0]);
40
41 // 디렉토리 생성
42파일 WorkingDirectory =신규파일(System.getProperty("user.dir"), "티스푼");
43workingDirectory.mkdir();
44
45wsInfo.setWorkingDirectory(workingDirectory.getAbsolutePath());
46
47 // 작업공간 생성
49
50 // 모델 인스턴스에 추가할 수 있는 컷 수
51 intcutsPerRound = 10;
52 // 현재 컷
53 intcurCut = 0;
54 // 현재 모델 인스턴스의 절단 제한(cmax = curCut + cutsPerRound)
55 intc최대 = 0;
56
57 // 생성된 모든 컷을 수집하는 데 사용되는 데이터베이스
59 GAMSSetcc = cutData.추가세트("cc", 1,"");
60 슬롯 커뮤니티매개변수acut = cutData.addParameter("어컷", 3,"");
61 슬롯 커뮤니티매개변수rhscut = cutData.addParameter("rhscut", 1,"");
62
63 // 도시 목록(i1, i2, i3, ...)
64목록<문자열> n =신규ArrayList<문자열>();
65
67 GAMSModelInstancemi =;
70목록<문자열> 하위 투어 =;
71
72
73 할 것{
74 // 자르기 제한에 도달하면 새 모델 인스턴스를 생성
75 if(curCut >= cMax)
76System.out.print(",");
77cMax = curCut + cutsPerRound;
78컷데이터.내보내기();
79
80 // 체크포인트 생성
81 GAMSJobtspJob = ws.addJobFromString(모델);
82cp = ws.addCheckpoint();
83GAMSOptions opt = ws.추가옵션();
84선택.정의("nrcities", "20");
85opt.defines("cmax", Integer.toString(cMax - 1));
86opt.defines("컷데이터", 컷데이터.getName());
87
88
89 // "tsp.gdx"에서 입력 데이터 읽기
90문자열 gamsdir = ws.시스템디렉토리();
91 if(!gamsdir.endsWith(GAMSGlobals.FILE_SEPARATOR))
92gamsdir += GAMSGlobals.FILE_SEPARATOR;
93파일 데이터파일 =신규파일(gamsdir +"api파일"+ GAMSGlobals.FILE_SEPARATOR
94 + "데이터"+ GAMSGlobals.FILE_SEPARATOR
95 + "tsp.gdx");
96opt.defines("tspdata", "\""+ datafile.getAbsolutePath() +"\"");
97tspJob.실행(선택, cp);
98
99 // n 목록을 한 번만 채웁니다.
100 if(n.size() == 0)
101 for(GAMSSetRecordi : tspJob.아웃DB().getSet("나"))
102n.add(i.getKey(0));
103
104 // miAcut 및 miRhscut 수정자를 사용하여 모델 인스턴스를 인스턴스화합니다.
105mi = cp.addModelInstance();
106miAcut = 마일.SyncDB().addParameter("어컷", 3,"");
107miRhscut = mi.SyncDB().addParameter("rhscut", 1,"");
108 GAMSModifier[] 수정자 =신규 GAMSModifier(miAcut),신규 GAMSModifier(miRhscut) ;
109mi.인스턴스화("mip min z 사용 할당", 수정자);
110}
111 그밖에{
112System.out.print(".");
113}
114 // 업데이트 유형 누적을 사용하여 모델 인스턴스를 해결하고 나중에 acut 및 rhscut 지우기
116mi.SyncDB().getParameter("어컷").clear();
117mi.SyncDB().getParameter("rhscut").clear();
118
119 // 솔루션에서 그래프 정보 수집
120맵<문자열, 문자열> 그래프 =신규HashMap<문자열, 문자열>();
121
122목록 <문자열> 방문하지 않음 =신규ArrayList<문자열>(n);
123 for(문자열 i : n)
124 for(문자열 j : n)
125문자열[] 키 = i, j ;
126 if(mi.SyncDB().get변수("x").findRecord( 키 ).getLevel() > 0.5)
127graph.put(i, j);
128}
129}
130
131
132 // 모든 하위 투어를 찾고 acut 및 rhscut을 수정하여 필요한 컷을 추가합니다.
133 그동안(notVisited.size() != 0)
134문자열 ii = notVisited.get(0);
135하위 투어 =신규ArrayList<문자열>();
136subTour.add(ii);
137 그동안(graph.get(ii) != notVisited.get(0))
138{
139ii = graph.get(ii);
140subTour.add(ii);
141}
142
143 최종목록<문자열> 소스 = subTour;
144IPredicate<String> doesNotContain =신규IPredicate<문자열>()
145 공개 부울적용(문자열 요소)
146 반환!source.contains(요소);
147}
148};
149notVisited = (List<String>) filter(subTour, doesNotContain);
150
151 // 두 데이터베이스에 컷 추가(cutData, mi.SyncDB)
152 for(문자열 i : subTour)
153 for(문자열 j : subTour)
154문자열[] 키 ="c"+curCut, i, j ;
155acut.addRecord(keys).setValue( 1 );
156miAcut.addRecord( 키 ).setValue( 1 );
157}
158}
159
160문자열 키 ="c"+curCut;
161rhscut.addRecord( key ).setValue( subTour.size()-0.5 );
162miRhscut.addRecord( key ).setValue( subTour.size()-0.5 );
163cc.addRecord( 키 );
164curCut += 1;
165}
166
167}
168 그동안(subTour.size() < n.size());
169
170System.out.println();
171System.out.println("z="+마일SyncDB().get변수("z").getFirstRecord().getLevel());
172System.out.println("sub_tour: ");
173 for(문자열 i : subTour)
174System.out.print(i +" -> ");
175System.out.println( subTour.get(0) );
176
177}
178
179 인터페이스IPredicate<T>부울적용(T 유형);
180정적 <T> Collection<T> 필터(Collection<T> 대상, IPredicate<T> 조건자)
181컬렉션<T> 결과 =신규ArrayList<T>();
182 for(T 요소 : 대상)
183 if(predicate.apply(요소))
184결과.추가(요소);
185}
186}
187 반환결과;
188}
189
190 정적문자열 모델 =
191 "$Title 여행하는 외판원 문제 \n" +
192 "$Ontext \n" +
193 " \n" +
194 "sub_tour 제거 제약 조건은 Python에 의해 생성됩니다\n" +
195 "스크립트. MIP는 계속해서 해결되지만 슬롯 커뮤니티는 \n" +
196 "n 컷이 추가된 후에만 모델을 생성합니다. \n" +
197 " \n" +
198 "$Offtext \n" +
199 " \n" +
200 "$tspdata가 설정되지 않은 경우 $abort 'tspdata가 설정되지 않음' \n" +
201 " \n" +
202 "ii 도시 설정 \n" +
203 " i(ii) 도시의 하위 집합 \n" +
204 "별칭 (ii,jj),(i,j,k); \n" +
205 " \n" +
206 "매개변수 c(ii,jj) 거리 행렬; \n" +
207 " \n" +
208 "$gdxin %tspdata% \n" +
209 "$load ii c \n" +
210 " \n" +
211 "$nrCities를 설정하지 않은 경우 $set nrCities 20 \n" +
212 "i(ii)$(ord(ii) < %nrCities%) = 예; \n" +
213 " \n" +
214 "변수 x(ii,jj) 결정 변수 - 여행 구간 \n" +
215 " z 목적 변수; \n" +
216 "이진 변수 x; x.fx(ii,ii) = 0; \n" +
217 " \n" +
218 "방정식 목표 총 비용 \n" +
219 " rowsum(ii) 각 도시를 한 번만 출발합니다 \n" +
220 " colsum(jj)은 각 도시에 한 번만 도착합니다. \n" +
221 " \n" +
222 "* 할당 문제는 TSP의 완화입니다 \n" +
223 "객관적.. z =e= sum((i,j), c(i,j)*x(i,j)); \n" +
224 "rowsum(i).. sum(j, x(i,j)) =e= 1; \n" +
225 "colsum(j).. sum(i, x(i,j)) =e= 1; \n" +
226 " \n" +
227 "$if cmax를 설정하지 않음 $set cmax 2 \n" +
228 "컷 설정 /c0*c%cmax%/; \n" +
229 "매개변수 \n" +
230 " acut(cut,ii,jj) 컷 제약 행렬 \n" +
231 " rhscut(cut) 제약 조건 rhs 자르기; \n" +
232 " \n" +
233 "등식 sscut(cut) sub_tour 제거 컷; \n" +
234 "sscut(cut).. sum((i,j), Acut(cut,i,j)*x(i,j)) =l= RHScut(cut); \n" +
235 " \n" +
236 "cc(컷) 이전 컷 설정; cc(컷) = 아니오; \n" +
237 "$if set cutdataexecute_load '%cutdata%', cc, Acut, RHScut; \n" +
238 " \n" +
239 "Acut(cut,i,j)$(cc(cut) 아님) = eps; \n" +
240 "RHScut(컷)$(cc(컷) 아님) = 카드(ii); \n" +
241 " \n" +
242 "모델 할당 /all/; \n" +
243 " \n" +
244 "옵션 optcr=0; \n";
245
246}
GAMSParameter getParameter(문자열 식별자)
GAMSSet addSet(문자열 식별자, 정수 차원)
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(문자열 소스)
슬롯 커뮤니티데이터베이스 addDatabase()
이 예는 GAMSModelInstance를 사용하여 하위 투어 제거 알고리즘을 구현하는 방법을 보여줍니다...