로드 중...
검색 중...
일치하는 항목 없음
cutstock_class.py
이 파일의 문서로 이동하세요.
1
7
8from게임가져오기GamsWorkspace, SolveLink
9
10GAMS_MODEL ="""
11$title 절단 스톡 - 열 생성 접근 방식(CUTSTOCK,SEQ=294)
12
13$onText
14과제는 다양한 크기의 종이 제품을 잘라내는 것입니다.
15고객의 주문을 충족시키기 위한 대형 원시 종이 롤. 목표
16필요한 용지 롤 수를 최소화하는 것입니다.
17
18
19P. C. Gilmore 및 R. E. Gomory, 선형 프로그래밍 접근 방식
20재고 문제, 파트 I, Operations Research 9(1961), 849-859.
21
22P. C. Gilmore 및 R. E. Gomory, 선형 프로그래밍 접근 방식
23재고 문제, 파트 II, Operations Research 11(1963), 863-888.
24
25키워드: 혼합 정수 선형 계획법, 재고 절단, 열 생성,
26제지 산업
27$offText
28
29'너비'를 설정합니다;
30
31매개변수
32r '원시 너비'
33w(i) '너비'
34d(i) '수요';
35
36$if 설정되지 않음 gdxincname $abort '제공된 데이터 파일에 대한 포함 파일 이름 없음'
37$gdxIn %gdxincname%
38$load r i w d
39$gdxIn
40
41* 길모어-고모리 열 생성 알고리즘
42
43설정
44p '가능한 패턴' / p1*p1000 /
45pp(p) 'p의 동적 하위 집합';
46
47매개변수 aip(i,p) 'p에서 성장하는 패턴의 너비 i 수';
48
49* 마스터 모델
50변수
51xp(p) '사용된 패턴'
52z '객관적 변수';
53
54정수 변수 xp;
55xp.up(p) = 합계(i, d(i));
56
57수식
58numpat '사용된 패턴 수'
59수요(i) '수요 충족';
60
61numpat.. z =e= sum(pp, xp(pp));
62
63수요(i).. sum(pp, aip(i,pp)*xp(pp)) =g= d(i);
64
65모델 마스터 / numpat, 수요 /;
66
67* 가격 문제 - 배낭 모델
68변수 y(i) '새 패턴';
69
70정수 변수 y;
71y.up(i) = ceil(r/w(i));
72
73수식
74defobj
75배낭 '배낭 제약';
76
77defobj.. z =e= 1 - 합계(i, 수요.m(i)*y(i));
78
79배낭.. sum(i, w(i)*y(i)) =l= r;
80
81모델 가격 / defobj, 배낭 /;
82
83* 초기화 - 초기 패턴은 단일 너비를 갖습니다.
84pp(p) = ord(p) <= 카드(i);
85aip(i,pp(p))$(ord(i) = ord(p)) = Floor(r/w(i));
86*디스플레이 aip;
87
88pi(p) '마지막 패턴 집합' 설정;
89pi(p) = ord(p) = 카드(pp) + 1;
90
91옵션 optCr = 0, limRow = 0, limCol = 0, solPrint = off;
92
93while(카드(pp) < 카드(p),
94z를 최소화하는 rmip를 사용하여 마스터를 해결합니다.
95mip 최소화 z를 사용하여 가격 책정 해결;
96
97break$(z.l >= -0.001);
98
99* 발견된 마스터 모델을 개선할 수 있는 패턴
100aip(i,pi) = round(y.l(i));
101pp(pi) = 예;
102pi(p) = pi(p-1);
103);
104'롤 수의 하한값' 표시, master.objVal;
105
106옵션 solPrint = 켜짐;
107
108z를 최소화하는 mip를 사용하여 마스터를 해결합니다.
109
110매개변수
111patrep '솔루션 패턴 보고서'
112demrep '솔루션 수요 공급 보고서';
113
114patrep('# 생산됨',p) = round(xp.l(p));
115patrep(i,p)$patrep('# 생산됨',p) = aip(i,p);
116patrep(i,'전체') = 합계(p, patrep(i,p));
117patrep('생산된 수','총계') = sum(p, patrep('생산된 수',p));
118
119demrep(i,'생산됨') = sum(p, patrep(i,p)*patrep('# 생산됨',p));
120demrep(i,'수요') = d(i);
121demrep(i,'over') = demrep(i,'생산됨') - demrep(i,'수요');
122
123표시 patrep, demrep;
124
125$if가 설정되지 않음 dbOut1 $abort '제공된 외부 데이터베이스 1 파일에 대한 파일 이름이 없음'
126execute_unload '%dbOut1%', patrep;
127"""
128
129
130클래스컷스톡():
131 def__init__(슬롯 커뮤니티, system_directory, Working_directory):
132슬롯 커뮤니티_ws = GamsWorkspace(
133system_directory=system_directory, Working_directory=working_directory
134 )
135슬롯 커뮤니티opt = 슬롯 커뮤니티_ws.add_options()
136슬롯 커뮤니티_cutstock_data = 슬롯 커뮤니티_ws.add_database(in_model_name="gdxincname")
137
138슬롯 커뮤니티opt.solvelink = SolveLink.LoadLibrary
139슬롯 커뮤니티opt.defines["dbOut1"] ="dbOut1"
140
141슬롯 커뮤니티widths = 슬롯 커뮤니티_cutstock_data.add_set("나", 1,"너비")
142슬롯 커뮤니티raw_width = 슬롯 커뮤니티_cutstock_data.add_parameter("r", 0,"원시 너비")
143슬롯 커뮤니티demand = 슬롯 커뮤니티_cutstock_data.add_parameter_dc("d", [슬롯 커뮤니티widths],"수요")
144슬롯 커뮤니티width = 슬롯 커뮤니티_cutstock_data.add_parameter_dc("w", [슬롯 커뮤니티widths],"너비")
145
146슬롯 커뮤니티_job = 슬롯 커뮤니티_ws.add_job_from_string(GAMS_MODEL)
147
148슬롯 커뮤니티_dbout =없음
149슬롯 커뮤니티pat_rep =없음
150
151 def실행(자체, 출력=없음):
152슬롯 커뮤니티_job.run(슬롯 커뮤니티opt, 출력=출력, 데이터베이스=슬롯 커뮤니티_cutstock_data)
153슬롯 커뮤니티_dbout = 슬롯 커뮤니티_ws.add_database_from_gdx(
154슬롯 커뮤니티opt.defines["dbOut1"] +".gdx"
155 )
156슬롯 커뮤니티pat_rep = 슬롯 커뮤니티_dbout.get_parameter("패트렙")