Wadaboa / 3d-bpp

3D bin packing solutions with layers and superitems, for Artificial Intelligence in Industry class at UNIBO
MIT License
115 stars 24 forks source link

object of type 'generator' has no len() #2

Open sangnguyens opened 2 years ago

sangnguyens commented 2 years ago

Hi, when I execute the bl_bin_pool = main.main(bl_order, procedure="bl", tlim=20), error appears:

TypeError Traceback (most recent call last) Input In [24], in <cell line: 1>() ----> 1 bl_bin_pool = main.main(bl_order, procedure="bl", tlim=20) 2 bl_bin_pool.get_original_layer_pool().to_dataframe()

File ~/Documents/3d-bpp/src/main.py:194, in main(order, procedure, max_iters, superitems_horizontal, superitems_horizontal_type, superitems_max_vstacked, density_tol, filtering_two_dims, filtering_max_coverage_all, filtering_max_coverage_single, tlim, enable_solver_output, height_tol, cg_use_height_groups, cg_mr_warm_start, cg_max_iters, cg_max_stag_iters, cg_sp_mr, cg_sp_np_type, cg_sp_p_type, cg_return_only_last) 192 # Call the right packing procedure 193 if procedure == "bl": --> 194 layer_pool = baseline.baseline(superitems_pool, config.PALLET_DIMS, tlim=tlim) 195 elif procedure == "mr": 196 layer_pool = maxrects_warm_start( 197 superitems_pool, height_tol=height_tol, density_tol=density_tol, add_single=False 198 )

File ~/Documents/3d-bpp/src/baseline.py:166, in baseline(superitems_pool, pallet_dims, tlim, num_workers) 164 # Call the baseline model 165 logger.info("Solving baseline model") --> 166 sol, solve_time = baseline_model( 167 fsi, ws, ds, hs, pallet_dims, tlim=tlim, num_workers=num_workers 168 ) 169 logger.info(f"Solved baseline model in {solve_time:.2f} seconds")

File ~/Documents/3d-bpp/src/baseline.py:62, in baseline_model(fsi, ws, ds, hs, pallet_dims, tlim, num_workers) 58 # Constraints 59 # Ensure that every item is included in exactly one layer 60 for i in range(n_items): 61 model.Add( ---> 62 cp_model.LinearExpr.Sum( 63 fsi[s, i] * zsl[s, l] for s in range(n_superitems) for l in range(max_layers) 64 ) 65 == 1 66 ) 68 # Define the height of layer l 69 for l in range(max_layers):

File ~/Documents/nguyens-RL/nguyens-RL/lib/python3.9/site-packages/ortools/sat/python/cp_model.py:182, in LinearExpr.Sum(cls, expressions) 179 @classmethod 180 def Sum(cls, expressions): 181 """Creates the expression sum(expressions).""" --> 182 if len(expressions) == 1: 183 return expressions[0] 184 return _SumArray(expressions)

Wadaboa commented 2 years ago

Hi,

Thanks for opening the issue.

Could you please dump some information about your Python environment? Also, what is the actual exception raised by the code? I cannot see it in the stacktrace you pasted above.

Thanks, Alessio.

rlacjfjin commented 2 years ago

You can rewrite the wrong part, which may be caused by the inconsistent version of ortools. (my ortools version is 9.3.10497) I have found problems involving the cp_model.LinearExpr.Sum() function, which you can simply write as sum().

I hope to owner (@Wadaboa) provide an environment in which the project can run normally, such as requirements.txt or environment.yml of conda.

And I have a question: You implemented it in the form of constraint programming, but is also can using MIP form, I think two ways are same. Is there any reason for you to choose constraint programming? (For example, constraint programming solver is faster?)

Looking forward to your reply, Thanks.

Zhe

Wadaboa commented 2 years ago

Hi @rlacjfjin,

In the init/ folder you can find 2 files: requirements.txt and environment.yml. The former is for pip environments, while the latter for Conda environments. The README also has a brief Installation section about this. As you can see in the mentioned files, the version of OR-Tools we relied on is 8.2.8710, so I expect the exception above to disappear when the environment is correctly set up. Please let me know if this isn't the case.

As for your question, we implemented the sub-problem as both CP and MIP for education purposes and also because of the additional utilities available in the CP solver, such as decision strategies and search branching methods. In our final tests, we went for MIP in the "no-placement" sub-problem and CP in the "placement" sub-problem: we experimented with different combinations and this one seemed to be the fastest, but this might vary depending on the data you use.

Let me know if you have any other question. Thanks, Alessio.

rlacjfjin commented 2 years ago

@Wadaboa , Thank you, I have no more questions.

kiesoman commented 1 year ago

Hi, It is workable to install the newest version of OR-Tools in environment. However, you should change the the content around 63 line in baseline.py as below: cp_model.LinearExpr.Sum( [fsi[s, i] * zsl[s, l] for s in range(n_superitems) for l in range(max_layers)] ) the argument should be a list, and then it will fit len() requirement.

you also need to change 77 line and 114 line. enjoy.