로드 중...
검색 중...
일치하는 항목 없음
Tsp.cs
1사용 중시스템;
2사용 중System.Collections.Generic;
3사용 중System.Linq;
4사용 중시스템.텍스트;
5사용 중슬롯 머신;
6사용 중시스템.IO;
7사용 중시스템.반사;
8
9네임스페이스티스푼
10{
21 클래스티스푼
22{
23 정적 무효메인(문자열[] 인수)
24{
26 if(Environment.GetCommandLineArgs().Length > 1)
27ws =신규 슬롯 머신작업공간(systemDirectory: Environment.GetCommandLineArgs()[1]);
28 그밖에
29ws =신규 슬롯 머신작업공간(".");
30 // 모델 인스턴스에 추가할 수 있는 컷 수
31 intcutsPerRound = 10;
32 // 현재 컷
33 intcurCut = 0;
34 // 현재 모델 인스턴스의 절단 제한(cmax = curCut + cutsPerRound)
35 intc최대 = 0;
36
37 // 생성된 모든 컷을 수집하는 데 사용되는 데이터베이스
39 GAMSSetcc = cutData.AddSet("cc", 1,"");
40 슬롯 머신매개변수acut = cutData.매개변수 추가("어컷", 3,"");
41 슬롯 머신매개변수rhscut = cutData.매개변수 추가("rhscut", 1,"");
42 // 도시 목록(i1, i2, i3, ...)
43목록<string> n =신규목록<문자열>();
44
46 GAMSModelInstancemi =;
48 슬롯 머신매개변수miRhscut =;
49목록<string> 하위 투어 =;
50
51
52{
53 // 자르기 제한에 도달하면 새 모델 인스턴스를 생성
54 if(curCut >= cMax)
55{
56cMax = curCut + cutsPerRound;
57컷데이터.내보내기();
58
59 // 체크포인트 생성
60 GAMSJobtspJob = ws.AddJobFromString(GetModelText());
63선택.정의.추가("nrcities", "20");
64선택.정의.추가("cmax", (cMax - 1).ToString());
65선택.정의.추가("컷데이터", 컷데이터.이름);
66선택.정의.추가("tspdata", "\""+ Path.Combine(ws.시스템 디렉터리, @"apifiles/Data/tsp.gdx") +"\"");
67tspJob.실행(선택, cp);
68
69 // n 목록을 한 번만 채웁니다.
70 if(n.Count == 0)
71 foreach(GAMSSetRecorditspJob.OutDB.GetSet("나"))
72n.추가(i.키(0));
73
74 // miAcut 및 miRhscut 수정자를 사용하여 모델 인스턴스를 인스턴스화합니다.
75mi = cp.AddModelInstance();
76miAcut = 마일.SyncDB.매개변수 추가("어컷", 3,"");
77miRhscut = mi.SyncDB.매개변수 추가("rhscut", 1,"");
78mi.인스턴스화("mip min z 사용 할당", 신규 GAMSModifier(miAcut),신규 GAMSModifier(miRhscut));
79}
80
81 // 업데이트 유형 누적을 사용하여 모델 인스턴스를 해결하고 나중에 acut 및 rhscut 지우기
83mi.SyncDB.GetParameter("어컷").지우기();
84mi.SyncDB.GetParameter("rhscut").지우기();
85
86 // 솔루션에서 그래프 정보 수집
87사전<문자열, 문자열> 그래프 =신규사전<문자열, 문자열>();
88목록<문자열> 방문하지 않음 =신규목록<문자열>(n);
89 foreach (문자열iinn)
90 foreach (문자열jinn)
91 if(mi.SyncDB.GetVariable("x").기록 찾기(i, j).레벨> 0.5)
92그래프[i] = j;
93
94 // acut 및 rhscut을 수정하여 모든 하위 투어를 찾고 필요한 컷을 추가합니다.
95 그동안(notVisited.Count != 0)
96{
97 문자열ii = 방문하지 않음[0];
98하위 투어 =신규목록<문자열>();
99subTour.Add(ii);
100 그동안(그래프[ii] != 방문하지 않음[0])
101{
102ii = 그래프[ii];
103subTour.Add(ii);
104}
105notVisited = notVisited.Where(x => !subTour.Contains(x)).ToList<문자열>();
106
107 // 두 데이터베이스에 컷 추가(cutData, mi.SyncDB)
108 foreach (문자열i하위 투어)
109 foreach (문자열jin하위 투어)
110{
111acut.AddRecord("c"+ curCut, i, j).= 1;
112miAcut.AddRecord("c"+ curCut, i, j).= 1;
113}
114
115rhscut.AddRecord("c"+ curCut).= subTour.Count() - 0.5;
116miRhscut.AddRecord("c"+ curCut).= subTour.Count() - 0.5;
117cc.AddRecord("c"+ curCut);
118curCut += 1;
119}
120}
121 그동안(subTour.Count < n.Count);
122
123Console.WriteLine("z="+ 마일.SyncDB.GetVariable("z").첫 번째 레코드().레벨);
124Console.WriteLine("sub_tour: ");
125 foreach (문자열i하위 투어)
126콘솔.쓰기(i +" -> ");
127Console.WriteLine(subTour[0]);
128
129}
130
131 정적문자열 GetModelText()
132{
133문자열 모델 =@"
134$Title Python을 사용한 여행 외판원 문제 인스턴스
135
136$Ontext
137
138sub_tour 제거 제약 조건은 Python에 의해 생성됩니다.
139스크립트. MIP는 계속해서 해결되지만 슬롯 머신는 해결해야 합니다.
140n개의 컷이 추가된 후에만 모델을 생성합니다.
141
142$Offtext
143
144$tspdata가 설정되지 않은 경우 $abort 'tspdata가 설정되지 않음'
145
146ii 도시 설정
147i(ii) 도시의 하위 집합
148별칭 (ii,jj),(i,j,k);
149
150매개변수 c(ii,jj) 거리 행렬;
151
152$gdxin %tspdata%
153$load ii c
154
155$nrCities가 설정되지 않은 경우 $set nrCities 20
156i(ii)$(ord(ii) < %nrCities%) = 예;
157
158변수 x(ii,jj) 결정 변수 - 여행 구간
159z 목적변수;
160바이너리 변수 x; x.fx(ii,ii) = 0;
161
162방정식 목표 총 비용
163rowsum(ii) 각 도시를 한 번만 출발
164colsum(jj)는 각 도시에 한 번만 도착합니다.
165
166* 할당 문제는 TSP의 완화입니다.
167목적.. z =e= sum((i,j), c(i,j)*x(i,j));
168rowsum(i).. sum(j, x(i,j)) =e= 1;
169colsum(j).. sum(i, x(i,j)) =e= 1;
170
171$cmax가 설정되지 않은 경우 $set cmax 2
172컷 설정 /c0*c%cmax%/;
173매개변수
174acut(cut,ii,jj) 절단 제약 행렬
175rhscut(cut) 제약조건 rhs 자르기;
176
177equation sscut(cut) sub_tour 제거 컷;
178sscut(cut).. sum((i,j), Acut(cut,i,j)*x(i,j)) =l= RHScut(cut);
179
180cc(컷) 이전 컷 설정; cc(컷) = 아니요;
181$if set cutdataexecute_load '%cutdata%', cc, Acut, RHScut;
182
183Acut(cut,i,j)$(cc(cut) 아님) = eps;
184RHScut(컷)$(cc(컷) 아님) = 카드(ii);
185
186모델 할당 /all/;
187
188옵션 optcr=0;
189";
190 반환모델;
191}
192}
193}
GAMSModelInstance AddModelInstance(string modelInstanceName=null)
GAMSVariable GetVariable(문자열 변수 식별자)
GAMSSet AddSet(문자열 식별자, int 차원, 문자열 설명텍스트="", SetType setType=SetType.multi)
GAMSParameter GetParameter(문자열 매개변수 식별자)
GAMSParameter AddParameter(문자열 식별자, 정수 차원, 문자열 설명텍스트="")
void Run(GAMSOptions gamsOptions=null, GAMSCheckpoint 체크포인트=null, TextWriter 출력=null, Boolean createOutDB=true)
슬롯 머신데이터베이스 SyncDB
void Solve(SymbolUpdateType 업데이트 유형=SymbolUpdateType.BaseCase, TextWriter 출력=null, GAMSModelInstanceOpt miOpt=null)
void 인스턴스화(문자열 모델 정의, params GAMSModifier[] 수정자)
사전< 문자열, 문자열 > 정의
새 GAMSParameterRecord AddRecord(params 문자열[] 키)
새 GAMSSetRecord AddRecord(params 문자열[] 키)
새 GAMSVariableRecord FindRecord(params 문자열[] 키)
새 GAMSVariableRecord FirstRecord()
GAMSJob AddJobFromString(문자열 gamsSource, GAMSCheckpoint 체크포인트=null, 문자열 jobName=null)
GAMSDatabase AddDatabase(문자열 데이터베이스 이름=null, 문자열 inModelName=null)
GAMSCheckpoint AddCheckpoint(string checkpointName=null)
GAMSOptions AddOptions(GAMSOptions optFrom=null)