Expliquons! Le problème du binpacking est le problème d'essayer de minimiser le nombre de bacs d'un certain article de taille aléatoire et de plusieurs bacs de même taille pour les emballer.
Il y a oneDpack. avec invite anaconda
pip install oneDpack
Comment utiliser Entrez la taille du bac comme plafond et la taille de ce que vous voulez mettre dans les articles. Si le plafond est grand, ce sera très lent.
from oneDpack import*
cap=60
items=[2,4,5,2,7,4,7,3,7,3,7,43,8,2,4,13,6,4,3,2,4,7,9,10,40,23]
for i in packing(cap,items):
print(i)
print(sum(i))
production
[4, 13, 43]
60
[2, 3, 4, 4, 7, 40]
60
[2, 2, 3, 3, 4, 7, 7, 7, 7, 8, 10]
60
[2, 4, 5, 6, 9, 23]
49
Il y a un reckpack. avec invite anaconda
pip install reckpack
Comment utiliser Entrez la taille des bacs et les dimensions verticales et horizontales de la cargaison.
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
from collections import*
from rectpack import newPacker
from pandas import*
from numpy import*
bins = [(50,50)]
cargo = [(15,20),(30,20),(15,20),(10,20),(20,14),(15,20),(11,20),(30,10)]
packer = newPacker()
#Réglez le conteneur.
for i, b in enumerate(bins):
packer.add_bin(*b, bid=i)
#Réglez la boîte.
for i, r in enumerate(cargo):
packer.add_rect(*r, rid=i)
#Effectuer un remplissage en masse.
packer.pack()
for i, abin in enumerate(packer,1):
for r in abin:
print(r.x,r.y,r.width, r.height)
production
Renvoie la coordonnée x en bas à gauche, la coordonnée y en bas à gauche, la longueur de gauche à droite et la longueur de bas en haut.
0 0 30 20
30 0 20 15
30 15 20 15
0 30 15 20
0 20 30 10
15 30 14 20
29 30 11 20
40 30 10 20
Il ressemble à ceci lorsqu'il est visualisé.
%matplotlib inline
def draw_result(packer):
#Taille de l'écran
fig = plt.figure(figsize=(20,10))
for i, abin in enumerate(packer,1):
ax = fig.add_subplot(i, len(packer), 1, aspect="equal")
#Dessinez le contenant.
ax.add_patch(Rectangle((0,0), abin.width, abin.height, fc="none", ec="g", lw=2, zorder=10))
for r in abin:
#Dessinez une boîte.
ax.add_patch(Rectangle((r.x, r.y), r.width, r.height, fc="lightblue", ec="k"))
cx, cy = r.x + r.width / 2, r.y + r.height / 2
ax.text(cx, cy, r.rid, ha ="center",va="center", color="k", fontsize=14)
ax.relim()
ax.autoscale_view()
draw_result(packer)
Nous recherchons actuellement, veuillez nous le faire savoir dans les commentaires si vous avez des recommandations.
Recommended Posts