로드 중...
검색 중...
일치하는 항목 없음
슬롯 사이트 추천py
이 파일의 문서로 이동하세요.
1
12
13fromitertools가져오기제품
14가져오기os
15가져오기sys
16from게임가져오기GamsWorkspace, GamsModifier, SymbolUpdateType
17
18GAMS_MODEL ="""
19$tspdata가 설정되지 않은 경우 $abort 'tspdata가 설정되지 않음'
20
21설정
22ii '도시'
23i(ii) '도시의 하위 집합';
24
25별칭 (ii,jj), (i,j,k);
26
27매개변수 c(ii,jj) '거리 행렬';
28
29$gdxIn %tspdata%
30$load ii c
31$gdxIn
32
33$nrCities가 설정되지 않은 경우 $set nrCities 20
34i(ii)$(ord(ii) < %nrCities%) = 예;
35
36변수
37x(ii,jj) '결정 변수 - 여행 구간'
38z '객관적 변수';
39
40바이너리 변수 x;
41x.fx(ii,ii) = 0;
42
43수식
44목표 '총 비용'
45rowsum(ii) '각 도시를 한 번만 떠나세요'
46colsum(jj) '각 도시에 한 번만 도착';
47
48* 할당 문제는 슬롯 사이트 추천의 완화입니다.
49목적.. z =e= sum((i,j), c(i,j)*x(i,j));
50
51rowsum(i).. sum(j, x(i,j)) =e= 1;
52
53colsum(j)..sum(i, x(i,j)) =e= 1;
54
55$cmax가 설정되지 않은 경우 $set cmax 2
56컷 설정 /c0*c%cmax%/;
57
58매개변수
59acut(슬롯 사이트 추천ii,jj) '제약조건 행렬 자르기'
60rhscut(슬롯 사이트 추천) '제한조건 rhs 자르기';
61
62수식 sscut(슬롯 사이트 추천) 'sub_tour 제거 컷';
63sscut(슬롯 사이트 추천).. sum((i,j), acut(슬롯 사이트 추천i,j)*x(i,j)) =l= rhscut(슬롯 사이트 추천);
64
65cc(슬롯 사이트 추천) '이전 컷' 설정;
66cc(잘라내기) = 아니요;
67
68$if set cutdataexecute_load '%cutdata%', cc, acut, rhscut;
69
70acut(슬롯 사이트 추천i,j)$(cc(슬롯 사이트 추천) 아님) = eps;
71
72rhscut(컷)$(cc(컷) 아님) = 카드(ii);
73
74모델 할당 /all/;
75
76옵션 optcr=0;
77"""
78
79if__name__ =="__main__":
80sys_dir = sys.argv[1]iflen(sys.argv) > 1그밖에 없음
81work_dir = sys.argv[2]iflen(sys.argv) > 2그밖에 없음
82ws = GamsWorkspace(system_directory=sys_dir,working_directory=work_dir)
83
84 # 모델 인스턴스에 추가할 수 있는 컷 수
85cuts_per_round = 10
86
87 # 현재 컷
88cur_cut = 0
89
90 # 현재 모델 인스턴스에 대한 절단 제한(cmax = cur_cut + cuts_per_round)
91cmax = 0
92
93 # 생성된 모든 컷을 수집하는 데 사용되는 데이터베이스
94cut_data = ws.add_database()
95cc = cut_data.add_set("cc", 1)
96acut = cut_data.add_parameter("어컷", 3)
97rhscut = cut_data.add_parameter("rhscut", 1)
98
99n = []# 도시 목록(i1, i2, i3, ...)
100 그동안 :
101 # 절단 한계에 도달하면 새 모델 인스턴스를 생성
102 ifcur_cut >= cmax:
103cmax = cur_cut + cuts_per_round
104cut_data.export()
105
106 # 체크포인트 생성
107작업 = ws.add_job_from_string(GAMS_MODEL)
108cp = ws.add_checkpoint()
109opt = ws.add_options()
110opt.defines["nrcities"] ="20"
111opt.defines["cmax"] = str(cmax - 1)
112opt.defines["컷데이터"] = cut_data.name
113opt.defines["tspdata"] = (
114 '"'
115+ os.path.join(ws.system_directory,"api파일", "데이터", "슬롯 사이트 추천gdx")
116 + '"'
117 )
118job.run(gams_options=opt, checkpoint=cp)
119
120 # 도시 목록을 한 번만 채웁니다.
121 if 아님n:
122 forijob.out_db["나"]:
123n += i.keys
124
125 # 수정자 mi_acut 및 mi_rhscut을 사용하여 모델 인스턴스를 인스턴스화합니다.
126mi = cp.add_modelinstance()
127mi_acut = mi.sync_db.add_parameter("어컷", 3)
128mi_rhscut = mi.sync_db.add_parameter("rhscut", 1)
129mi.instantiate(
130 "mip min z 사용 할당", [GamsModifier(mi_acut), GamsModifier(mi_rhscut)]
131 )
132
133 # 업데이트 유형 누적을 사용하여 모델 인스턴스를 해결하고 나중에 acut 및 rhscut 지우기
134mi.solve(SymbolUpdateType.Accumulate)
135mi.sync_db["어컷"].clear()
136mi.sync_db["rhscut"].clear()
137
138 # 솔루션에서 그래프 정보 수집
139그래프 =
140 fori, j제품(n, n):
141 ifmi.sync_db["x"].find_record([i, j]).level > 0.5:
142그래프[i] = j
143
144 # 모든 하위 투어를 찾고 acut 및 rhscut을 수정하여 필요한 컷을 추가
145not_visited = 목록(n)# 복사하기
146 그동안방문하지 않음:
147i = 방문하지 않음[0]
148sub_tour = [i]
149 그동안그래프[i] != 방문하지 않음[0]:
150i = 그래프[i]
151sub_tour.append(i)
152not_visited = 목록(필터(람다x:x아님 insub_tour, not_visited))
153
154 # 두 데이터베이스에 컷 추가(cut_data, mi.sync_db)
155 fori, j제품(sub_tour, sub_tour):
156acut.add_record([f"ccur_cut", i, j]).값 = 1
157mi_acut.add_record([f"ccur_cut", i, j]).값 = 1
158rhscut.add_record(f"ccur_cut").value = len(sub_tour) - 0.5
159mi_rhscut.add_record([f"ccur_cut"]).value = len(sub_tour) - 0.5
160cc.add_record(f"ccur_cut")
161cur_cut += 1
162
163 # 하위 투어에 모든 도시가 포함되어 있으면 루프를 종료하고 솔루션을 인쇄합니다.
164 iflen(sub_tour) == len(n):
165인쇄(f"z=mi.sync_db['z'].first_record().level")
166인쇄("sub_tour: ")
167 foriinsub_tour:
168인쇄(f"i -> ", 끝="")
169인쇄(sub_tour[0])
170 휴식