로드 중...
검색 중...
일치하는 항목 없음
크레이지 슬롯py
이 파일의 문서로 이동하세요.
1
10
11가져오기sys
12from감스가져오기GamsModifier, GamsWorkspace
13
14GAMS_MASTER_MODEL ="""
15'너비'를 설정합니다;
16
17매개변수
18w(i) '너비'
19d(i) '수요';
20
21스칼라
22r '원시 너비';
23
24$gdxIn csdata
25$load i w d r
26$gdxIn
27
28$pmax를 설정하지 않은 경우 $set pmax 1000
29설정
30p '가능한 패턴' / 1*%pmax% /
31pp(p) 'p의 동적 하위 집합';
32
33매개변수
34aip(i,p) 'p에서 성장하는 패턴의 너비 i 수';
35
36변수
37xp(p) '사용된 패턴'
38z '객관적 변수';
39
40정수 변수 xp;
41xp.up(p) = sum(i, d(i));
42
43수식
44numpat
45수요(i);
46
47numpat.. z =e= sum(pp, xp(pp));
48
49수요(i).. sum(pp, aip(i,pp)*xp(pp)) =g= d(i);
50
51모델 마스터 / numpat, 수요 /;
52"""
53
54GAMS_SUB_MODEL ="""
55'너비'를 설정합니다;
56
57매개변수 w(i) '너비';
58스칼라 r '원시 너비';
59
60$gdxIn csdata
61$load i w r
62$gdxIn
63
64매개변수
65demdual(i) '마스터 수요 제약의 이중' / #i eps /;
66
67변수
68z
69y(i) '새 패턴';
70정수 변수 y;
71y.up(i) = ceil(r/w(i));
72
73수식
74defobj
75배낭;
76
77defobj.. z =e= 1 - sum(i, demdual(i)*y(i));
78
79배낭.. sum(i, w(i)*y(i)) =l= r;
80
81모델 가격 / defobj, 배낭 /;
82"""
83
84if__name__ =="__main__":
85sys_dir = sys.argv[1]iflen(sys.argv) > 1그밖에 없음
86work_dir = sys.argv[2]iflen(sys.argv) > 2그밖에 없음
87ws = GamsWorkspace(system_directory=sys_dir,working_directory=work_dir)
88
89opt = ws.add_options()
90cutstock_data = ws.add_database("csdata")
91opt.all_model_types ="복합단지"
92opt.optcr = 0.0# 최적성을 해결
93max_pattern = 35
94
95opt.defines["pmax"] = str(max_pattern)
96opt.defines["solveMasterAs"] ="RMIP"
97
98r = 100# 원시 너비
99raw_width = cutstock_data.add_parameter("r", 0,"원시 너비")
100raw_width.add_record().value = 100
101
102d ="i1": 97,"i2": 610,"i3": 395,"i4": 211}
103수요 = cutstock_data.add_parameter("d", 1,"수요")
104너비 = cutstock_data.add_set("나", 1,"너비")
105 fork, vd.items():
106widths.add_record(k)
107demand.add_record(k).value = v
108
109w ="i1": 47,"i2": 36,"i3": 31,"i4": 14}
110폭 = cutstock_data.add_parameter("w", 1,"너비")
111 fork, vw.items():
112width.add_record(k).value = v
113
114cp_master = ws.add_checkpoint()
115job_master_init = ws.add_job_from_string(GAMS_MASTER_MODEL)
116job_master_init.run(opt, cp_master, 데이터베이스=cutstock_data)
117job_master = ws.add_job_from_string(
118 "execute_load 'csdata', aip, pp; %solveMasterAs%를 사용하여 마스터 최소 z를 해결합니다.",
119cp_master,
120 )
121
122패턴 = cutstock_data.add_set("pp", 1,"패턴 색인")
123pattern_data = cutstock_data.add_parameter("aip", 2,"패턴 데이터")
124
125 # 초기 패턴: 패턴은 너비 i를 유지합니다.
126pattern_count = 0
127 fork, vinw.items():
128pattern_count += 1
129pattern_data.add_record(
130(k, 패턴.add_record(str(pattern_count)).key(0))
131).value = (int)(r / v)
132
133cp_sub = ws.add_checkpoint()
134job_sub = ws.add_job_from_string(GAMS_SUB_MODEL)
135job_sub.run(opt, cp_sub, 데이터베이스=cutstock_data)
136mi_sub = cp_sub.add_modelinstance()
137
138 # 수정자 demdual 정의
139demand_dual = mi_sub.sync_db.add_parameter(
140 "뎀듀얼", 1,"마스터의 이중 요구"
141 )
142mi_sub.instantiate("mip를 사용하여 min z 가격 책정", GamsModifier(demand_dual), opt)
143
144 # 새로운 패턴 찾기
145 그동안 :
146job_master.run(opt, cp_master, 데이터베이스=cutstock_data)
147 # 이중을 mi_sub.sync_db DB에 복사
148demand_dual.clear()
149 fordemjob_master.out_db["수요"]:
150demand_dual.add_record(dem.key(0)).value = dem.marginal
151mi_sub.solve()
152 ifmi_sub.sync_db["z"].first_record().level < -0.00001:
153 ifpattern_count == max_pattern:
154인쇄(
155f"패턴이 벗어났습니다. max_pattern(현재 max_pattern)을 늘리세요."
156 )
157 휴식
158 그밖에:
159인쇄(f"새 패턴! 값: mi_sub.sync_db['z'].first_record().level")
160pattern_count += 1
161s = 패턴.add_record(str(pattern_count))
162 foryinmi_sub.sync_db["y"]:
163 ify.레벨 > 0.5:
164pattern_data.add_record((y.key(0), s.key(0))).value = round(
165y.level
166 )
167 그밖에:
168 휴식
169
170 # 최종 MIP 해결
171opt.defines["solveMasterAs"] ="MIP"
172job_master.run(opt, 데이터베이스=cutstock_data)
173인쇄(f"최적의 해결책: job_master.out_db['z'].first_record().level")
174 forxpjob_master.out_db["xp"]:
175 ifxp.레벨 > 0.5:
176인쇄(f" 패턴 xp.key(0) xp.level 번:")
177aip = job_master.out_db["아이피"].first_record((" ", xp.key(0)))
178 그동안 :
179인쇄(f" aip.key(0): aip.value")
180 if 아님aip.move_next():
181 휴식