Forum Programmation.autre Algorithme optimum

Posté par  .
Étiquettes : aucune
0
11
août
2005
Bonjour, je recherche la meilleure solution parmi un très grand nombre de possibilités.
Imaginons deux individus A et B. Ils participent chacun à 10 épreuves différentes (appelées e1 à e10) et chaque épreuve leur rapporte les points a1 à a10 et b1 à b10 respectivement.
On souhaite connaître leur meilleur total en prenant seulement 5 épreuves de chacun, mais on ne peut pas prendre 2 fois les points d'une épreuve (ex: on doit prendre pour e4 soit a4 soit b4, mais pas les deux).
Je parcours donc les possibilités (nombreuses !) comme suit:
s1=a1+a2+a3+a4+a5+b6+b7+b8+b9+b10
s2=a1+a2+a3+a4+b5+a6+b7+b8+b9+b10
s3=a1+a2+a3+a4+b5+b6+a7+b8+b9+b10
... et ainsi de suite.
Le hic c'est le nombre de possibilités (j'ai même pas calculé tellement ça me fait peur).
N'y a-t-il pas plus simple et plus rapide ? Une solution que je ne verrais pas ?
J'ai pensé à utiliser une méthode d'élagage genre alpha-beta, mais ça ne me semble pas très efficace...

Quelqu'un aurait-il une idée de génie ? :)
Merci de vos suggestions !
(Si mes explications n'ont pas été claires, je peux préciser...)
  • # Complexité

    Posté par  . Évalué à 3.

    Si les épreuves sont indépendantes et que tu veux effectivement connaitre la meilleure combinaison, il n'y a pas le choix il faut calculer toutes les possibilités.
    Si mes souvenirs d'écoles sont encore bons, il doit y en avoir 252 (tu choisis 5 épreuves parmi 10 -> 252 combinaisons, que tu affectes à A et les autres vont à B -> aucun choix) ce qui est vraiment pas énorme.
  • # Une idée comme ca

    Posté par  (site web personnel) . Évalué à 3.

    Bon alors c'est juste une idée au réveil et je me demande si je dis pas une grosse connerie :

    Calculer c1=a1-b1, c2=a2-b2, ...
    Prendre les 5 epreuves avec les plus grandes valeurs de c et les compter pour a, compter les autres pour b.
    • [^] # Re: Une idée comme ca

      Posté par  . Évalué à 1.

      Ca c'est élégant !
      Ca marche et c'est rapide.

      Effectivement, maximiser
      (a1 ou b1) + (a2 ou b2) + ... + (a10 ou b10)
      revient à maximiser
      b1 + b2 + ... + (5 parmi {c1, c2, c3, ...})

      Donc tant qu'à prendre 5 parmi les c, autant prendre les 5 plus grands.
  • # une autre idée

    Posté par  . Évalué à 2.

    tu fais un tri sur l'ensemble des valeurs a et b résultant donc en une seule
    liste
    tu vas obtenir quelque chose du genre :

    a3 - b4 - a4 - b2 - b5 - a7 - b7 - b3 - a5 - ...

    tu parcours cette liste et pour chaque note, tu récupère son indice puis tu
    supprimes de la liste la note qui a le meme indice, dans notre exemple :

    tu es sur a3, l'indice est donc 3
    tu parcours la suite de la liste jusqu'a tombé sur b3 puis tu le supprime,
    on a donc :

    a3 - b4 - a4 - b2 - b5 - a7 - b7 - a5 - ...

    tu recommence avec b4 pour obtenir :
    a3 - b4 - b2 - b5 - a7 - b7 - a5 - ...

    etc... jusqu'a la fin de la liste et tu auras le plus grand total.

    en esperant avoir été + ou - clair
    • [^] # Re: une autre idée

      Posté par  . Évalué à 1.

      J'ai oublier de préciser que si tu ne veux prendre que 5 épreuves, tu prends les 5 premiers élements de la liste finale.
    • [^] # Re: une autre idée

      Posté par  . Évalué à 1.

      Oui mais non, pas tout à fait : tu dois quand même prendre 5 scores pour a et 5 scores pour b, avec ta méthode, tu prendras les 10 scores de a si a est toujours meilleur que b (ouh, b il est vraiment naze).

      T'es sûr que tu tombes sur le meilleur résultat possible? Imagine en réduisant à 4 épreuves (j'ai pas toute la journée :-) :

      a b
      9 8
      6 3
      7 8
      7 2

      Ton algo va te donner a1 b3 a4 b2 (soit 27), alors que choisir par exemple b1 b3 a2 a4 t'aurait donné 31! Donc c'est pas bon.

      Il doit bien y avoir un moyen de ne pas explorer toutes les possibilités, mais finalement la complexité de la recherche intégrale est linéaire, donc je ne vois pas vraiment le problème.
      • [^] # Re: une autre idée

        Posté par  . Évalué à 1.


        a b
        9 8
        6 3
        7 8
        7 2

        Ton algo va te donner a1 b3 a4 b2 (soit 27), alors que choisir par exemple b1 b3 a2 a4 t'aurait donné 31! Donc c'est pas bon.


        Mon algo donnera a1 b3 a4 a2 (soit 30)
        et b1 b3 a2 a4 = 8 + 8 + 6 + 7 = 29

        Cependant il est vrai que je n'avais pas compris qu'il fallait obligatoirement 5 de chaque.

        Je vais me repencher sur le problème. :)
        • [^] # Re: une autre idée

          Posté par  . Évalué à 1.

          Mon algo donnera a1 b3 a4 a2 (soit 30)

          Disons que c'était ton algo modifié pour prendre en compte la partie du problème qui n'était pas considérée (tri, puis choix, avec élimination de tous les a quand 5 a avaient été choisis).

          et b1 b3 a2 a4 = 8 + 8 + 6 + 7 = 29

          C'est ma faute, idiot que je suis, j'ai cru que j'étais capable de faire ça sans calculette :-)
          • [^] # Re: une autre idée

            Posté par  . Évalué à 2.

            Je crois que j'ai une solution (peut-être pas optimale, j'en sais rien).

            1) On fait une première passe pour déterminer qui de a ou de b est le plus fort (celui qui a gagné le plus d'épruves parmi les N épreuves). F est le fort, f le faible.

            2) On sélectionne pour f toutes les épreuves gagnées par f. On en a donc déja X <= N/2

            3) On sélectionne ensuite pour f, parmi les épreuves restantes, les N/2 - X meilleurs scores de f, sans regarder le score de F. On a alors la totalité des N/2 épreuves de f.

            4) Il ne reste donc plus qu'à assigner les N/2 épreuves restantes à F.

            Par contre, je ne sais pas si ça gère bien d'éventuelles égalités.
  • # Merci pour vos solutions

    Posté par  . Évalué à 1.

    Merci à tous pour vos solutions, je constate que mon petit pb vous a fait pas mal réagir et réfléchir, à ma grande satisfaction.
    Concernant la complexité pas si grande pour un calcul exhaustif, il faut savoir que ce calcul minime pour une équipe, se fera sur une page web avec un plus grand nombre de concurrents. Du coup, je tenais à faire un calcul rapide, le chargement des données depuis la base postgres avec traitement pour affichage me prenant pas mal de temps déjà...

    J'avais pensé à la solution de calculer les différences entre les deux membres de l'équipe, mais j'avais dû me planter, je pensais que j'oubliais des cas plus optimaux.

    En tous cas, merci encore, je vais gagner un temps précieux avec ça... :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.