Partage
  • Partager sur Facebook
  • Partager sur Twitter

aide algorithme Répartition par deux clés

Je deviens fou

Sujet résolu
    9 décembre 2018 à 17:08:38

    Messieurs, Dames, bonjour

    Après plusieurs jours à me rendre quasi malade si cette question (et même plusieurs semaines à penser avoir résolu le problème et puis ben non), je me tourne vers vous en espérant que quelqu'un aura la possibilité de m'aider

    Le problème de base est simple : je dois répartir une valeur entre plusieurs joueurs en fonction de deux critères

    exemple : je dois répartir 200 pièces en fonction des deux colonnes ci dessous.

    Ce qui me pose problème c'est qu'à l'instant du calcul, je n'ai pas encore accès à toutes les valeurs individuelles (l'algo se positionne dans une boucle qui liste les joueurs donc par exemple au moment où je vérifie johnny, je n'ai pas les résultats de tous les autres).

    Les seules données auxquelles j'ai accès à tout instant : le total à répartir, la somme de la colonne jets et la somme de la colonne puissance (en %) et le total de joueurs. Je peux également obtenir les mêmes totaux en excluant par exemple Florent qui est à 0% de puissance.

    j'obtiens bien évidemment les valeurs individuelles de chaque joueur chaque fois que le moment pour l'algo de leur donner leur part du butin.

    Je comprends que ce n'est pas optimal mais c'est une contrainte que je ne peux pas changer donc la solution n'est pas là (si il y'en a une)

      Jets puissance/100
    johnny 10 10
    eddy 20 10
    jacques 17 10
    michel 20 80
    claude 20 100
    florent 15 0
      102 210

    selon cet exemple et l'idée que j'ai en tête je désire que Florent ait 0 pièces, que claude ait sensiblement plus de pièces que johnny, que eddy ait également sensiblement plus que johnny et michel moins que claude mais dans une moindre proportion.

    j'étais parti sur l'idée suivante :

    trésor * (jets/totalJets) * puissance/100


    Ce qui me donne effectivement un résultat individuel intéressant mais dont la somme par définition ne vaut pas la valeur du trésor (200)

    j'ai donc eu l'idée d'essayer de calculer le manquant (ou reste) total avant la répartition mais je ne tombe pas sur le bon résultat quoi que je fasse (des variations sur le thème :

    reste = trésor - (trésor * 210/600)

    avec 210 somme des puissance et 500 : total des joueurs * 100

    Mon algo fonctionnait plus ou moins correctement mais j'ai du introduire la possibilité pour la puissance (ou les jets) d'être faible voir = 0 et ça a tout déréglé

    Je vous remercie d'avance pour l'aide que vous pourrez m'apporter, ce problème me bloque depuis un temps incalculable 

    bon dimanche 

    -
    Edité par elazard 9 décembre 2018 à 17:10:02

    • Partager sur Facebook
    • Partager sur Twitter
      9 décembre 2018 à 18:45:33

      Bonjour,

      La solution me semble assez simple. Prenons Ji et Pi comme les variables de jets et de puissance du joueur i.

      Et appelons PJ la somme des Pi*Ji. C'est simple à calculer, cela peut même se faire directement avec une requête sql. Avec une boucle également.

      Appelons maintenant T le trésor, il suffit donc de donner à chaque joueur le montant T */(PJ*Pi*Ji => la somme est bien égale à T et chaque joueur a bien un montant = constante * Pi * Ji, la constante vaut en l'occurrence T/ PJ qui ne dépend pas de i.

      A toi

      -
      Edité par CarréDas1 9 décembre 2018 à 18:46:10

      • Partager sur Facebook
      • Partager sur Twitter
        9 décembre 2018 à 18:58:13

        Edit : ça fonctionne, un giga grand merci pour ton aide ! je devenais fou :) 

        -
        Edité par elazard 9 décembre 2018 à 20:09:23

        • Partager sur Facebook
        • Partager sur Twitter
          9 décembre 2018 à 20:16:29

          Re,

          Si les joueurs, les jets et la puissance sont dans la même table la requete est très simple, du genre:

          SELECT SUM(`JETS`*`PUISSANCE`) FROM `tablejoueur`

          Et la boucle en php:

          $PJ=0;
          foreach($listejoueur as $unjoueur){
          $PJ+= $unjoueur['JETS'] * $unjoueur['PUISSANCE']
          }

          //Résultat recherché
          $tresor = 200;
          foreach($listejoueur as $unjoueur){
          $unjoueur['score']=($tresor/$PJ)*$unjoueur['JETS']*$unjoueur['PUISSANCE']
          }


          A toi


          -
          Edité par CarréDas1 9 décembre 2018 à 20:23:23

          • Partager sur Facebook
          • Partager sur Twitter
            10 décembre 2018 à 23:12:30

            Salut CarréDas1,

            non ils ne sont pas dans la même table donc j'ai juste imbriqué la deuxième requête dans la boucle de la première valeur et ça fonctionne nickel :) encore une fois un grand merci pour ton aide ! 

            bonne soirée 

            • Partager sur Facebook
            • Partager sur Twitter

            aide algorithme Répartition par deux clés

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown