Liste d'optimisation pour débit de bois
Bonjour à tous,
Je travail dans un BET bois et je cherche un moyen d'optimiser des longueurs de bois.
Je m'explique :
J'utilise un logiciel de CAO qui me permet de dessiner des ouvrages et ensuite d'exporter et même optimiser les listes des bois utilisé pour l'ouvrage en question. Le problème est que j'ai besoin des classer ces bois par sous-groupe et donc de les débiter par sous-groupe. Mon logiciel est capable de faire cela mais de manière incomplète (voir Screenshot ci-dessous)
Sur le screenshot, on peut voir le résultat de l'optimisation de mon logiciel : J'ai renseigner le nombre et la longueur de barres disponible dans mon stock. Puis le programme a comparé mon stock avec les barres nécessaire pour menez à bien mon projet.
Le problème de son optimisation comme vous pouvez le voir sur l'image, c'est que pour le sous-groupe n°1, il y a des chutes énormes qui pourrait être utiliser dans le sous-groupe n°2. Mais le programme considère ces chutes comme de la perte pure !
Je vous appel à l'aide pour savoir s'il serait possible d'utiliser la liste de production et la liste des bois brute dans mon stock pour créer une liste d'optimisation par sous-groupe Tout en tenant compte des chutes de chaque sous-groupe afin de les imputer sur le sous-groupe suivant.
Si je récapitule, j'ai :
- 1 liste de production classé par sous-groupe
- 1 liste de stock comprenant 110 bois de 6m et 28 bois de 5.1m
Je souhaiterai :
- Comparer les deux liste pur en créer une liste de débit pour la communiquer au charpentier afin d'optimiser les chutes et l'approvisionnement sur le chantier. (Exemple du contenu de la liste : Dans 1 barre de 6m il faut débiter 2 barres de 1.5m et 1 barre de 2.5m, nous auront donc 50cm de chute => 6m=2x1.5m + 1x2.5m)
Mon programme me permet d'exporter la liste des bois à tailler au format Excel que vous trouverez en pièce jointe.
En vous souhaitant bonne lecture
Montie
Bonjour,
C'est un problème en réalité assez complexe si l'on cherche vraiment à obtenir l'optimum parmis toutes les combinaisons possibles.
Ci-après un algorithme de tri (naif) basé sur le fonctionnement suivant :
Tri des découpes de la plus grande à la plus petite, et du stock du plus grand au plus petit.
Recherche pour chaque découpe (en partant de la plus grande vers la fin) des découpes à ajouter possibles, dans le stock dispo (en partant des + grands morceaux du stock, vers les plus petits. Logique puisqu'on essaie de s'occuper d'abord des grandes découpes).
Une fois les combinaisons trouvées, export dans Excel. L'export est adaptable suivant vos besoins bien entendu, il s'agit d'une proposition.
Cliquer sur le bouton "Répartir le stock" pour lancer la macro.
Les résultats obtenus avec votre exemple :
| Pièces utilisées : | |
| 6000 | 110 |
| 5100 | 10 |
| Efficacité moyenne : | |
| 98,19% | |
| Efficacité médiane : | |
| 98,77% |
Le code VBA (nettoyé, le premier fichier joint était plein de tests) pour les curieux. Fonctionnement identique, juste le VBA a changé.
Bonjour Saboh et merci beaucoup pour ton retour.
En effet, ton excel fonctionne super bien par contre l'optimisation se fait sur l'ensemble des bois (Ce qui est la manière la plus économique, nous somme d'accord) mais dans des soucis d'organisation je souhaiterai que l'optimisation se fasse sous-groupe par sous-groupe. Et surtout j'aimerai que les chutes résultante de l'optimisation d'un premier sous-groupe soient agrémenté dans la liste de stock pour les utiliser dans les sous-groupes suivant.
Aujourd'hui mon programme me permet de faire une optimisation par sous-groupe mais il n'utilise pas les chutes résultante d'un sous-groupe pour les passer dans un autre sous-groupe.
AHHHHHH !
Mon dieu j'ai tout à refaire, j'avais compris de travers
Je m'étais posé la question ce matin et puis j'ai oublié de la poser... Bon je vais y réfléchir.
re, salut Saboh12617, je vois que le pourcentage n'est pas bien descendant, donc peut être que le résultat peut encore améliorer un tout petit peu
Il faut aussi ajouter chaque fois une perte de 3 mm pour la scie ?
Salut BsLav,
Oui, l'algorithme utilisé implique que les dernières valeurs auront forcément un rendement inférieur puisqu'on part "du meilleur" vers "le pire"/les restes.
Après le vrai problème dans cette histoire c'est de faire un algo suffisamment rapide pour un problème assez large.
Mais vu que je me suis planté sur la consigne je suis bon pour le revoir je dirai à 50% puisqu'il faut grouper les résultats.
Bonjour BsAlv,
En effet l'idéal serait de tenir compte de l'épaisseur de la lame de 3mm et également d'une coupe en début et fin de barre brute de 10mm chaqu'une (pour faire une coupe droite)
Mais si j'arrive à avoir un résultat même sans ces épaisseurs c'est déjà super !
Bonjour,
Concernant ces histoires de découpes de 10 mm de chaque coté, cela s'applique uniquement sur le stock "de base" ou sur les chutes réutilisables également ?
Au sujet des chutes. Y-a-t-il des contraintes particulières non mentionnées ? (Longueur min, dimensions "standards", ou autres ?). Voulez-vous qu'après l'exécution les chutes soient reportées dans la liste du stock ?
Pour ma part je pars sur l'hypothèse suivante, la plus facile pour moi :
- Chutes redécoupées de 10 mm x 2 comme le stock initial
- Chutes gardées uniquement si L_chute > L_min (coupes restantes à effectuer)
- Report du stock à la fin (c'est du détail)
Si jamais il y a d'autres contraintes, quelles qu'elles soient (mise en page, méthode de calcul, etc.), n'hésitez surtout pas à les évoquer ! On gagnera du temps.
Bonjour,
En effet, je vais voir pour tous ces détails.
Étant en réunion, je reviens vers vous cet après-midi avec un excel avec mise en page et détails des coupes
Je reviens vers vous avez une MAJ de la macro suivant les demandes d'hier soir.
Je n'ai pas encore implémenté les détails de recoupe (10 mm) et largeur de scie, mais ils sont vraiment faciles à ajouter donc j'attend votre retour sur ce point.
Résultats groupés par "sous-groupe".
La macro est beaucoup plus lente (env. 5s chez moi), c'est normal, le code est "plus intelligent", je chercherai des optimisations si c'est genant.
Ci-joint fichier. Vous pouvez voir en colonne M certaines chutes réutilisées.
bonjour Montie, Saboh12617,
voici ma version, j'avais dit des betises hier concernant ce pourcentage descendant.
Ma macro est lente (20 sec) mais utilise déjà la lame et le coupe droit
Salut BsAlv,
Malin l'utilisation combinée des TCD, je me demandais justement s'il n'y avait pas peut etre une solution entièrement TCD ou PowerQuery.
J'ai testé par curiosité et j'ai une erreur après environ 2s sur
i1 = i1 - (aNombre(i1) <= 0)Le tableau semble planter sur le 1e indice uniquement.
Je précise, sur Excel 2016, peut etre qu'il y a derrière un appel à une fonction + moderne.
Saboh, merci beaucoup ! C'est extra ! De mon coté la macro est instantanée. Et c'est exactement le résultat cherché ! Je glisse tout de même mon fichier Excel avec mise en page et davantage de détails concernant les coupes. Merci je suis bluffé par ton expertise !
Bonjour BsAlv,
Merci aussi pour cet Excel ! Etrangement, la macro prend environ 30s chez moi. mais j'ai l'impression que ton optimisation est fait sur l'ensemble des sous-groupes que tu viens par la suite rangés par sous-groupe. De mon coté je cherche à faire une optimisation par sous-groupe, c'est-à-dire, que dans 1 bois du stock, je débite exclusivement des bois pour 1 seul sous-groupe. Et que s'il me reste une chute, que celle-ci soit réemployé pour produire des bois d'un autre sous-groupe, quand c'est possible. Si la chute est inutilisable, j'aimerai la mettre dans un "stock de chutes"
En fait Saboh a vraiment compris ma problématique et a réussi dans son excel.
re,
c''était fait pour excel365, sorry, je regarderai pour le réaliser avec Excel2016.
Si j'utilise 0 mm lame et 0 mm coupe droit, j'ai 97 planches de 6100 et votre solution n'utilise que 96. Je ne sais pas si cela a quelque chose à faire avec les arrondis. (certaines longueurs en colonne D ont 6 chiffres après la virgule !!! et ma macro les utilise tous)
Votre pourcentage, je ne le comprends pas, à mon avis, c'est plus élevé, dans l'exemple dans la PJ, c'est 98,0% pour 84 x 6.100 + 41 x 5.100
Comment faut-il lire mes résultats : voir tableau "Tabel5", ma première planche est 6.100, sans perte pour la lame et le coup droit, une perte de 2 mm et 2 planches comme résultat, une de 179,5 du sousgroupe1 et une de 5.818,5 du sousgroupe6. Compris ?
Le tableau "Tabel6" est la même chose mais avec un layout différent.
PS. pour une lame de 3 mm et coup droit de 10 mm, le résultat est 80 x 6.000 + 47 * 5.100 (pourc = 97,1%)
félications,
je suis surpris que les différences entre les deux façons de penser soient si minimes.Bonsoir,
Merci pour votre retour.
Malheureusement votre mise en page finale est bien trop complexe pour que je puisse m'y adapter. De plus elle requière un enregistrement de trop de paramètres par rapport à la solution que j'ai mise en place. La mienne est plus rapide que celle de BsLav car je me suis reporté à l'essentiel : les longueurs à traiter, et non le nom des barres etc.
Il faudrait revoir quasiment tous le code pour reporter ces valeurs dans mon export.
Je vous joint ci-après le mieux que je puisse renvoyer, sachant que j'ai du adapter beaucoup de choses "juste pour ca". Les cases en orange sont celles utilisées par le programme.
Je pense par ailleurs qu'une approche PowerQuery en complément peut vous permettre de retrouver un certain nombre d'infos, mais ça c'est hors de mes compétences. De meme je vous laisse/passe la main pour les détails de mise en page, je trouve ça terriblement chronophage. (moi j'aime surtout les algorithmes
La macro est un peu plus lente car davantage de données sont traitées.
j'ai quand-même essayé à améliorer mon fichier, Il est encore lent (oui, 7 sec) mais il vous offre les "N° LP" dans le tableau à partir de la colonne BA.
Les cellules oranges, ce sont des chutes récupérés, mais je vois que par exemple pour les sous-groupe 2 que je récupèr 4x1.860 mais dans ce même sous-groupe je crée 5 nouveau 1.860's
@Saboh12617,
Est-ce possible que votr macro oublie toujours un longueur, dans cette exemple c'est toujours le "299". Si je fais la somme de la colonne D et des colonnes N:Z, il y a cette différence et je n'ai que 344 chiffres au lieu de 345. Bizarre ou drôle ? La feuille "Saboh" et votre macro.
Salut BsAlv, hum non c'est étrange bonne question. Surtout que la découpe correspondante est à-priori bien au milieu de la liste.
Je vois cependant que tu utilises ma première macro. Je comprends puisque tu cherches à faire une répartition globale, mais je n'ai pas fait de vérifications aussi poussées (apparemment j'aurai du ‼).
Mais bon, je pense que ma dernière macro était plus aboutie. C'est pourquoi je l'ai bidouillée rapidement (initialement avec les regroupements) pour ne pas faire de regroupement : maintenant 1 seul groupe = situation initiale.
J'ai également repris l'ancienne fonction d'export pour matcher au mieux ton fichier, meme si la mise en page est un peu différente, c'est le meme export. Attention par contre la fonction a une suppression de l'export précédent intégré, donc si tu l'intègres sur une autre feuille ca peut faire des dégats.
De manière générale tous les appels "en dur" sur XL sont dans la macro CreerRepartition. Si besoin d'ajuster.
Je crois aussi qu'elle n'exporte que sur la feuille "SyntheseSimple", cf. variable globale initialisée dans Sub CreerRepartition. Je t'ai indiqué via
' ECRITURE RESULTATS @BSALV
ExportToXL outputSheet.Cells(rowOffset, 3), groupRepartla ligne ou tu peux modifier la cellule (Top Left) de l'export pour adaptation à tes macros.
La macro fait également appel à 3 variables nommées L_recycl, L_saw, L_ends. Toujours initialisées dans CreerRepartition. Tu peux modifier là, normalement pas d'autres lecture de la feuille en dehors de cette macro.
Bon courage, je te passe la main sur le projet. Si le problème persiste merci de m'en informer je suis vraiment curieux. Je l'ai faite tourner et je retrouve bien les deux coupes 299 via CTRL+F mais je n'ai pas les outils de TCD que tu utilises, et pas le temps de faire la vérif. Je pense que tu sauras adapter, si tu as des questions n'hésite pas !
EDIT : en faisant la somme sur SynthèseSimple colonne E (Lg coupée) je retrouve la somme de ta feuille (699 106).