Sommer les valeurs d'une liste pour atteindre une valeur cible
FaNy
-
ccm81 Messages postés 10909 Date d'inscription Statut Membre Dernière intervention -
ccm81 Messages postés 10909 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je souhaiterai créer un programme sous excel me permettant de sommer entre elles les valeurs d'une liste pour atteindre une valeur cible.
A chaque fois qu'une valeur est prise prise en compte dans la combinaison celle-ci ne serait plus prise en compte dans la base de donner.
Mon application est la suivante:
J'ai une liste de 500 valeurs environ qui correspondent à des longueurs de tubes. Ces longueurs doivent être extraitent d'une barre de longueur initiale 6mètre. Mon but est d'optimiser les pertes sur mon tube de 6m et donc de trouver le meilleur ordre pour découper mes tubes.
Voici le lien vers mon fichier exemple:
http://cjoint.com/?0EdwQL3itKA
...Ci quelqu'un peut m'aider à résoudre mon problème, je lui en serait infiniment reconnaissable...!
(et merci à Eric)
Fanny
Je souhaiterai créer un programme sous excel me permettant de sommer entre elles les valeurs d'une liste pour atteindre une valeur cible.
A chaque fois qu'une valeur est prise prise en compte dans la combinaison celle-ci ne serait plus prise en compte dans la base de donner.
Mon application est la suivante:
J'ai une liste de 500 valeurs environ qui correspondent à des longueurs de tubes. Ces longueurs doivent être extraitent d'une barre de longueur initiale 6mètre. Mon but est d'optimiser les pertes sur mon tube de 6m et donc de trouver le meilleur ordre pour découper mes tubes.
Voici le lien vers mon fichier exemple:
http://cjoint.com/?0EdwQL3itKA
...Ci quelqu'un peut m'aider à résoudre mon problème, je lui en serait infiniment reconnaissable...!
(et merci à Eric)
Fanny
A voir également:
- Sommer les valeurs d'une liste pour atteindre une valeur cible
- Liste déroulante excel - Guide
- Logiciel gratuit calcul valeur nutritionnelle - Télécharger - Santé & Bien-être
- Liste déroulante en cascade - Guide
- Valeur ascii - Guide
- Formule excel si contient texte alors valeur ✓ - Forum Excel
10 réponses
Voilà le fameux classeur !
J'en appel a vous pour me corriger !
J'ai un bug que peut-être vous allez pourvoir m'aider a résoudre avant la version final.
Il y aune colonne qui donne la longueur total du tube. Mais étrangement quand elle arrive a 6000 elle affiche 0 au lieu de 6000.
Et j'aimerait savoir si vous pouvez corriger mon calcule de la moyenne parce que la je suis pas du tout sûr.
Après je ferai la version finale.
Même si celle-ci marche déjà très bien :)
https://www.cjoint.com/?0Eor2DV3p43
Pour utiliser la macro : [ALT] + [F8] > Lancer la macro "chercher"
*Pensez mettre vos messages en [Résolu] et cliquer sur le + des conseil qui vous ont été utils"
J'en appel a vous pour me corriger !
J'ai un bug que peut-être vous allez pourvoir m'aider a résoudre avant la version final.
Il y aune colonne qui donne la longueur total du tube. Mais étrangement quand elle arrive a 6000 elle affiche 0 au lieu de 6000.
Et j'aimerait savoir si vous pouvez corriger mon calcule de la moyenne parce que la je suis pas du tout sûr.
Après je ferai la version finale.
Même si celle-ci marche déjà très bien :)
https://www.cjoint.com/?0Eor2DV3p43
Pour utiliser la macro : [ALT] + [F8] > Lancer la macro "chercher"
*Pensez mettre vos messages en [Résolu] et cliquer sur le + des conseil qui vous ont été utils"
Mon but est d'optimiser les pertes sur mon tube de 6m et donc de trouver le meilleur ordre pour découper mes tubes
A faire attention :
cela nous donnera pas forcément le meilleur resultat.
Je comprends pas: le but est bien d'optimiser, non ? Dans ce cas, une macro est nettement insuffisante (c'est un problème de type NP entier, extrêmement complexe à optimiser en fait).
Si l'objectif est juste de trouver une découpe "correcte" alors l'approche des skk201 est acceptable, bien sur.
C'est sur qu'il imposible d'obtenir une lsite de valeur qui donnerons exactement X tubes de 6 mètres.
Mais dans ce cas je vois 3 méthodes qui permettent d'arriver a un résultat qui essaye de limiter les déchet pour chaque barre.
Actuellement théoriquement, je pense que j'arriverait à faire en sorte d'avoir toujours le meilleur rendement, mais il me faudrait des heures de claculs, et des heures de codage. En plus d'un ordinateur très puissant si on veut que les calcules soit pas trop long. Et dans la pratique je suis pas sûr d'arriver a qqchose de concluant :)
Donc je préfère me limiter aux premières méthode qui donnerons un bon résultat, même si c'est pas un résultat parfais.
Mais dans ce cas je vois 3 méthodes qui permettent d'arriver a un résultat qui essaye de limiter les déchet pour chaque barre.
Actuellement théoriquement, je pense que j'arriverait à faire en sorte d'avoir toujours le meilleur rendement, mais il me faudrait des heures de claculs, et des heures de codage. En plus d'un ordinateur très puissant si on veut que les calcules soit pas trop long. Et dans la pratique je suis pas sûr d'arriver a qqchose de concluant :)
Donc je préfère me limiter aux premières méthode qui donnerons un bon résultat, même si c'est pas un résultat parfais.
Bonjour,
Par curiosité, je suis ce sujet.
Le but est bien d'optimiser mais également d'obtenir le meilleur résultat. J'imagine que FaNy ne fait pas cette démarche pour que son entreprise ne gagne au final qu'une centaine d'euros annuellement, mais plus de l'ordre de dizaine de milliers d'euros...
Excel-VBA, bien qu'assez complet, me semble (mais ce n'est que mon avis) un peu limite dans cette situation. Le but ici n'est pas de développer une application (dans ce cas, il conviendrait de s'assurer le secours de développeurs "payants"), mais de créer une macro qui permet cela sous Excel.
Il y a, en effet, plusieurs méthodes pour y parvenir.
La première, et certainement la plus simple, est la mise en oeuvre de l'algorithme glouton du sac à dos.
Non non ce n'est pas une blague.
La seconde utiliserai une fonction récursive pour trouver les solutions et listerai tout cela, en ôtant à chaque "tour de boucle" les références déjà utilisées.
La troisième, et certainement la meilleure que j'ai imaginé, consiste à utiliser la fonction récursive du 2 en cherchant, d'abord, les solutions exactes, puis les autres solutions en augmentant la "marge" progressivement.
J'en suis là de mes réflexions, mais j'arrête aujourd'hui sous risque de claquage du cervelet, j'ai les idées qui se croisent...
D'autres pistes éventuellement sous réserve :
- un arbre magique (avec une jolie classe Noeud) de tous les résultats approchant 6000,
- utiliser le solver Excel (=> je ne connais absolument pas).
- etc...
Par contre, je ne suis pas d'accord avec : Avec une macro c'est tres simple
En tout cas, à demain...
Par curiosité, je suis ce sujet.
Le but est bien d'optimiser mais également d'obtenir le meilleur résultat. J'imagine que FaNy ne fait pas cette démarche pour que son entreprise ne gagne au final qu'une centaine d'euros annuellement, mais plus de l'ordre de dizaine de milliers d'euros...
Excel-VBA, bien qu'assez complet, me semble (mais ce n'est que mon avis) un peu limite dans cette situation. Le but ici n'est pas de développer une application (dans ce cas, il conviendrait de s'assurer le secours de développeurs "payants"), mais de créer une macro qui permet cela sous Excel.
Il y a, en effet, plusieurs méthodes pour y parvenir.
La première, et certainement la plus simple, est la mise en oeuvre de l'algorithme glouton du sac à dos.
Non non ce n'est pas une blague.
La seconde utiliserai une fonction récursive pour trouver les solutions et listerai tout cela, en ôtant à chaque "tour de boucle" les références déjà utilisées.
La troisième, et certainement la meilleure que j'ai imaginé, consiste à utiliser la fonction récursive du 2 en cherchant, d'abord, les solutions exactes, puis les autres solutions en augmentant la "marge" progressivement.
J'en suis là de mes réflexions, mais j'arrête aujourd'hui sous risque de claquage du cervelet, j'ai les idées qui se croisent...
D'autres pistes éventuellement sous réserve :
- un arbre magique (avec une jolie classe Noeud) de tous les résultats approchant 6000,
- utiliser le solver Excel (=> je ne connais absolument pas).
- etc...
Par contre, je ne suis pas d'accord avec : Avec une macro c'est tres simple
En tout cas, à demain...
Bonjour,
Tout d'abord merci à vous tous pour votre réactivité.
Je pensais au départ que mon problème pourrait facilement être résolu sous excel...mais mes faibles connaissances ne m'ont par permis d'aboutir...je m'en remet donc à vous!
J'ai bien hâte de voir ce qu'il est possible de faire.
"La troisième, et certainement la meilleure que j'ai imaginé, consiste à utiliser la fonction récursive du 2 en cherchant, d'abord, les solutions exactes, puis les autres solutions en augmentant la "marge" progressivement."
C'est en effet ce que je souhaitais faire mais je n'ai pas réussi...
En espérant que des bonnes nouvelles arrivent!
Merci encore,
Fanny
Tout d'abord merci à vous tous pour votre réactivité.
Je pensais au départ que mon problème pourrait facilement être résolu sous excel...mais mes faibles connaissances ne m'ont par permis d'aboutir...je m'en remet donc à vous!
J'ai bien hâte de voir ce qu'il est possible de faire.
"La troisième, et certainement la meilleure que j'ai imaginé, consiste à utiliser la fonction récursive du 2 en cherchant, d'abord, les solutions exactes, puis les autres solutions en augmentant la "marge" progressivement."
C'est en effet ce que je souhaitais faire mais je n'ai pas réussi...
En espérant que des bonnes nouvelles arrivent!
Merci encore,
Fanny
Dison que le "Simple" est une manière de parler :)
Alors que souhaitez vous finalement ?
Vous visez plutôt l'optimisation à 100%, qui risque d'être extrement compliquée.
Ou une solution qui limite les perte autant que possible avec Excel, mais qui est faisable gratuitement ?
///
Il exsite bien d'autres manières qui sont plus ou moins bonne en fonction du nombre de découpe à faire.
J'attend votre réponse pour continué, si vous cherchez qqchose d'optimal il va faloir casser sa tirelire.
Alors que souhaitez vous finalement ?
Vous visez plutôt l'optimisation à 100%, qui risque d'être extrement compliquée.
Ou une solution qui limite les perte autant que possible avec Excel, mais qui est faisable gratuitement ?
///
Il exsite bien d'autres manières qui sont plus ou moins bonne en fonction du nombre de découpe à faire.
J'attend votre réponse pour continué, si vous cherchez qqchose d'optimal il va faloir casser sa tirelire.
Salut le fil, skk201,
D'autant plus que je m'aperçois d'une contrainte supplémentaire non énoncée au début : deux longueurs de tubes, 5500 et 6000 mm???
@FaNy : c'est tout concernant les contraintes? Je te suggère, aimablement, de nous donner EXACTEMENT l'énoncé de ce que tu cherches à faire, avec toutes les conditions, contraintes et exigences...
Il est clair que sans cela, le travail que nous effectuerons, pour toi, ne sera pas utile.
EDIT : faut il tenir compte des chiffres après la virgule dans tes longueurs de découpe? exemple : G5 196 = 236,193475815523
Si oui, de combien est la précision?
Faut il également tenir compte de ta "marge" de 0,005? Si oui qu'elle est elle EXACTEMENT?
Disons que le "Simple" est une manière de parler :)Je préfères. Je ne voyais pas ce qui pourrait être simple dans ce sujet.
D'autant plus que je m'aperçois d'une contrainte supplémentaire non énoncée au début : deux longueurs de tubes, 5500 et 6000 mm???
@FaNy : c'est tout concernant les contraintes? Je te suggère, aimablement, de nous donner EXACTEMENT l'énoncé de ce que tu cherches à faire, avec toutes les conditions, contraintes et exigences...
Il est clair que sans cela, le travail que nous effectuerons, pour toi, ne sera pas utile.
EDIT : faut il tenir compte des chiffres après la virgule dans tes longueurs de découpe? exemple : G5 196 = 236,193475815523
Si oui, de combien est la précision?
Faut il également tenir compte de ta "marge" de 0,005? Si oui qu'elle est elle EXACTEMENT?
Avec une macro c'est tres simple.
je peux vous proposer une macro qui fera cela :
additionne les valeurs jusqu'a arrivé a une longueur de 6 mètres. Si la valeur suivante déplace les 6 mètres alors il prendra la suivante, jusqu'à ce qu'il en trouve une qui passe. Si il ne la trouve pas il passe a la au groupe de valeur suivante.
A faire attention :
cela nous donnera pas forcément le meilleur resultat.
et dans cet exemple je ne prend une valeur de 0.0mm pour chaque découpe. (ce qui est impossible mais si vous me donnez une marge pour la découpe alors je pourrai ajouter ce facteur)
est-ce que le nom change qqchose ?
je peux vous proposer une macro qui fera cela :
additionne les valeurs jusqu'a arrivé a une longueur de 6 mètres. Si la valeur suivante déplace les 6 mètres alors il prendra la suivante, jusqu'à ce qu'il en trouve une qui passe. Si il ne la trouve pas il passe a la au groupe de valeur suivante.
A faire attention :
cela nous donnera pas forcément le meilleur resultat.
et dans cet exemple je ne prend une valeur de 0.0mm pour chaque découpe. (ce qui est impossible mais si vous me donnez une marge pour la découpe alors je pourrai ajouter ce facteur)
est-ce que le nom change qqchose ?
Bonjour,
Merci pour votre réponse, oui j'ai une marge pour la découpe de 100mm.
Je ne comprend pas votre question: "est-ce que le nom change qqchose ?"
Je suis preneuse de votre macro en tout cas car je n'ai pas trouvé ma solution!
Fanny
Merci pour votre réponse, oui j'ai une marge pour la découpe de 100mm.
Je ne comprend pas votre question: "est-ce que le nom change qqchose ?"
Je suis preneuse de votre macro en tout cas car je n'ai pas trouvé ma solution!
Fanny
haha faute de frape je voulais dire : Est-ce que ça change qqchose ?
Actuelement j'ai déjà réfléchi à une macro encore plus effiace.
Et pour la marge de découpe ça serait plus précis avec une marge par découpe que une marge générale pour la barre de 6m.
Est-ce que tu veux une macro vite fait qui marchera uniquement pour ce document-là ou est-ce que tu veux que je te fasse un document expret pour cela, qui sera réutilisable ?
Actuelement j'ai déjà réfléchi à une macro encore plus effiace.
Et pour la marge de découpe ça serait plus précis avec une marge par découpe que une marge générale pour la barre de 6m.
Est-ce que tu veux une macro vite fait qui marchera uniquement pour ce document-là ou est-ce que tu veux que je te fasse un document expret pour cela, qui sera réutilisable ?
Bonjour,
Merci de ton implication.
Un fichier réutilisable serait l'idéal puisque j'aurai par la suite d'autres listing de valeur. De plus me sera t-il possible de rentrer dans ta macro pour modifier la longueur de 6m? En fait j'ai des longueurs de 6m et des longueurs de 5,5m.
En ce qui concerne la marge, elle n'a que peut d'intéret pour moi finalement puisque mon but est d'avoir le moins de pertes possible et que la macro ne me fasse pas de combinaison supérieur à 6m (physiquement non réalisable).
En relisant votre réponse je me demande si ce que vous appelez la "marge" n'est pas plutot la tolérance sur la découpe: c'est à dire que je dois découper une longueur de 1,20m par exemple avec une précision de +/-5mm soit une longueur entre 1195mm et 1205mm, est-ce cela? dans ce cas partir sur une précision de 0,005m car nous sommes très proche du 0 en réalité.
Merci de ton implication.
Un fichier réutilisable serait l'idéal puisque j'aurai par la suite d'autres listing de valeur. De plus me sera t-il possible de rentrer dans ta macro pour modifier la longueur de 6m? En fait j'ai des longueurs de 6m et des longueurs de 5,5m.
En ce qui concerne la marge, elle n'a que peut d'intéret pour moi finalement puisque mon but est d'avoir le moins de pertes possible et que la macro ne me fasse pas de combinaison supérieur à 6m (physiquement non réalisable).
En relisant votre réponse je me demande si ce que vous appelez la "marge" n'est pas plutot la tolérance sur la découpe: c'est à dire que je dois découper une longueur de 1,20m par exemple avec une précision de +/-5mm soit une longueur entre 1195mm et 1205mm, est-ce cela? dans ce cas partir sur une précision de 0,005m car nous sommes très proche du 0 en réalité.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
@ FaNy :
Aujourd'hui, je vais te demander de réfléchir à ta méthodologie.
Le but ici est d'économiser du tube en trouvant la "meilleure" solution de découpe. Si tu disposes de 2 longueurs différentes, il est évident que nous parviendrons à un meilleur résultat si nous utilisons à chaque fois ces deux longueurs...
Ensuite, tu nous dis : environ 300 à la fois...mais peu importe le nombre: si ça ne tourne pas avec 300 alors j'en mettrai que 200 à la fois
Pour nous, peu importe ce chiffre. Ce que l'on veut c'est que tu réfléchisses à ta méthode et nous donnes ta démarche.
Exemples :
Ex 1- J'ai des commandes de 357 références (comme le fichier joint), je souhaite, pour chaque commande optimiser les découpes.
Ex 2- j'ai x commandes que je peux "mixer". Soit 4900 références à traiter dans la semaine, qui représentent toutes mes commandes de la semaine et dont je dois optimiser la découpe.
Ex 3- etc...
Notre mise en oeuvre sera différente selon...
@ FaNy :
Aujourd'hui, je vais te demander de réfléchir à ta méthodologie.
Le but ici est d'économiser du tube en trouvant la "meilleure" solution de découpe. Si tu disposes de 2 longueurs différentes, il est évident que nous parviendrons à un meilleur résultat si nous utilisons à chaque fois ces deux longueurs...
Ensuite, tu nous dis : environ 300 à la fois...mais peu importe le nombre: si ça ne tourne pas avec 300 alors j'en mettrai que 200 à la fois
Pour nous, peu importe ce chiffre. Ce que l'on veut c'est que tu réfléchisses à ta méthode et nous donnes ta démarche.
Exemples :
Ex 1- J'ai des commandes de 357 références (comme le fichier joint), je souhaite, pour chaque commande optimiser les découpes.
Ex 2- j'ai x commandes que je peux "mixer". Soit 4900 références à traiter dans la semaine, qui représentent toutes mes commandes de la semaine et dont je dois optimiser la découpe.
Ex 3- etc...
Notre mise en oeuvre sera différente selon...
Bonjour,
C'est l'exemple 1 qui correspond à ma réalité:
J'ai des commandes de 350 à X éléments que je souhaite optimiser et par exemple:
J'ai une commande de 350 à X éléments que je réalise dans des tubes de 6000mm
J'ai une autre commande de 350 à X éléments que je réalise dans des tubes de 5500mm.
X correspond à ce qu'il est possible de faire via excel pour que je ne sois pas limité si une commande dépasse les 357 comme le fichiers joints. Sinon je scinderai mes commandes en éléments de 357 - j'aurai moins optimisé ma perte mais ce sera déjà mieux que rien!
Je ne souhaite pas mixer mes commandes.
C'est l'exemple 1 qui correspond à ma réalité:
J'ai des commandes de 350 à X éléments que je souhaite optimiser et par exemple:
J'ai une commande de 350 à X éléments que je réalise dans des tubes de 6000mm
J'ai une autre commande de 350 à X éléments que je réalise dans des tubes de 5500mm.
X correspond à ce qu'il est possible de faire via excel pour que je ne sois pas limité si une commande dépasse les 357 comme le fichiers joints. Sinon je scinderai mes commandes en éléments de 357 - j'aurai moins optimisé ma perte mais ce sera déjà mieux que rien!
Je ne souhaite pas mixer mes commandes.
Dac, alors pas de soucis.
Vous pourrez choisir la longueur maximal des tubes entre 500 et 10 000 mm.
Et vous pourrez mettre un nombre très grand de mesure (autant que excel à de lignes)
En sachant que plus vous en mettez plus vous vous approcherez (je crois) d'un résultat optimal.
Mais que selon l'ôrdinateur que vous utilisez il risque d'avoir un temps de calculs plus ou moins long.
Sur quel version d'excel vous trouvez vous ? 2003 ? 2007 ? 2010 ? 2013 ?
Vous pourrez choisir la longueur maximal des tubes entre 500 et 10 000 mm.
Et vous pourrez mettre un nombre très grand de mesure (autant que excel à de lignes)
En sachant que plus vous en mettez plus vous vous approcherez (je crois) d'un résultat optimal.
Mais que selon l'ôrdinateur que vous utilisez il risque d'avoir un temps de calculs plus ou moins long.
Sur quel version d'excel vous trouvez vous ? 2003 ? 2007 ? 2010 ? 2013 ?
Re-
@ "Les programmateurs" :
Ce sujet m'a amené à cette réflexion.
Deux méthodes de base pour une solution pas "optimale", mais "la meilleure".
Méthode du sac à dos :
Je prends mes références et les ajoutes. Dès que j'approche de la valeur cible j'arrête et recommences.
Soit l'algorithme glouton, transcrit en pseudo-code VBA suivant :
n = Nombre de références
LongueurEnCours = somme des découpes pour 1 tube
Longueur() = longueurs des références
LongueurMax = 6000 ou 5500
DejaFait() = "boolean" (valeurs 1 ou 0) listant les références déjà utilisées
Fonction récursive :
La méthode est celle décrite par skk201.
A partir de la liste des longueurs, je calcule, récursivement les différentes solutions, en tenant compte, cette fois, d'une marge.
Optimisation?
L'optimisation, ou plutôt dans ce cas, la recherche de la meilleure solution, consiste à prendre toutes les solutions trouvées et ne conserver que la meilleure.
Nous avons ici deux méthodes donc deux solutions. Ne prendre que la "meilleure" des deux ne semble pas être optimal.
Donc, en creusant un tout p'tit peu, on se rends vite compte que, dans la méthode récursive, le nombre de solutions évolue selon le "tri" de la liste initiale. En effet, selon si on la présente "dans l'état", trié en ordre croissant ou décroissant, le nombre de solution est différent. Cela nous fait déjà 4 solutions.
Nous pouvons également en déduire une infinité d'autres selon le tri de la liste. Par exemple : on prends les 10 1ers éléments et on les mets à la fin, puis on injecte cette "nouvelle liste" dans la fonction récursive. On peut imaginer une infinité donc de solutions.
Notre boulot va donc consister à choisir les différents tris afin de ne pas chercher inutilement.
Qu'en pensez vous?
@ "Les programmateurs" :
Ce sujet m'a amené à cette réflexion.
Deux méthodes de base pour une solution pas "optimale", mais "la meilleure".
Méthode du sac à dos :
Je prends mes références et les ajoutes. Dès que j'approche de la valeur cible j'arrête et recommences.
Soit l'algorithme glouton, transcrit en pseudo-code VBA suivant :
n = Nombre de références
LongueurEnCours = somme des découpes pour 1 tube
Longueur() = longueurs des références
LongueurMax = 6000 ou 5500
DejaFait() = "boolean" (valeurs 1 ou 0) listant les références déjà utilisées
Loop While Nb(Si(DejaFait(i) = 1)) = n
For i = 1 To n
If LongueurEnCours + Longueur(i) <= LongueurMax alors
DejaFait(i) = 1
LongueurEnCours = LongueurEnCours + Longueur(i)
Else
DejaFait(i) = 0
End If
Next i
Loop
Fonction récursive :
La méthode est celle décrite par skk201.
A partir de la liste des longueurs, je calcule, récursivement les différentes solutions, en tenant compte, cette fois, d'une marge.
Optimisation?
L'optimisation, ou plutôt dans ce cas, la recherche de la meilleure solution, consiste à prendre toutes les solutions trouvées et ne conserver que la meilleure.
Nous avons ici deux méthodes donc deux solutions. Ne prendre que la "meilleure" des deux ne semble pas être optimal.
Donc, en creusant un tout p'tit peu, on se rends vite compte que, dans la méthode récursive, le nombre de solutions évolue selon le "tri" de la liste initiale. En effet, selon si on la présente "dans l'état", trié en ordre croissant ou décroissant, le nombre de solution est différent. Cela nous fait déjà 4 solutions.
Nous pouvons également en déduire une infinité d'autres selon le tri de la liste. Par exemple : on prends les 10 1ers éléments et on les mets à la fin, puis on injecte cette "nouvelle liste" dans la fonction récursive. On peut imaginer une infinité donc de solutions.
Notre boulot va donc consister à choisir les différents tris afin de ne pas chercher inutilement.
Qu'en pensez vous?
Je pense que le meilleur tri est celui qui classe les mesure dans l'ordre décroissant.
Il existe encore une autre méthode, mais qui n'est pas forcément la plus efficasse. C'est d'asemblé les valeur dans des petits groupes de 1000 mm || 2000 mm || 3000mm et d'assemblé les groupes entre eux pour obtenir 6000 mm.
Mais cela dépend de la tailler et du nombre de découpes qu'on nous donne.
ça permet aussi de minimisé les pertes.
On fait des groupes entre 1860 et 2000 se qui fait qu'on limite théroriquement la perte par tube à max 420 mm par tube.
Mais bour pour que ça fonctionne bien, encore une fois, il faudrait beaucoup de valeurs de petites tailles.
Il existe encore une autre méthode, mais qui n'est pas forcément la plus efficasse. C'est d'asemblé les valeur dans des petits groupes de 1000 mm || 2000 mm || 3000mm et d'assemblé les groupes entre eux pour obtenir 6000 mm.
Mais cela dépend de la tailler et du nombre de découpes qu'on nous donne.
ça permet aussi de minimisé les pertes.
On fait des groupes entre 1860 et 2000 se qui fait qu'on limite théroriquement la perte par tube à max 420 mm par tube.
Mais bour pour que ça fonctionne bien, encore une fois, il faudrait beaucoup de valeurs de petites tailles.
Nous pouvons également en déduire une infinité d'autres selon le tri de la liste.
Peut être pas une infinité, mais beaucoup en tout cas. D'ou l'utilisation d'algorithmes tels que le simplexe et autres pour explorer l'arbre des possibilités - ou en l'occurence les sommets du polygone des solutions.
On a i produits distribuées de façon normale autour d'une moyenne de 300 : i~N(300,sigma)
Ces i produits sont découpés dans j tubes
Donc on doit
Min Somme (Perte(j))=Min Somme (600-somme(i))
sous les contraintes que somme(i,j)<600
i>0
il ne doit pas y avoir bcp plus de contraines que ça.
Suis au bureau, mais le problème est excellent. Je regarde avec Lingo ce soir ^^
Re-
Modifications suite.
Procédure Compter :
Cette procédure peut être supprimée. En effet, VBA permet, en une seule ligne de code, sans boucle, de trouver la dernière cellule non-vide d'une colonne. Il existe plusieurs syntaxes possibles, je me contenterais de celle-ci :
Si on considère la première ligne comme entête, le nombre de références est donc :
Évolution du classeur :
Avec les économies que tu va faire réaliser à FaNy (en perte de tubes ET en temps), son entreprise va vite prendre de l'ampleur. De PME elle va devenir une TGE cotée au CAC40...
Et donc, les commandes vont passer de 300 lignes à 50000...
Blagues mises à part, je penses que ta procédure gagnerait en agilité si tu utilisais des variables tableaux.
Ma question est donc la suivante : connais tu ce type de variable?
Boucles inutiles :
Je crains, mais mon analyse de ton code n'est pas terminée, que ta Sub ne boucle beaucoup pour rien. A ce titre, pourrais tu, pour une meilleure compréhension de ton processus, commenter ton code de manière détaillée ?
Cela permettra, en outre, une maintenance beaucoup plus efficace de ton code.
Modifications suite.
Procédure Compter :
Sub Compter() 'Compte le nombre de découpe et défini la Var_pub Feuil = "Découpes" Dim Ligne As Integer Ligne = 2 Do While Sheets(Feuil).Cells(Ligne, 2) <> "" Ligne = Ligne + 1 Loop 'Définir le nombre de découpes NB_decoupes = Ligne - 2 '-2 à cause du titre et de la dernière ligne qui est vide End Sub
Cette procédure peut être supprimée. En effet, VBA permet, en une seule ligne de code, sans boucle, de trouver la dernière cellule non-vide d'une colonne. Il existe plusieurs syntaxes possibles, je me contenterais de celle-ci :
Ligne = Sheets(Feuil).Range("B" & Rows.Count).End(xlUp).Row
Si on considère la première ligne comme entête, le nombre de références est donc :
Ligne = Sheets(Feuil).Range("B" & Rows.Count).End(xlUp).Row - 1
Évolution du classeur :
Avec les économies que tu va faire réaliser à FaNy (en perte de tubes ET en temps), son entreprise va vite prendre de l'ampleur. De PME elle va devenir une TGE cotée au CAC40...
Et donc, les commandes vont passer de 300 lignes à 50000...
Blagues mises à part, je penses que ta procédure gagnerait en agilité si tu utilisais des variables tableaux.
Ma question est donc la suivante : connais tu ce type de variable?
Boucles inutiles :
Je crains, mais mon analyse de ton code n'est pas terminée, que ta Sub ne boucle beaucoup pour rien. A ce titre, pourrais tu, pour une meilleure compréhension de ton processus, commenter ton code de manière détaillée ?
Cela permettra, en outre, une maintenance beaucoup plus efficace de ton code.
Bonjour,
J'ai tout lu mais depuis le début je me pose une question :
@ fany : une coupe équivaut à 0 de perte dans un tube ? ou une coupe fait quelques micron/millimètres ?
Comme je ne vais pas être en capacité de déchiffrer le code et de savoir si cette contrainte a été vue et prise en compte, je pose la question.
Mais dans les textes, je suis peut-être passé à coté ; je vois marge/tolérance mais pas "épaisseur de coupe". (ce qui peut avoir son importance si un tube est découpé en un grand nombre de sections.)
____________________________________________
L'humour est la clé de voûte de la conscience.
J'ai tout lu mais depuis le début je me pose une question :
@ fany : une coupe équivaut à 0 de perte dans un tube ? ou une coupe fait quelques micron/millimètres ?
Comme je ne vais pas être en capacité de déchiffrer le code et de savoir si cette contrainte a été vue et prise en compte, je pose la question.
Mais dans les textes, je suis peut-être passé à coté ; je vois marge/tolérance mais pas "épaisseur de coupe". (ce qui peut avoir son importance si un tube est découpé en un grand nombre de sections.)
____________________________________________
L'humour est la clé de voûte de la conscience.
Salut Noctambule,
L'idée a été abordée ICI, mais n'a pas été développée par la suite. Dommage car les codes fournis travaillent sur de l'approximation. D'autant plus approximative que la liste des longueurs données comporte certaines valeurs avec décimales et que la règle, souhaitée par FaNy, est d'arrondir au supérieur.
Une réponse plus claire à ce sujet de la part de FaNy serait grandement utile...
L'idée a été abordée ICI, mais n'a pas été développée par la suite. Dommage car les codes fournis travaillent sur de l'approximation. D'autant plus approximative que la liste des longueurs données comporte certaines valeurs avec décimales et que la règle, souhaitée par FaNy, est d'arrondir au supérieur.
Une réponse plus claire à ce sujet de la part de FaNy serait grandement utile...
Après quelques test de 6000mm :
Avec une marge de 0mm : 83 tubes
Avec une marge de 5mm: 83 tubes
Avec une marge de 10mm : 84 tubes
Avec une marge de 20mm : 85 tubes
Avec une marge de 50mm : 87 tubes
Comme quoi la marge n'a vraiment pas un grand impacte. (une marge de 10mm c'est déjà énorme)
avec les 360 découpes qu'on avait on arrive à moins d'un tube de perte : 5741mm de perte avec 5mm de tolérance
en revanche avec des tubes de 5500 et 5mm de marge :
9 tubes avec plus de 2600mm de perte.
soit une perte total plus de 30 000mm !!
Donc le choix des tubes peut avoir un grand impacte !
////////////
C'est amusant de voir qu'on aurait 7000mm de perte avec des tubes de 10 000 de long.
on pourrait même imaginé l'inverse, une macro qui dit la longueur idéales des tubes pour qu'il n'y ai pas de perte (ou le moins possible)
Avec une marge de 0mm : 83 tubes
Avec une marge de 5mm: 83 tubes
Avec une marge de 10mm : 84 tubes
Avec une marge de 20mm : 85 tubes
Avec une marge de 50mm : 87 tubes
Comme quoi la marge n'a vraiment pas un grand impacte. (une marge de 10mm c'est déjà énorme)
avec les 360 découpes qu'on avait on arrive à moins d'un tube de perte : 5741mm de perte avec 5mm de tolérance
en revanche avec des tubes de 5500 et 5mm de marge :
9 tubes avec plus de 2600mm de perte.
soit une perte total plus de 30 000mm !!
Donc le choix des tubes peut avoir un grand impacte !
////////////
C'est amusant de voir qu'on aurait 7000mm de perte avec des tubes de 10 000 de long.
on pourrait même imaginé l'inverse, une macro qui dit la longueur idéales des tubes pour qu'il n'y ai pas de perte (ou le moins possible)
Demain avec vba (au format excel 2003) et ses commentaires bien sûr, ça ira très bien
J'ai tenté un début, mais je manque de technique!
merci à toi
J'ai tenté un début, mais je manque de technique!
merci à toi
Voilà les dernières MAJ.
Disponibles en XLSM et XLS sur ce lien Onedrive
https://onedrive.live.com/redir?resid=834B81F80B205A7A!3636&ithint=folder,&lor=shortUrl
Disponibles en XLSM et XLS sur ce lien Onedrive
https://onedrive.live.com/redir?resid=834B81F80B205A7A!3636&ithint=folder,&lor=shortUrl
Tout d'abord, félicitations pour ton travail, la macro proposée est très bien construite. De plus elle réponds pleinement (ou presque) aux exigences de FaNy. Cela mérite des encouragements, le +2 est mérité.
Il y a toutefois quelques points à revoir.
Le bug du 0 au lieu de 6000.
Il se situe ici regarde les commentaires :
Pour pallier à cela, il suffit, lorsque tu testes l'égalité entre la valeur actuelle et 6000, si Test2 = False alors on le remet à True :
à insérer dans ta macro, après Test1 = True par exemple :
Petits détails :
- Il faut, si tu tiens à la protection de la feuille, déprotéger en début de macro et protéger à la fin. La syntaxe :
- Comment as tu traité : pas de chiffre après la virgule on arrondi au supérieur (précision donnée par FaNy ICI?
Pour un bien, il faudrait que cela soit traité dans le code. En effet, FaNy ne le fera peut être pas systématiquement et cela risque de poser souci.
- Également prévoir, en début de code, l'effacement des données éventuellement contenues dans les colonnes de D à H.
Il y a encore pas mal d'autres choses à voir, mais commence déjà par ces points.
Actuellement le code est pas fini. C'est provisoir, je dois encore définir une zone d'impression aussi.
Je compte crée une barre d'outils à l'ouverture du classeur. Un bouton "Calculer" qui lance le sub "chercher". // Un bouton effacer, qui effacera au choix : Les mesures inscrites || Les mesures ordonées || les deux. //
Pour le problème des nombre à virgule il est règler hors du code, par la validation de donnée qui obliges l'utilisateur à inscrire un entier plus petit que Longeur_Max + 1 // se qui règle aussi le problème si des valeur au dessu de la valeur maximal sont entrée (sauf si on change la valeur maximal après que les données soient entrée)
Et les macro peuvent, dans certain cas, ultrepasser la protection de la feuille. Je ne pense pas que ça soit nécessaire ici, mais je recontrôlerai.
Et actuellement je pense plutôt mettre que si test1 n'est pas faux alors test2 n'est pas faux dans le Bloc IF qui vérifie si test1 est faux.
Chez moi, lors du lancement de ton code, le débugage s'est lancé parce que la feuille était protégée. Par conséquent, l'ajout des 2 lignes que je te propose est nécessaire...
Ben dis donc!!! Quel travail!
Oui en effet je ferais des copiés/collé des tableaux de valeurs.
Fanny
Et j'utiliserai une macro pour les convertire les valeurs copiée en valeur entière.
Je compte aussi couper l'actualisation de l'écran pour que la vistesse de calcule soit optimisée, le resultat sera quasi instantané.