IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Algorithme pour un problème d'optimisation


Sujet :

Algorithmes et structures de données

  1. #21
    Membre très actif
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Par défaut
    Il est plus simple de considérer des cadres de 38,...,78 jointifs et de diminuer le mur de 6+6-8=4cm.
    Tu remplis ton mur avec les plus grands jusqu'à dépasser d'une longueur entre 2cm et 76 cm.
    Tu dois "rendre" 2 à 76 avec des pièces de 40 (78-38), 30 et 20 en changeant un cadre, 2 en remplaçant 78 par 2*38, 12 (2*78-3*48), etc.

  2. #22
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut
    Je te propose une version python de mon algo de principe pour le cas 1 :

    https://onlinegdb.com/HJlIk83tS

  3. #23
    Membre averti
    Homme Profil pro
    decorateur
    Inscrit en
    Octobre 2019
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : decorateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2019
    Messages : 42
    Par défaut
    @Nebulix

    oui c'est très judicieux, ça enlève pas mal de soucis, ça m'avait été suggéré par quelqu'un d'autre également.

    @ CliffeCSTL

    Merci beaucoup, je vais essayer de tester (enfin j'essaye d'ouvrir ton code comme je peux...), en 1 semaine j'ai approché 4 langages différents, je me mélange un peu les pinceaux car certains se ressemblent...

  4. #24
    Membre averti
    Homme Profil pro
    decorateur
    Inscrit en
    Octobre 2019
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : decorateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2019
    Messages : 42
    Par défaut
    suis-je bête, je peux l''essayer sur ton logiciel en ligne, super

  5. #25
    Membre averti
    Homme Profil pro
    decorateur
    Inscrit en
    Octobre 2019
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : decorateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2019
    Messages : 42
    Par défaut
    et bien cher CliffeCSTL, ça semble tout à fait répondre à mon besoin. Puis-je tester d'autres longueurs sur le logiciel pour tester?

    Au début, j'ai pas vu que les résultats continuaient à s'afficher au fur et à mesure...je trouvais la solution peu optimale, puis j'ai vu la fin de la recherche et finalement le resultat sortant. C'est top

  6. #26
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut
    Tu copies colle ici https://www.onlinegdb.com/, tu mets Python 3 en langage en haut à droite.

  7. #27
    Membre averti
    Homme Profil pro
    decorateur
    Inscrit en
    Octobre 2019
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : decorateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2019
    Messages : 42
    Par défaut
    Merci,

    bon ça a l'air de marcher au top!
    Par ailleurs, pas pour être exigeant mais pour faire avancer la pensée) je dirais que le top du top pour l'utilisation serait d'avoir à rentrer la dimension du mur sans faire la déduction des 12cm, ce que j'ai fais très simplement en ajoutant une donnée:
    Lmur=250
    L=Lmur-12

    Penses-tu que ça peut fondamentalement alourdi le calcul?

    Aussi pour simplifier à l'utilisateur, de voir s'afficher la différence si jamais le but n'est pas atteint (genre manque 4cm pour arriver au but etc.).

    En tout cas, c'est déjà plutôt très efficace, chapeau cowboy!

  8. #28
    Membre très actif
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2013
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Février 2013
    Messages : 317
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Le code que j'ai posté est écrit en Windev. C'est un langage plutôt simple. Pour l'utiliser, il faut le compilateur Windev (payant), mais tu peux télécharger une version d'évaluation : ici .
    Avec cette version d'évaluation, tu pourras modifier les paramètres .
    Pour en avoir fait l'expérience, la version d'évaluation ne permet pas l'édition (voir le code) de ce que tu poste avec ta version (la 22 je crois)

  9. #29
    Membre averti
    Homme Profil pro
    decorateur
    Inscrit en
    Octobre 2019
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : decorateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2019
    Messages : 42
    Par défaut
    J'ai fais quelques tests, j'ai du coup quelques questions:

    -combien de type de cadre penses-tu qu'on peux rentrer avant que ça complique l'histoire? ou faudrait-il revoir la forme pour pouvoir ajouter des cadres?

    J'ai essayé de rentrer un espacement entre cadres de 7,5cm mais il semble que le logiciel n'interprète pas les décimales. Est-ce juste un paramètre ou cela conditionne t-il le code?
    (je m'auto-corrige, 7,5 sécrit 7.5 !!)
    Merci

  10. #30
    Membre averti
    Homme Profil pro
    decorateur
    Inscrit en
    Octobre 2019
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : decorateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2019
    Messages : 42
    Par défaut
    Comme disait tbc92

    "- Je considère qu'il y a 4 tailles de tableaux au maximum, On peut adapter facilement pour 5 , voire 6 tailles de tableaux. Si on voulait plus de souplesse sur ce critère, il faudrait organiser le programmme très différemment."

    Effectivement ça semble ramer un peu à partir de 5 cadres. Pour plus de cadres, faudrait-il monter le code de sorte à éviter les calculs inutiles, à savoir les opérations qui ont le même résultat (type a+b+c+d = b+c+d+a =c+d+a+b = d+a+b+c)?

  11. #31
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut
    Voila une version améliorée, j'ai supprimé les parcours de combinaisons inutiles pour améliorer les perfs :

    https://onlinegdb.com/r1a4A52FS



    Citation Envoyé par Fixette2000 Voir le message
    Effectivement ça semble ramer un peu à partir de 5 cadres. Pour plus de cadres, faudrait-il monter le code de sorte à éviter les calculs inutiles, à savoir les opérations qui ont le même résultat (type a+b+c+d = b+c+d+a =c+d+a+b = d+a+b+c)?
    L'ordre est inutile ici, seul le nombre de cadre de chaque type nous importe.

  12. #32
    Membre averti
    Homme Profil pro
    decorateur
    Inscrit en
    Octobre 2019
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : decorateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2019
    Messages : 42
    Par défaut
    super, je vais regarder ça

    Effectivement, dès qu'on rajoute un cadre le temps de calcul grimpe de façon exponentielle, logique.
    1min15 pour 6 cadres contre 8min20 pour 7 cadres

    question con, dans l'absolu, y'aurait-il un sens à faire garder en mémoire des résultats précédemment trouvés pour éviter des calculs lors d'une prochaine recherche similaire?

  13. #33
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut
    C'est quoi une recherche similaire ?
    Avec du parallélisme tu peux réduire les temps de calcul.

  14. #34
    Membre averti
    Homme Profil pro
    decorateur
    Inscrit en
    Octobre 2019
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : decorateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2019
    Messages : 42
    Par défaut
    je veux dire, si je fais exactement la même recherche, c'est à dire la même longueur de mur, avec le même nombre de cadres...

  15. #35
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut
    Citation Envoyé par Fixette2000 Voir le message
    je veux dire, si je fais exactement la même recherche, c'est à dire la même longueur de mur, avec le même nombre de cadres...
    Oui bah dans ce cas tu peux même écrire le résultat dans un fichier

  16. #36
    Membre averti
    Homme Profil pro
    decorateur
    Inscrit en
    Octobre 2019
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : decorateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2019
    Messages : 42
    Par défaut
    [QUOTE=CliffeCSTL;11190279]Voila une version améliorée, j'ai supprimé les parcours de combinaisons inutiles pour améliorer les perfs :

    https://onlinegdb.com/r1a4A52FS


    pas encore fait de test comparatif mais c'est déjà beaucoup plus light en façade.

    Vraiment merci, ça me permet en même temps de comprendre le langage sur un vrai cas

  17. #37
    Membre averti
    Homme Profil pro
    decorateur
    Inscrit en
    Octobre 2019
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : decorateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2019
    Messages : 42
    Par défaut
    Ah, on vient de passer à 15 secondes de calcul pour 7 cadres...un petit pas pour l'humanité mais un grand pas pour moi

  18. #38
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 215
    Par défaut
    Tout petit détail, dans le code proposé, il faut remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def check_combinaison(n_a, n_b, n_c, n_d):
        return n_a * l_a + n_b * l_b + n_c * l_c + n_d * l_d + 8 * (n_a + n_b + n_c + n_d - 1) <= l
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def check_combinaison(n_a, n_b, n_c, n_d):
        return n_a * l_a + n_b * l_b + n_c * l_c + n_d * l_d + e_c * (n_a + n_b + n_c + n_d - 1) <= l
    Par ailleurs, au lieu de boucler for n_b in range(0, m_b + 1): puis tester if check_combinaison(n_a, n_b, 0, 0): , j'aurais recalculé d'abord m_b correspondant au max possible avec l'espace déjà consommé, puis bouclé jusqu'à ce m_b réévalué.
    Ca doit diviser le temps de traitement par quasiment 2.

  19. #39
    Membre averti
    Homme Profil pro
    decorateur
    Inscrit en
    Octobre 2019
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : decorateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2019
    Messages : 42
    Par défaut
    Merci,
    effectivement si on change la valeur de e_c c'est bien si ça suit derrière

  20. #40
    Membre Expert

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Billets dans le blog
    9
    Par défaut Algorithme pour un problème d'optimisation
    Bonjour,

    J'ai rassemblé les données de ton problème, pour la clarté de l'énoncé.

    Citation Envoyé par Fixette2000 Voir le message
    ... On me donne un mur d'une certaine largeur; je dois y installer une série de cadres photos en utilisant un stock de 4 modèles de cadres différents (Par exemple cadre A 30cm de large, cadre B 40cm de large, cadre C 50cm de large, cadre D 70cm de large).
    Je dois respecter un écart de 8 cm entre chaque cadre et au minimum 6 cm d'espace entre les 2 cadres d'extrémité et le bord du mur, je peux utiliser plusieurs fois le même modèle de cadre ...
    Citation Envoyé par Fixette2000 Voir le message
    ... je n'aurais pas de murs de plus de 35 m à priori ...
    Citation Envoyé par Fixette2000 Voir le message
    ... J'ai un stock de cadres photos de 4 largeurs différentes et je peux en racheter si besoin;
    (ICI considérant que j'ai un stock illimité de cadres)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Cadre A de largeur 30cm (vA) au nombre illimité (n 8) ou limité (nA)*
    Cadre B de largeur 40cm (vB) au nombre illimité (n 8) ou limité (nB)*
    Cadre C de largeur 50cm (vC) au nombre illimité (n 8) ou limité (nC)*
    Cadre D de largeur 70cm (vD) au nombre illimité (n 8) ou limité (nD)*
    J'ai un mur (m) de largeur connue (vm)
    
    Je cherche à obtenir la meilleure combinaison (et donc la quantité de chaque type de cadres nécessaire) pour remplir au maximum le mur
    sachant que:
    -on peut choisir plusieurs fois ou aucune fois chaque cadre.
    -vm est supérieur ou égale à 1 vA
    -vA, vB, vC, vD sont tous supérieur à 0
    
    selon plusieurs cas:
    Cas 1: J'ai un stock illimité de cadres et je cherche (dans l'ordre des opérations) la solution qui remplisse le plus le mur, puis qui utilise le moins de cadres. 
    
    (*Cas 2: j'ai un stock limité de chaque type de cadres (par exemple nA=12 nB=12 nC=12 nD=12) et je cherche (dans l'ordre des opérations) la solution qui remplisse le plus le mur, puis qui utilise le moins de cadres. )
    
    Cas3: je veux utiliser en priorité les plus grands cadres (en dernier lieu les plus petits cadres, par exemple A+A+A+A+C+C+C+BB+A) quitte à accepter une solution de 10% moins optimale que  la solution du cas 1 (ou*cas2)
    =(algorithme glouton/division euclydienne)
    
    Cas 4: je veux un calepinage de composition parfaitement symétrique (par exemple A + B + C + B +A 
    ou encore A+B+C+D+D+C+B+A)
    
    
    Question programmation, je souhaiterais combiner ces 3 ou 4 algorithmes pour voir s'afficher dans l'ordre:
    
    -La combinaison la plus optimale, c'est à dire la plus approchante de la valeur (vm) du mur
    -La combinaison la plus optimale, à condition qu'elle utilise le maximum de grands cadres
    -La combinaison la plus optimale, à condition qu'elle permette une symétrie dans son agencement, en utilisant si possible les plus grands cadres en priorité
    Ne pourrais-tu pas envisager d'introduire
    a) la largeur effective du mur: Lm = Vm - 4 ;
    b) les largeurs effectives de chaque cadre; La = Va + 2*(8/2) = Va + 8 ; Lb = Vb + 8 ... etc ?
    Tu retrouverais ainsi les écarts minimaux à respecter
    - entre deux cadres consécutifs: 8/2 + 8/2 = 8 cm ,
    - entre le bord du mur et le premier (ou dernier) cadre: 8/2 + 4/2 = 6 cm ,
    ainsi que les valeurs maximales des nombres de chaque type de cadres:
    NaMax = Trunc(Lm/La) , NbMax = Trunc(Lm/Lb) , NcMax = Trunc(Lm/Lc) , NdMax = Trunc(Lm/Ld) .

    Il te suffirait, dans le cas éventuel d'un stock limité, d'ajouter les corrections conditionnelles:
    NaMax = Min(NaMax, NaLim) = Min(NaMax, 12) , NbMax = Min(NbBax, NbLim) ... etc
    ce qui d'ailleurs limiterait salutairement le nombre total de combinaisons à
    NaLim*NLlim*NcLim*NdLim = 124 = 20736
    .

    La recherche de la combinaison optimale pourrait alors relever
    a) soit d'une énumération complète à l'aide de 4 boucles imbriquées, par un algorithme du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    FOR Ia:= 1 TO NaMax DO
      FOR Ib:= 1 TO NbMax DO
        FOR Ic:= 1 TO NcMax DO
          FOR Id:= 1 TO NdMax DO
            BEGIN
              Ltot:= Ia * La; Inc(Ltot, Ib * Lb); Inc(Ltot, Ic * Lc); Inc(Ltot, Id * Ld); 
              IF (Ltot<=Lm) THEN <Examen des critères>
            END
    ou si le mur apparaît trop large et les combinaisons trop nombreuses, d'un tirage aléatoire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    REPEAT
      Na:= 1 + Random(NaMax); Nb:= 1 + Random(NbMax); 
      Nc:= 1 + Random(NcMax); Nd:= 1 + Random(NdMax);
      Ltot:= Ia * La; Inc(Ltot, Ib * Lb); Inc(Ltot, Ic * Lc); Inc(Ltot, Id * Ld); 
      IF (Ltot<=Lm) THEN <Examen des critères>
    UNTIL <Critère d'arrêt>;
    Le bloc d'instructions <Examen des critères> consisterait à vérifier les conditions données, selon l'ordre de préséance indiqué.

    Remarque: il est possible d'abréger l'énumération par une évaluation plus progressive des limites supérieures (NbLim, NcLim), et par la suppression de la dernière boucle: on peut en effet calculer directement (Nd) en fonction des 3 autres termes.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. Trouver un algorithme pour mon problème
    Par identifiant_bidon dans le forum Langage
    Réponses: 4
    Dernier message: 28/05/2011, 00h53
  2. Algorithme le plus efficace pour ce problème
    Par george369 dans le forum C++
    Réponses: 2
    Dernier message: 08/11/2009, 15h47
  3. définition algorithme récursif et problème d'optimisation
    Par logo98 dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 10/06/2009, 16h07
  4. problème d'algorithme pour trouver les circuit d'un graphe
    Par marc_dd dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 21/08/2006, 16h36
  5. Recherche de pistes pour un problème d'optimisation
    Par TiKeuj dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 15/08/2005, 15h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo