first version of README
This commit is contained in:
parent
cb988c68d9
commit
560227cecf
1 changed files with 209 additions and 0 deletions
209
README.md
Normal file
209
README.md
Normal file
|
@ -0,0 +1,209 @@
|
|||
get the code
|
||||
============
|
||||
|
||||
$ git clone git@github.com:josch/sisyphus.git
|
||||
$ cd sisyphus
|
||||
|
||||
|
||||
compile evaluation library
|
||||
==========================
|
||||
|
||||
$ wget http://sourceforge.net/projects/moast/files/Pallet%20Viewer/Version%203/palletandtruckviewer-3.0.tar.gz
|
||||
$ tar xf palletandtruckviewer-3.0.tar.gz
|
||||
$ cd palletandtruckviewer-3.0
|
||||
$ patch -p0 < ../palletViewer-sharedlib.diff
|
||||
$ autoreconf -fi
|
||||
$ ./configure --libdir=`pwd`/..
|
||||
$ make
|
||||
$ make install-strip
|
||||
$ cd ..
|
||||
|
||||
test evaluation library (optional)
|
||||
==================================
|
||||
|
||||
$ python evaluate_multi.py examples/icra2012/packlist_R1.xml examples/icra2012/scorecog.xml
|
||||
|
||||
$ python evaluate.py examples/icra2012/Challenge2.order.xml examples/icra2012/packlist_R2.xml examples/icra2012/scorecog.xml
|
||||
|
||||
$ python evaluate.py examples/icra2012/Challenge2.order.xml examples/icra2012/packlist_R3.xml examples/icra2012/scorecogoverlap.xml
|
||||
|
||||
generate packlist files
|
||||
=======================
|
||||
|
||||
$ ./run.sh examples/icra2011/palDay1R1Order.xml packlist.xml examples/icra2011/scoreAsPlannedConfig1.xml
|
||||
|
||||
Usage
|
||||
=====
|
||||
|
||||
bruteforce2.py takes an order.xml and tries different strategies to create many
|
||||
lists of layerlists. Each layerlist is built with a different selection of
|
||||
strategies. Available strategies are article rotation and pallet rotation which
|
||||
can both be either true or false. Per default, bruteforce2.py tries all
|
||||
combinations of article and pallet rotations, which means that for each new
|
||||
layer, there are four possibilities how articles can be arranged in it.
|
||||
|
||||
A layerlist is the result of one specific combinations of strategies. For
|
||||
example: first layer with article rotation and pallet rotation, second layer
|
||||
without article rotation but with pallet rotation, third layer with neither and
|
||||
so forth.
|
||||
|
||||
bruteforce2.py outputs those layerlists one per line in python pickle gzipped
|
||||
and base64 encoded format. Python pickle is used as a fast serialization
|
||||
format. The data is gzipped because it is given to bruteforce3.py as a
|
||||
commandline argument and those must not exceed an OS specific value. The data
|
||||
is base64 encoded to avoid zero bytes, newlines and other whitespace characters
|
||||
in them.
|
||||
|
||||
As a result, the output of bruteforce2.py can not only be saved in a file, but
|
||||
you can also used split(1) on it to distribute it onto many machines for
|
||||
evaluations. You can also use head(1), tail(1), sort(1) or uniq(1) on the
|
||||
output.
|
||||
|
||||
bruteforce3.py takes as arguments an order.xml, a packlist.xml output file, a
|
||||
scoring.xml file and a number of layerlists, encoded as described above. For
|
||||
each layerlist it will try every possible permutation of how to place them on
|
||||
top of each other and evaluate each of them by using palletViewer.
|
||||
|
||||
Multiple instances of bruteforce3.py can be run on the same machine. Before
|
||||
bruteforce3.py exits, it will put a file lock on score_max.lock and read the
|
||||
currently highest score from score_max. If the just calculated score is higher,
|
||||
it will write its own score into score_max and update the contents of
|
||||
packlist.xml as well.
|
||||
|
||||
Since score_max always contains the currently highest score, it can always
|
||||
easily be checked during a run, what the currently highest score achieved is.
|
||||
|
||||
Since packlist.xml always contains the best packlist found so far,
|
||||
bruteforce3.py can always be aborted in the middle of execution, should it take
|
||||
too long to evaluate while still maintaining the current best packlist. One
|
||||
does not need to wait until run.sh finished execution.
|
||||
|
||||
Since score_max contains the highest score, it should be removed before each
|
||||
new run. This is already done by run.sh.
|
||||
|
||||
environment variables
|
||||
=====================
|
||||
|
||||
bruteforce2
|
||||
-----------
|
||||
|
||||
rot_article - try different article rotations (default: True)
|
||||
rot_pallet - try different pallet rotations (default: True)
|
||||
rot_article_default - default article rotation (default: False)
|
||||
rot_pallet_default - default pallet rotation (default: False)
|
||||
iterations - maximum number of iterations (default: -1)
|
||||
randomize - try random strategies instead of sequential (default: False)
|
||||
|
||||
bruteforce3
|
||||
-----------
|
||||
|
||||
multi_pallet - respect pallet max height and spread over multiple pallets (default: False)
|
||||
permutations - whether to try all layer permutations or not permute at all (default: True)
|
||||
iterations - maximum number of iterations (default: -1)
|
||||
randomize - try random strategies instead of sequential (default: False)
|
||||
|
||||
For orders that are too big to enumerate all possible permutations of layer
|
||||
strategies and orderings, using randomize and iterations for bruteforce2.py and
|
||||
bruteforce3.py is recommended.
|
||||
|
||||
The according line in run.sh could be changed to:
|
||||
|
||||
iterations=100 randomize=1 python bruteforce2.py $1 | randomize=1 iterations=1000 xargs --max-procs=4 --max-args=1 python bruteforce3.py $1 $2 $3
|
||||
|
||||
utility scripts
|
||||
===============
|
||||
|
||||
add_approach_points.py
|
||||
|
||||
takes a single or multi pallet packlist.xml and adds the three approach
|
||||
points to all the articles in it, relative to each articles position
|
||||
|
||||
barcodes.py
|
||||
|
||||
takes an order.xml and prints all barcodes in it
|
||||
|
||||
densities.py
|
||||
|
||||
takes an order.xml and prints the density of all articles
|
||||
|
||||
descriptions.py
|
||||
|
||||
takes an order.xml and prints a table with the description, ID, type,
|
||||
family, size and weight of every article
|
||||
|
||||
evaluate_multi.py
|
||||
|
||||
takes a multiple pallet packlist.xml and a scoring.xml and prints out
|
||||
the score that this packlist achieves
|
||||
|
||||
evaluate.py
|
||||
|
||||
takes an order.xml, a single pallet packlist.xml and a scoring.xml and
|
||||
prints out the score that this packlist achieves
|
||||
|
||||
num_articles_order.py
|
||||
|
||||
takes an order.xml and prints the number of articles within
|
||||
|
||||
num_articles_packlist.py
|
||||
|
||||
takes a single or multi pallet packlist.xml and prints the number of
|
||||
articles within
|
||||
|
||||
pallets.py
|
||||
|
||||
takes an order.xml and prints a table with the length, width, maximum
|
||||
load height and maximum load weight
|
||||
|
||||
split_multi.py
|
||||
|
||||
takes a multiple pallet packlist.xml and outputs pairs of single pallet
|
||||
packlist.xml and order.xml files by appending _$i.xml and _order_$i.xml
|
||||
to the original packlist.xml filename, respectively. The integer $i
|
||||
starts at 0 and will be incremented with each subsequent pallet.
|
||||
|
||||
evaluation of multi pallet packlists
|
||||
====================================
|
||||
|
||||
palletViewer cannot parse multi pallet packlists, hence the packlists have to
|
||||
be split into several single pallet packlists. Each of those packlists is then
|
||||
given to palletViewer for evaluation. The individual results are averaged for a
|
||||
final score. To avoid each of the palletViewer instances complain about missing
|
||||
articles, an according order.xml file is created for each single pallet
|
||||
packlist.xml.
|
||||
|
||||
Multi pallet packlists can evaluated like this:
|
||||
|
||||
python evaluate_multi.py packlist.xml scoring.xml
|
||||
|
||||
Or manually like this:
|
||||
|
||||
python split_multi.py packlist.xml
|
||||
python evaluate.py packlist.xml_order_0.xml packlist_R1.xml_0.xml scoring.xml
|
||||
python evaluate.py packlist.xml_order_1.xml packlist_R1.xml_1.xml scoring.xml
|
||||
...
|
||||
|
||||
bugs
|
||||
====
|
||||
|
||||
there is a "memory leak" in bruteforce3.py. Every loop iteration where a new
|
||||
permutation is tried out will stay in memory. This is not needed and should not
|
||||
be the case. This is the reason why run.sh supplies bruteforce3.py with only
|
||||
one layerlist at a time because otherwise, memory consumption would grow too
|
||||
big.
|
||||
|
||||
ICRA 2012 VMAC
|
||||
==============
|
||||
|
||||
Sisyphus won the IEEE ICRA 2012 Virtual Manufacturing Automation Competition.
|
||||
Here is some media about our submission:
|
||||
|
||||
Round1: ./examples/icra2012/packlist_R1.xml
|
||||
|
||||
Round2: ./examples/icra2012/packlist_R2.xml
|
||||
|
||||
Round3: ./examples/icra2012/packlist_R3.xml
|
||||
|
||||
announcement: http://youtu.be/8fYF-Ldi1NQ
|
||||
|
||||
presentation: http://youtu.be/FSqjGiVt50I
|
Loading…
Reference in a new issue