From 88c418eedc42620eaaeda9b79099062d0d3ab33b Mon Sep 17 00:00:00 2001 From: Florian Fontan Date: Mon, 11 Nov 2024 21:52:44 +0100 Subject: [PATCH] Update doc --- doc/boxstacks.md | 1 - doc/boxstacks.rst | 4 + doc/conf.py | 12 +- doc/img/getting_started_solution.png | Bin 0 -> 116155 bytes doc/index.rst | 180 +++++++++++++++++++++++++-- doc/irregular.md | 1 - doc/irregular.rst | 4 + doc/objectives.md | 1 - doc/objectives.rst | 4 + doc/onedimensional.md | 1 - doc/onedimensional.rst | 4 + doc/rectangle.md | 1 - doc/rectangle.rst | 4 + doc/rectangleguillotine.md | 1 - doc/rectangleguillotine.rst | 4 + 15 files changed, 203 insertions(+), 19 deletions(-) delete mode 100644 doc/boxstacks.md create mode 100644 doc/boxstacks.rst create mode 100644 doc/img/getting_started_solution.png delete mode 100644 doc/irregular.md create mode 100644 doc/irregular.rst delete mode 100644 doc/objectives.md create mode 100644 doc/objectives.rst delete mode 100644 doc/onedimensional.md create mode 100644 doc/onedimensional.rst delete mode 100644 doc/rectangle.md create mode 100644 doc/rectangle.rst delete mode 100644 doc/rectangleguillotine.md create mode 100644 doc/rectangleguillotine.rst diff --git a/doc/boxstacks.md b/doc/boxstacks.md deleted file mode 100644 index f14675b6..00000000 --- a/doc/boxstacks.md +++ /dev/null @@ -1 +0,0 @@ -# BoxStacks solver diff --git a/doc/boxstacks.rst b/doc/boxstacks.rst new file mode 100644 index 00000000..43990634 --- /dev/null +++ b/doc/boxstacks.rst @@ -0,0 +1,4 @@ +.. _boxstacks: + +BoxStacks solver +================ diff --git a/doc/conf.py b/doc/conf.py index 7bf72f59..50bd5904 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -6,9 +6,9 @@ # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information -project = 'Example' -copyright = 'workshop participant' -author = 'workshop participant' +project = 'PackingSolver' +copyright = '2019-2024, Florian Fontan' +author = 'Florian Fontan' release = '0.1' @@ -24,5 +24,9 @@ # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -html_theme = 'sphinx_rtd_theme' +# html_theme = 'sphinx_rtd_theme' +# html_theme = 'alabaster' +# html_theme = 'sphinx_book_theme' +html_theme = 'classic' html_static_path = ['_static'] +html_sidebars = { '**': ['searchbox.html', 'globaltoc.html', 'localtoc.html'] } diff --git a/doc/img/getting_started_solution.png b/doc/img/getting_started_solution.png new file mode 100644 index 0000000000000000000000000000000000000000..41a812461f6568bf6e869782a635bbfb04ecc5bf GIT binary patch literal 116155 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 O00K`}KbLh*2~7YJBr~f3 literal 0 HcmV?d00001 diff --git a/doc/index.rst b/doc/index.rst index 25a39edf..51655fa6 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -2,8 +2,20 @@ PackingSolver's documentation ============================= .. toctree:: - :maxdepth: 2 - :caption: Contents: + :maxdepth: 3 + :hidden: + + self + objectives + rectangleguillotine + rectangle + boxstacks + onedimensional + irregular + + +Introduction +------------ `PackingSolver` is a software package dedicated to the practical resolution of cutting and packing problems. @@ -17,10 +29,160 @@ Then `PackingSolver` outputs the cutting/loading plans. PackingSolver solves multiple problem types: -| Problem types | Examples | -:------------------------- |:------------------------- -[`rectangleguillotine`](rectangleguillotine)
  • Items: two-dimensional rectangles
  • Only edge-to-edge cuts are allowed
| -[`rectangle`](rectangle)
  • Items: two-dimensional rectangles
| -[`boxstacks`](boxstacks)
  • Items: three-dimensional rectangular parallelepipeds
  • Items can be stacked; a stack contains items with the same width and length
| -[`onedimensional`](onedimensional)
  • Items: one-dimensional items
| -[`irregular`](irregular)
  • Items: two-dimensional polygons
