12from감스
가져오기GamsModifier, GamsWorkspace
28$pmax를 설정하지 않은 경우 $set pmax 1000
30p '가능한 패턴' / 1*%pmax% /
34aip(i,p) 'p에서 성장하는 패턴의 너비 i 수';
41xp.up(p) = sum(i, d(i));
47numpat.. z =e= sum(pp, xp(pp));
49수요(i).. sum(pp, aip(i,pp)*xp(pp)) =g= d(i);
65demdual(i) '마스터 수요 제약의 이중' / #i eps /;
71y.up(i) = ceil(r/w(i));
77defobj.. z =e= 1 - sum(i, demdual(i)*y(i));
79배낭.. sum(i, w(i)*y(i)) =l= r;
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)
90cutstock_data = ws.add_database(
"csdata")
91opt.all_model_types =
"복합단지"
95opt.defines[
"pmax"] = str(max_pattern)
96opt.defines[
"solveMasterAs"] =
"RMIP"
99raw_width = cutstock_data.add_parameter(
"r", 0,
"원시 너비")
100raw_width.add_record().value = 100
102d =
"i1": 97,
"i2": 610,
"i3": 395,
"i4": 211}
103수요 = cutstock_data.add_parameter(
"d", 1,
"수요")
104너비 = cutstock_data.add_set(
"나", 1,
"너비")
107demand.add_record(k).value = v
109w =
"i1": 47,
"i2": 36,
"i3": 31,
"i4": 14}
110폭 = cutstock_data.add_parameter(
"w", 1,
"너비")
112width.add_record(k).value = v
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를 해결합니다.",
122패턴 = cutstock_data.add_set(
"pp", 1,
"패턴 색인")
123pattern_data = cutstock_data.add_parameter(
"aip", 2,
"패턴 데이터")
129pattern_data.add_record(
130(k, 패턴.add_record(str(pattern_count)).key(0))
131).value = (int)(r / v)
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()
139demand_dual = mi_sub.sync_db.add_parameter(
140 "뎀듀얼", 1,
"마스터의 이중 요구"
142mi_sub.instantiate(
"mip를 사용하여 min z 가격 책정", GamsModifier(demand_dual), opt)
146job_master.run(opt, cp_master, 데이터베이스=cutstock_data)
149 fordem
에job_master.out_db[
"수요"]:
150demand_dual.add_record(dem.key(0)).value = dem.marginal
152 ifmi_sub.sync_db[
"z"].first_record().level < -0.00001:
153 ifpattern_count == max_pattern:
155f
"패턴이 벗어났습니다. max_pattern(현재 max_pattern)을 늘리세요."
159인쇄(f
"새 패턴! 값: mi_sub.sync_db['z'].first_record().level")
161s = 패턴.add_record(str(pattern_count))
162 fory
inmi_sub.sync_db[
"y"]:
164pattern_data.add_record((y.key(0), s.key(0))).value = round(
171opt.defines[
"solveMasterAs"] =
"MIP"
172job_master.run(opt, 데이터베이스=cutstock_data)
173인쇄(f
"최적의 해결책: job_master.out_db['z'].first_record().level")
174 forxp
에job_master.out_db[
"xp"]:
176인쇄(f
" 패턴 xp.key(0) xp.level 번:")
177aip = job_master.out_db[
"아이피"].first_record((
" ", xp.key(0)))
179인쇄(f
" aip.key(0): aip.value")
180 if 아님aip.move_next():