@@ -115,58 +115,58 @@ def solve(self, environment):
115115 for wj , hj , dj in permutations (self .box_dimensions [j ]):
116116 l += 1
117117 solver .Add (
118- x [i , k ] - x [j , l ] + W * lij [(i , k ), (j , l )] <= W - wi + self . M * ( 2 - si [( i , k )] - si [( j , l )]) ,
118+ x [( i , k ) ] - x [( j , l ) ] + W * lij [(i , k ), (j , l )] <= W - wi ,
119119 )
120120 solver .Add (
121- x [j , l ] - x [i , k ] + W * rij [(i , k ), (j , l )] <= W - wj + self . M * ( 2 - si [( i , k )] - si [( j , l )]) ,
121+ x [( j , l ) ] - x [( i , k ) ] + W * rij [(i , k ), (j , l )] <= W - wj ,
122122 )
123123 solver .Add (
124- y [i , k ] - y [j , l ] + H * uij [(i , k ), (j , l )] <= H - hi + self . M * ( 2 - si [( i , k )] - si [( j , l )]) ,
124+ y [( i , k ) ] - y [( j , l ) ] + H * uij [(i , k ), (j , l )] <= H - hi ,
125125 )
126126 solver .Add (
127- y [j , l ] - y [i , k ] + H * fij [(i , k ), (j , l )] <= H - hj + self . M * ( 2 - si [( i , k )] - si [( j , l )]) ,
127+ y [( j , l ) ] - y [( i , k ) ] + H * fij [(i , k ), (j , l )] <= H - hj ,
128128 )
129129 solver .Add (
130- z [i , k ] - z [j , l ] + D * oij [(i , k ), (j , l )] <= D - di + self . M * ( 2 - si [( i , k )] - si [( j , l )]) ,
130+ z [( i , k ) ] - z [( j , l ) ] + D * oij [(i , k ), (j , l )] <= D - di ,
131131 )
132132 solver .Add (
133- z [j , l ] - z [i , k ] + D * bij [(i , k ), (j , l )] <= D - dj + self . M * ( 2 - si [( i , k )] - si [( j , l )]) ,
133+ z [( j , l ) ] - z [( i , k ) ] + D * bij [(i , k ), (j , l )] <= D - dj ,
134134 )
135- solver .Add (x [i , k ] >= 0 )
136- solver .Add (y [i , k ] >= 0 )
137- solver .Add (z [i , k ] >= 0 )
138- solver .Add (x [i , k ] + wi <= W )
139- solver .Add (y [i , k ] + hi <= H )
140- solver .Add (z [i , k ] + di <= D )
141-
142- # Set 18: Binary constraints for rij,lij,bij,fij,uij
143- for j in range (n ):
144- if i != j :
145- for k in range (6 ):
146- for l in range (6 ):
147- for var , name in [
148- (rij [(i , k ), (j , l )], "rij" ),
149- (lij [(i , k ), (j , l )], "lij" ),
150- (bij [(i , k ), (j , l )], "bij" ),
151- (fij [(i , k ), (j , l )], "fij" ),
152- (uij [(i , k ), (j , l )], "uij" ),
153- (oij [(i , k ), (j , l )], "oij" ),
154- ]:
155- solver .Add (var >= 0 , f"binary_{ name } _lower_{ i } _{ j } " )
156- solver .Add (var <= 1 , f"binary_{ name } _upper_{ i } _{ j } " )
157-
158- for k in range (6 ):
159-
160- # Set 21: Binary constraints for si and Cs variables
161- solver .Add (si [(i , k )] >= 0 , f"binary_si_lower_{ i } " )
162- solver .Add (si [(i , k )] <= 1 , f"binary_si_upper_{ i } " )
163-
164- # Set 22: Non-negativity constraints for coordinates
165- solver .Add (x [(i , k )] >= 0 , f"nonnegative_x_{ i } " )
166- solver .Add (y [(i , k )] >= 0 , f"nonnegative_y_{ i } " )
167- solver .Add (z [(i , k )] >= 0 , f"nonnegative_z_{ i } " )
168-
169- solver .Add (sum ( si [(i , k )] for k in range ( 6 )) <= 1 , f"single_box_ { i } " )
135+ solver .Add (x [( i , k ) ] >= 0 )
136+ solver .Add (y [( i , k ) ] >= 0 )
137+ solver .Add (z [( i , k ) ] >= 0 )
138+ solver .Add (x [( i , k ) ] + wi <= W )
139+ solver .Add (y [( i , k ) ] + hi <= H )
140+ solver .Add (z [( i , k ) ] + di <= D )
141+
142+ # Set 18: Binary constraints for rij,lij,bij,fij,uij
143+ for j in range (n ):
144+ if i != j :
145+ for k in range (6 ):
146+ for l in range (6 ):
147+ for var , name in [
148+ (rij [(i , k ), (j , l )], "rij" ),
149+ (lij [(i , k ), (j , l )], "lij" ),
150+ (bij [(i , k ), (j , l )], "bij" ),
151+ (fij [(i , k ), (j , l )], "fij" ),
152+ (uij [(i , k ), (j , l )], "uij" ),
153+ (oij [(i , k ), (j , l )], "oij" ),
154+ ]:
155+ solver .Add (var >= 0 , f"binary_{ name } _lower_{ i } _{ j } " )
156+ solver .Add (var <= 1 , f"binary_{ name } _upper_{ i } _{ j } " )
157+
158+ for k in range (6 ):
159+
160+ # Set 21: Binary constraints for si and Cs variables
161+ solver .Add (si [(i , k )] >= 0 , f"binary_si_lower_{ i } " )
162+ solver .Add (si [(i , k )] <= 1 , f"binary_si_upper_{ i } " )
163+
164+ # Set 22: Non-negativity constraints for coordinates
165+ solver .Add (x [(i , k )] >= 0 , f"nonnegative_x_{ i } " )
166+ solver .Add (y [(i , k )] >= 0 , f"nonnegative_y_{ i } " )
167+ solver .Add (z [(i , k )] >= 0 , f"nonnegative_z_{ i } " )
168+
169+ solver .Add (si [( i , 0 )] + si [(i , 1 )] + si [( i , 2 )] + si [( i , 3 )] + si [( i , 4 )] + si [( i , 5 )] <= 1 , f"one_orientation_ { i } " )
170170
171171 print ("All constraints added" )
172172 print ("Number of variables =" , solver .NumVariables ())
@@ -178,32 +178,34 @@ def solve(self, environment):
178178 print ("Solution:" )
179179 print ("Objective value =" , solver .Objective ().Value ())
180180 for i in range (n ):
181- print (f"Box { i } : { si [i ].solution_value ()} " )
182- if si [i ].solution_value () > 0.5 :
183- pkg = environment .packages [i ]
184- coords = (
185- Point (
186- x [i ].solution_value (),
187- y [i ].solution_value (),
188- z [i ].solution_value (),
189- ),
190- Point (
191- x [i ].solution_value () + self .box_dimensions [i ][0 ],
192- y [i ].solution_value () + self .box_dimensions [i ][1 ],
193- z [i ].solution_value () + self .box_dimensions [i ][2 ],
194- ),
195- )
196- environment .add_package (pkg , container , coords )
197- print (f"Box { i } packed at { coords } " )
181+ for k in range (6 ):
182+ if si [(i , k )].solution_value () > 0.5 :
183+ print (si [(i , k )].solution_value ())
184+ print (f"Box { i } orientation { k } at ({ x [(i , k )].solution_value ()} , { y [(i , k )].solution_value ()} , { z [(i , k )].solution_value ()} )" )
185+ pkg = environment .packages [i ]
186+ coords = (
187+ Point (
188+ x [(i , k )].solution_value (),
189+ y [(i , k )].solution_value (),
190+ z [(i , k )].solution_value (),
191+ ),
192+ Point (
193+ x [(i , k )].solution_value () + self .box_dimensions [i ][0 ],
194+ y [(i , k )].solution_value () + self .box_dimensions [i ][1 ],
195+ z [(i , k )].solution_value () + self .box_dimensions [i ][2 ],
196+ ),
197+ )
198+ environment .add_package (pkg , container , coords )
199+ print (f"Box { (i , k )} packed at { coords } " )
198200 packed_value = sum (
199- self .box_values [i ] for i in range (n ) if si [i ].solution_value () > 0.5
200- )
201+ self .box_values [i ] for i in range (n ) for k in range ( 6 ) if si [( i , k ) ].solution_value () > 0.5
202+ )
201203 used_volume = sum (
202204 self .box_dimensions [i ][0 ]
203205 * self .box_dimensions [i ][1 ]
204206 * self .box_dimensions [i ][2 ]
205207 for i in range (n )
206- if si [i ].solution_value () > 0.5
208+ for k in range ( 6 ) if si [( i , k ) ].solution_value () > 0.5
207209 )
208210 total_volume = W * H * D
209211 print (f"Total packed value: { packed_value } " )
0 commit comments