| +.. |rectangleguillotine| image:: ../img/rectangleguillotine.png + :width: 512pt +.. |rectangle| image:: ../img/rectangle.png + :width: 512pt +.. |boxstacks| image:: ../img/boxstacks.png + :width: 512pt +.. |onedimensional| image:: ../img/onedimensional.png + :width: 512pt +.. |irregular| image:: ../img/irregular.png + :width: 512pt + + +.. list-table:: + :widths: 1, 1 + :align: center + + * - :ref:`RectangleGuillotine` + + * Items: two-dimensional rectangles + * Only edge-to-edge cuts are allowed + - |rectangleguillotine| + * - :ref:`Rectangle` + + * Items: two-dimensional rectangles + - |rectangle| + * - :ref:`BoxStacks` + + * Items: three-dimensional rectangular parallelepipeds + * Items can be stacked; a stack contains items with the same width and length + - |boxstacks| + * - :ref:`OneDimensional` + + * Items: one-dimensional items + - |onedimensional| + * - :ref:`Irregular` + + * Items: two-dimensional polygons + - |irregular| + +Getting started +--------------- + +Let's see how to solve a simple rectangle packing problem. + +In a first CSV file, we provide the width, height and number of copies of the items to pack. +Here we consider two items: + +* The first one has a width of 300, a height of 200 and 10 copies. +* The second one has a width of 250, a height of 150 and 10 copies. + +.. code-block:: none + :caption: items.csv + + WIDTH,HEIGHT,COPIES + 300,200,10 + 250,150,10 + +In a second CSV file, we provide the width, height and number of copies of the bins in which the items must be packed. +Here we consider a single container of width 1000 and of height 500 available in 10 copies. + +.. code-block:: none + :caption: bin.csv + + WIDTH,HEIGHT,COPIES + 1000,500,10 + +Finally, in a third CSV file, we provide the other optimizaton parameters. Here we just set the :code:`objective` parameter to :code:`bin-packing`, which means that we look to pack all items while minimizing the number of bin used. The :ref:`objectives` page gives more details about the possible objectives. + +.. code-block:: none + :caption: parameters.csv + + NAME,VALUE + objective,bin-packing + +Now, we use the following command to launch the optimization: + +.. code-block:: shell + + packingsolver_rectangle \ + --items items.csv \ + --bins bins.csv \ + --parameters parameters.csv \ + --certificate solution_rectangle.csv + +The terminal output looks like: + +.. code-block:: none + + ================================= + PackingSolver + ================================= + + Problem type + ------------ + Rectangle + + Instance + -------- + Objective: BinPacking + Number of item types: 2 + Number of items: 20 + Number of bin types: 1 + Number of bins: 10 + Number of groups: 1 + Number of defects: 0 + Unloading constraint: None + Total item area: 975000 + Total item width: 5500 + Total item height: 3500 + Smallest item width: 150 + Smallest item height: 150 + Total bin area: 5000000 + Total item weight: 0 + Total bin weight: 0 + + Time Bins Full waste (%) Comment + ---- ---- -------------- ------- + 0.001 3 35.00 TS g 0 d X q 1 + 0.002 2 2.50 TS g 0 d X q 9 + + Final statistics + ---------------- + Time (s): 0.0166683 + + Solution + -------- + Number of items: 20 / 20 (100%) + Item area: 975000 / 975000 (100%) + Item weight: 0 / 0 (-nan%) + Item profit: 975000 / 975000 (100%) + Number of bins: 2 / 10 (20%) + Bin area: 1000000 / 5000000 (20%) + Bin weight: 0 / 0 (-nan%) + Bin cost: 1e+06 + Waste: 25000 + Waste (%): 2.5 + Full waste: 25000 + Full waste (%): 2.5 + Area load: 0.195 + Weight load: -nan + X max: 1000 + Y max: 500 + Leftover value: 0 + +From the terminal output, we see that the solver managed to pack all the items using two bins. +The loading plans are written in the :code:`solution_rectangle.csv` file. A script is available to visualize them: + +.. code-block:: shell + + python3 scripts/visualize_rectangle.py solution_rectangle.csv + +The script should open a page in a browser where the loading plans are displayed: + +.. image:: img/getting_started_solution.png + :width: 256pt + :align: center + diff --git a/doc/irregular.md b/doc/irregular.md deleted file mode 100644 index 3cc9a5e2..00000000 --- a/doc/irregular.md +++ /dev/null @@ -1 +0,0 @@ -# Irregular solver diff --git a/doc/irregular.rst b/doc/irregular.rst new file mode 100644 index 00000000..e34db19b --- /dev/null +++ b/doc/irregular.rst @@ -0,0 +1,4 @@ +.. _irregular: + +Irregular solver +================ diff --git a/doc/objectives.md b/doc/objectives.md deleted file mode 100644 index 192e86b7..00000000 --- a/doc/objectives.md +++ /dev/null @@ -1 +0,0 @@ -# Objectives diff --git a/doc/objectives.rst b/doc/objectives.rst new file mode 100644 index 00000000..99576fbd --- /dev/null +++ b/doc/objectives.rst @@ -0,0 +1,4 @@ +.. _objectives: + +Objectives +========== diff --git a/doc/onedimensional.md b/doc/onedimensional.md deleted file mode 100644 index 44a80c7b..00000000 --- a/doc/onedimensional.md +++ /dev/null @@ -1 +0,0 @@ -# OneDimensional solver diff --git a/doc/onedimensional.rst b/doc/onedimensional.rst new file mode 100644 index 00000000..c7cc310a --- /dev/null +++ b/doc/onedimensional.rst @@ -0,0 +1,4 @@ +.. _onedimensional: + +OneDimensional solver +===================== diff --git a/doc/rectangle.md b/doc/rectangle.md deleted file mode 100644 index d766551e..00000000 --- a/doc/rectangle.md +++ /dev/null @@ -1 +0,0 @@ -# Rectangle solver diff --git a/doc/rectangle.rst b/doc/rectangle.rst new file mode 100644 index 00000000..0f0865cd --- /dev/null +++ b/doc/rectangle.rst @@ -0,0 +1,4 @@ +.. _rectangle: + +Rectangle solver +================ diff --git a/doc/rectangleguillotine.md b/doc/rectangleguillotine.md deleted file mode 100644 index 5ff4e052..00000000 --- a/doc/rectangleguillotine.md +++ /dev/null @@ -1 +0,0 @@ -# RectangleGuillotine solver diff --git a/doc/rectangleguillotine.rst b/doc/rectangleguillotine.rst new file mode 100644 index 00000000..4ef3338e --- /dev/null +++ b/doc/rectangleguillotine.rst @@ -0,0 +1,4 @@ +.. _rectangleguillotine: + +RectangleGuillotine solver +==========================