Sommer les valeurs d'une liste pour atteindre une valeur cible

Fermé
FaNy - 3 mai 2014 à 22:44
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 - 8 févr. 2015 à 14:41
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

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
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"
2
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
15 mai 2014 à 07:46
Bonjour,

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 :
Do While NB_decoupes <> NB_decoupes_OK
    Do While Ligne_decoupes <> NB_decoupes + 2 ' test l'égalité entre la valeur actuelle et 6000
        'SI ON ATTEIND LA LONGUEUR MAX
        If Long_ACT + Sheets(Feuil).Cells(Ligne_decoupes, 3) = Long_tube_MAX Then
        'BLABLABLA
            If Sheets(Feuil).Cells(Ligne_decoupes, 4).Value = "" Then
                Sheets(Feuil).Cells(Ligne_decoupes_OK, 6) = Sheets(Feuil).Cells(Ligne_decoupes, 2).Value
                Sheets(Feuil).Cells(Ligne_decoupes_OK, 7) = Sheets(Feuil).Cells(Ligne_decoupes, 3).Value
                Sheets(Feuil).Cells(Ligne_decoupes, 4) = "X"
                NB_decoupes_OK = NB_decoupes_OK + 1
                NB_tubes = NB_tubes + 1
'ON INSCRIT 6000 FANS LA FEUILLE
                Sheets(Feuil).Cells(Ligne_decoupes_OK, 8) = Long_tube_MAX
                Sheets(Feuil).Cells(Ligne_decoupes_OK + 1, 5) = "Tube " & NB_tubes
                Test1 = True
                Ligne_decoupes_OK = Ligne_decoupes_OK + 1
'ON REINITIALISE Long_Act
                Long_ACT = 0
                Exit Do
                End If
'BLA BLA BLA 

'MAIS!!!!! SI TEST2 EST FALSE ALORS ON RE-INSCRIT DANS LA FEUILLE Long_ACT
'OR, ICI Long_ACT = 0....
    If Test2 = False Then
        NB_tubes = NB_tubes + 1
        Sheets(Feuil).Cells(Ligne_decoupes_OK - 1, 8) = Long_ACT
        Sheets(Feuil).Cells(Ligne_decoupes_OK, 5) = "Tube " & NB_tubes
        Long_ACT = 0
    End If

Pour pallier à cela, il suffit, lorsque tu testes l'égalité entre la valeur actuelle et 6000, si Test2 = False alors on le remet à True :
 If Test2 = False Then Test2 = True

à insérer dans ta macro, après Test1 = True par exemple :
    Do While Ligne_decoupes <> NB_decoupes + 2 ' test l'égalité entre la valeur actuelle et 6000
        If Long_ACT + Sheets(Feuil).Cells(Ligne_decoupes, 3) = Long_tube_MAX Then
            If Sheets(Feuil).Cells(Ligne_decoupes, 4).Value = "" Then
                Sheets(Feuil).Cells(Ligne_decoupes_OK, 6) = Sheets(Feuil).Cells(Ligne_decoupes, 2).Value
                Sheets(Feuil).Cells(Ligne_decoupes_OK, 7) = Sheets(Feuil).Cells(Ligne_decoupes, 3).Value
                Sheets(Feuil).Cells(Ligne_decoupes, 4) = "X"
                NB_decoupes_OK = NB_decoupes_OK + 1
                NB_tubes = NB_tubes + 1
                Sheets(Feuil).Cells(Ligne_decoupes_OK, 8) = Long_tube_MAX
                Sheets(Feuil).Cells(Ligne_decoupes_OK + 1, 5) = "Tube " & NB_tubes
                Test1 = True
                If Test2 = False Then Test2 = True
                Ligne_decoupes_OK = Ligne_decoupes_OK + 1
                Long_ACT = 0
                Exit Do
                End If
        Else: Ligne_decoupes = Ligne_decoupes + 1
        End If
    Loop


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 :
Sheets("machin").Unprotect
'... Ici tout ton code
Sheets("machin").Protect


- 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.
0
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 15/05/2014 à 08:47
Merci pour tes commentaires et pour tes corrections :)

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.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
15 mai 2014 à 09:08
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)
Pour faciliter la tâche de FaNy, je penses qu'elle ne souhaitera pas saisir ses données une par une, mais faire un copié/collé. Par conséquent, je penses que ces deux points doivent être traités par le code.

Et les macro peuvent, dans certain cas, ultrepasser la protection de la feuille
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...
0
Bonjour,

Ben dis donc!!! Quel travail!
Oui en effet je ferais des copiés/collé des tableaux de valeurs.

Fanny
0
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 15/05/2014 à 10:16
Dac aLors je rajoutrait les lignes de protection :)

Et j'utiliserai une macro pour les convertire les valeurs copiée en valeur entière.


Dim Ligne as Integer
Ligne = 2

Do While Ligne < NB_decoupes + 2
Cells(Ligne, 3) = cInt(Cells(Ligne, 3).Value))
Ligne = Ligne +1
Loop

Je compte aussi couper l'actualisation de l'écran pour que la vistesse de calcule soit optimisée, le resultat sera quasi instantané.
0
Bruce Willix Messages postés 11968 Date d'inscription mardi 24 mai 2011 Statut Contributeur Dernière intervention 12 juin 2018 2 587
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.
1
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
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.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
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...
0
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
0
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
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.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
Modifié par pijaku le 13/05/2014 à 08:51
Salut le fil, skk201,

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?
0
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
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 ?
0
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
0
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
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 ?
0
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é.
0
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
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 ?
0
Oui, la liste des découpes dans l'ordre doit être imprimable.
0

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 744
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...
0
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.
0
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
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 ?
0
Re,

Je suis sur excel 2013.
...hate de voir ce qu'il est possible d'obtenir :) !
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
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
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?
0
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
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.
0
Bruce Willix Messages postés 11968 Date d'inscription mardi 24 mai 2011 Statut Contributeur Dernière intervention 12 juin 2018 2 587
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 ^^
0
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
Je comprend juste pas le

sous les contraintes que somme(i,j)<600

Une petite explication :) ?
0
Bruce Willix Messages postés 11968 Date d'inscription mardi 24 mai 2011 Statut Contributeur Dernière intervention 12 juin 2018 2 587
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.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
15 mai 2014 à 10:06
Re-

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.
0
noctambule28 Messages postés 31791 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
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.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
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...
0
noctambule28 Messages postés 31791 Date d'inscription samedi 12 mai 2007 Statut Webmaster Dernière intervention 13 février 2022 2 858
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.
0
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 31791 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
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.
0
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
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)
0
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
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
0
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
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
0
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
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
0
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
17 mai 2014 à 13:30
merci

il n'y a plus qu'à ....

Cordialement
0
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
Plus que à... ?
0
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
17 mai 2014 à 20:24
décrypter !
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
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...
0
ccm81 Messages postés 10853 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 24 avril 2024 2 404
8 févr. 2015 à 14:41
Bonjour,

Le fichier crée par skk201 (26/05/2014)
https://www.cjoint.com/?3BioYtxYllq

Cdlmnt
0