Sommer les valeurs d'une liste pour atteindre une valeur cible
Fermé
FaNy
-
3 mai 2014 à 22:44
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 - 8 févr. 2015 à 14:41
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 - 8 févr. 2015 à 14:41
A voir également:
- Sommer les valeurs d'une liste pour atteindre une valeur cible
- Liste déroulante excel - Guide
- #Valeur excel somme - Guide
- Logiciel gratuit calcul valeur nutritionnelle - Télécharger - Santé & Bien-être
- Liste déroulante en cascade - Guide
- Attribuer une valeur à une cellule texte excel ✓ - Forum Excel
10 réponses
skk201
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
54
Modifié par skk201 le 14/05/2014 à 17:55
Modifié par skk201 le 14/05/2014 à 17:55
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"
Bruce Willix
Messages postés
11968
Date d'inscription
mardi 24 mai 2011
Statut
Contributeur
Dernière intervention
12 juin 2018
2 590
12 mai 2014 à 15:40
12 mai 2014 à 15:40
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.
skk201
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
54
12 mai 2014 à 17:28
12 mai 2014 à 17:28
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.
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
Modifié par pijaku le 12/05/2014 à 18:19
Modifié par pijaku le 12/05/2014 à 18:19
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
skk201
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
54
Modifié par skk201 le 13/05/2014 à 08:19
Modifié par skk201 le 13/05/2014 à 08:19
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.
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
Modifié par pijaku le 13/05/2014 à 08:51
Modifié par pijaku le 13/05/2014 à 08:51
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?
skk201
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
54
6 mai 2014 à 17:45
6 mai 2014 à 17:45
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
skk201
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
54
12 mai 2014 à 08:44
12 mai 2014 à 08:44
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é.
skk201
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
54
Modifié par skk201 le 12/05/2014 à 15:28
Modifié par skk201 le 12/05/2014 à 15:28
Oui c'est tout à fait fesable et oui je parait bien de la tolérance sur la découpe.
Dac c'est assez simple je vous ferai un tru tout bête sur l'exemple que vous m'avez donner.
Est-ce que la liste des découpes dans l'ordre doit être imprimable ?
Dac c'est assez simple je vous ferai un tru tout bête sur l'exemple que vous m'avez donner.
Est-ce que la liste des découpes dans l'ordre doit être imprimable ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
14 mai 2014 à 08:38
14 mai 2014 à 08:38
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.
skk201
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
54
14 mai 2014 à 10:59
14 mai 2014 à 10:59
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 ?
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
14 mai 2014 à 12:27
14 mai 2014 à 12:27
Je penses que nous avons tous les éléments pour travailler...
Je reviens dessus plus tard, pas trop le temps...
A tantôt
Je reviens dessus plus tard, pas trop le temps...
A tantôt
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
14 mai 2014 à 09:17
14 mai 2014 à 09:17
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?
skk201
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
54
Modifié par skk201 le 14/05/2014 à 09:43
Modifié par skk201 le 14/05/2014 à 09:43
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.
Bruce Willix
Messages postés
11968
Date d'inscription
mardi 24 mai 2011
Statut
Contributeur
Dernière intervention
12 juin 2018
2 590
14 mai 2014 à 11:44
14 mai 2014 à 11:44
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 ^^
skk201
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
54
14 mai 2014 à 11:53
14 mai 2014 à 11:53
Je comprend juste pas le
Une petite explication :) ?
sous les contraintes que somme(i,j)<600
Une petite explication :) ?
Bruce Willix
Messages postés
11968
Date d'inscription
mardi 24 mai 2011
Statut
Contributeur
Dernière intervention
12 juin 2018
2 590
14 mai 2014 à 12:32
14 mai 2014 à 12:32
j'avoue que j'ai pas tous les caractères dont j'ai besoin pour l'écrire correctement ^^ Il faut que chaque la somme des i-éléments dans le j-ième tube découpé soit inférieure à la longueur du tube.
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
15 mai 2014 à 10:06
15 mai 2014 à 10:06
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.
noctambule28
Messages postés
31843
Date d'inscription
samedi 12 mai 2007
Statut
Webmaster
Dernière intervention
13 février 2022
2 858
Modifié par noctambule28 le 16/05/2014 à 09:06
Modifié par noctambule28 le 16/05/2014 à 09:06
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.
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
16 mai 2014 à 09:09
16 mai 2014 à 09:09
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...
noctambule28
Messages postés
31843
Date d'inscription
samedi 12 mai 2007
Statut
Webmaster
Dernière intervention
13 février 2022
2 858
16 mai 2014 à 09:30
16 mai 2014 à 09:30
0.005m ça fait 5 millimètres, ce n'est pas rien ou c'est une erreur de frappe et c'est du 0,005mm et une coupe au laser (sans doute) d'où ma question :attendons Fany.
skk201
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
54
>
noctambule28
Messages postés
31843
Date d'inscription
samedi 12 mai 2007
Statut
Webmaster
Dernière intervention
13 février 2022
Modifié par skk201 le 16/05/2014 à 11:04
Modifié par skk201 le 16/05/2014 à 11:04
Actuellement de mon côté c'est prevu. Ce classeur etait que un brouillon.
Dans la version final on pourra saisir la "tolérance de découpe" tout comme la longueur des tubes.
donc imaginons que finalement elle se rend compte que 0.005 m c'est pas assez ou trop elle pourra toujours le changer.
Dans la version final on pourra saisir la "tolérance de découpe" tout comme la longueur des tubes.
donc imaginons que finalement elle se rend compte que 0.005 m c'est pas assez ou trop elle pourra toujours le changer.
skk201
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
54
Modifié par skk201 le 16/05/2014 à 17:06
Modifié par skk201 le 16/05/2014 à 17:06
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)
ccm81
Messages postés
10903
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
19 novembre 2024
2 427
16 mai 2014 à 17:37
16 mai 2014 à 17:37
@skk201
Salut à toi
Je suis le sujet depuis un moment et je serai curieux de voir ta démarche, peux tu la mettre sur cjoint au format excel 2003
Merci
Salut à toi
Je suis le sujet depuis un moment et je serai curieux de voir ta démarche, peux tu la mettre sur cjoint au format excel 2003
Merci
ccm81
Messages postés
10903
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
19 novembre 2024
2 427
Modifié par ccm81 le 16/05/2014 à 19:07
Modifié par ccm81 le 16/05/2014 à 19:07
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
skk201
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
54
17 mai 2014 à 11:25
17 mai 2014 à 11:25
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
ccm81
Messages postés
10903
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
19 novembre 2024
2 427
17 mai 2014 à 13:30
17 mai 2014 à 13:30
merci
il n'y a plus qu'à ....
Cordialement
il n'y a plus qu'à ....
Cordialement
skk201
Messages postés
938
Date d'inscription
jeudi 11 septembre 2008
Statut
Membre
Dernière intervention
16 octobre 2016
54
17 mai 2014 à 18:51
17 mai 2014 à 18:51
Plus que à... ?
ccm81
Messages postés
10903
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
19 novembre 2024
2 427
17 mai 2014 à 20:24
17 mai 2014 à 20:24
décrypter !
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
18 mai 2014 à 09:51
18 mai 2014 à 09:51
Salut,
juste en passant :
la moyenne des pertes est égale à la perte totale divisée par le nombre de tubes...
juste en passant :
la moyenne des pertes est égale à la perte totale divisée par le nombre de tubes...
ccm81
Messages postés
10903
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
19 novembre 2024
2 427
8 févr. 2015 à 14:41
8 févr. 2015 à 14:41
Bonjour,
Le fichier crée par skk201 (26/05/2014)
https://www.cjoint.com/?3BioYtxYllq
Cdlmnt
Le fichier crée par skk201 (26/05/2014)
https://www.cjoint.com/?3BioYtxYllq
Cdlmnt
15 mai 2014 à 07:46
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.
Modifié par skk201 le 15/05/2014 à 08:47
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.
15 mai 2014 à 09:08
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...
15 mai 2014 à 09:34
Ben dis donc!!! Quel travail!
Oui en effet je ferais des copiés/collé des tableaux de valeurs.
Fanny
Modifié par skk201 le 15/05/2014 à 10:16
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é.