XL 2019 Distribution de valeurs équitables

Schaeffer40

XLDnaute Nouveau
Bonjour à tous,
Je viens chercher votre aide pour concevoir une fiche excel particulière,

Dans un jeu nous sommes 2 joueurs et essayons de partager équitablement des objets de puissances différentes (indivisibles) pour être tous deux de puissances équivalentes.
J'ai essayé Kutools et le solveur pour l'instant sans succès car j'ai des variables à prendre en compte :

- Nous sommes 2 joueurs
- Nous pouvons porter au maximum 7 objets
- Nous avons une 30ène d'objets de puissances allant de 250 à 5, une grande diversité donc difficile à équilibrer
- On essaye d'obtenir le maximum de puissance pour les 2 joueurs au plus équitable

Avez-vous des idées ?
Merci d'avance !!
 
Solution
Je clos le sujet sur mon projet : distribution de valeurs pour un partage équitable entre deux joueurs.
Ce fichier permet de conserver le meilleur partage après un nombre d'itérations et une tolérance définie.

Il y a peu de modifications par rapport à la dernière fois, merci énormément pour votre travail XLDnautes vous êtes les bests.

@dysorthographie
@sylvanu

dysorthographie

XLDnaute Accro
Rebonsoir à tous,
Je pensais exactement à la même chose Sylvanu sur un nombre d'itération sauf que je ne sais pas m'y prendre, en tout cas c'est une solution sûrement proche du but !

Dysorthographie travail incroyable, pour le coup on conserve une excellente équité en cherchant le meilleur résultat, j'ai implémenté ton tronçon de code pour conserver une valeur Min, cependant je ne dois pas bien m'y prendre, je pensais qu'en ramenant la valeur Min à 12 et plus ça permettrant d'avoir un optimum plus élevé mais ce n'est pas le cas, on est sur la bonne voie.

Salut Eriic, je dirai que la puissance prime le plus comparé à une égalité parfaite, un résultat avoisinant les 85-90% avec par exemple 850/858 me conviendrais très bien.

Au plaisir, merci à tous de vous pencher sur mon problème, la solution se rapproche :D
OrderNamePet power (B)
1​
Peppermint Boss242,6
2​
Peppermint Boss234,68
3​
Peppermint Boss231,62
4​
Royal Ice-Cream150,29
5​
Royal Ice-Cream147,14
6​
Royal Ice-Cream140,47
7​
Turtle Fighter102,44
8​
Royal Ice-Cream100,51
9​
Turtle Fighter98,64
10​
Swamp Creature68,63
11​
Swamp Creature66,1
12​
Swamp Creature65,24
13​
Mechanical time34,78
14​
Steampunk Fish33,47
ici tu te rends compte que ordeur représente l'ordre d'arrivé dans le Recordset
Set Obj = CreateObject("ADODB.Recordset")

si tu filtre sur
Min=1
Obj.Filter = "Order<=" & Min
Obj("Power") sera obligatoirement = 242,6
c'est pour cela que je le fixe à 4 pour garder les ' premier enregistrement!
vue que je supprime deux enregistrement par rotation il me faut au minimum ajouter 3 à chaque rotation
Obj.Delete
Min = Min +3
Maintenant comme le disait eriiic que je salut il est toujours possible d'ogmenter la tolérance de forces entre les deux joueurs.
 
Dernière édition:

Schaeffer40

XLDnaute Nouveau
C'est très technique pour moi je ne maitrise pas le code orienté objet, mais je vois l'idée pour le coup pas de modification de cette valeur Min. Ainsi combien du "top 14" les rotations sont capables de prendre ?
En revanche pour la tolérance, s'il est possible d'obtenir de meilleures valeurs comment je fais pour la modifier dans le code ? J'avoue avoir de mal à me repérer dedans
Merci d'avance

EDIT: J'ai trouvé pour la tolérance, j'essaye maintenant de forcer l'utilisation des 9-10 premiers dans le partage...
While [Différence] = 0 Or Abs([Différence]) > 10
EDIT 2: Au final je doute avoir trouvé la bonne valeur à modifier pour la tolérance...
 
Dernière édition:

Schaeffer40

XLDnaute Nouveau
Bonjour @dysorthographie @sylvanu
J'ai tenté de modifier un peu le fichier pour ajouter des infos n'entrant pas dans les calculs et mis à jours quelques objets.
Je tente différentes tolérences avec 1000 et 5000 itérations mais la différence est souvent beaucoup plus élevée... du genre 40 alors que j'ai défini 9, j'ai laissé le Min = 4.

Avez-vous des idées pour améliorer le projet ? Merci d'avance !

EDIT: J'ai du faire une bêtise sans arriver à trouver pourquoi, la différence est maintenant toujours colossale malgré que le pourcentage est conforme à la tolérance demandée, alors que le MaxPossible semble bien défini
 

Pièces jointes

  • Pet power dysorth V2.xlsm
    42.8 KB · Affichages: 0
Dernière édition:

dysorthographie

XLDnaute Accro
Bonjour,
tu n'as pas besoin de faire plusieurs itération mon code le fait déjà.
Code:
While [Différence] = 0 Or Abs([Différence]) > 10
    Donne
Wend
tes levier sont Abs([Différence]) > 10 qui permet de fixer le seuil de tolérance entre le joueur 1 et le joueur 2
FIltreOrder qui limite le nombre d'enregistrement à tirer au sort. à 1 il affecte 1 Peppermint boss 242,6 au joueur 1
à 2 il affecte 1 Peppermint boss 242,6 au joueur 1 ou au joueur 2
plus FIltreOrder est petit plus il sera difficile de départager les 2 joueur.

FIltreOrder = FIltreOrder + 2 si on augmentes le pas à trois par exemple on facilite léqulibre entre les joueurs:

VB:
Enum d
    adInteger = 3
    adDouble = 5
    adDecimal = 14
    adChar = 129
End Enum

Sub dysorthographie()
Sheets("Analyse").Range("A2:F100").Clear
While [Différence] = 0 Or Abs([Différence]) > 10
    Donne
Wend
End Sub
Sub Donne()
'***********************************************************
'   Ici on défini un Objet RecordSet qui nous servira de collection
'   pour emmagasiner les données de la Feuil1!
' les chemps son respectivement
'   Col(A)=Order,Col(B)=Name,Col(C)=Power
'------------------------------------------------------------
Dim Obj As Object: Set Obj = CreateObject("ADODB.Recordset")    'on creer la collection
Obj.Fields.Append "Order", adInteger, 4                         'On ajoute le Champs Order colonne(A)
Obj.Fields.Append "Name", adChar, 50                            'On ajoute le Champs Name colonne(B)
Obj.Fields.Append "Power", adDouble, 18.4                       'On ajoute le Champs Power colonne(C)
Obj.Open                                                        'on active la collecton
'***********************************************************************
'   Même chose mais pour la restitution des valeur dans la feulle Analyse
'-------------------------------------------------------------------
Dim Joueur As Object:  Set Joueur = CreateObject("ADODB.Recordset") 'on creer la collection
Joueur.Fields.Append "Order", adInteger, 4                          'On ajoute le Champs Order colonne(A)
Joueur.Fields.Append "Name", adChar, 50                             'On ajoute le Champs Name colonne(B)
Joueur.Fields.Append "Power", adDouble, 18.4                        'On ajoute le Champs Power colonne(C)
Joueur.Fields.Append "Joueur", adInteger, 4                         'On ajoute le Champs Joueur 1:2 colonne(D)
Joueur.Open                                                         'on active la collecton
'*******************************************************************
'   Initialisation de la collection Obj
'-------------------------------------------------------------------
With Sheets("Feuil1").Range("A2").CurrentRegion
    For I = 2 To .Rows.Count                                    'de la ligne 2 à la ddernière ligne
        If Trim("" & .Cells(I, "B")) <> "" Then                 'si la cellul n'est pa vide alors
        Obj.AddNew                                              'on ajoute un enregistrement à la collection
            Obj("Order") = .Cells(I, "A")                       'on place le contenu de la colonne(A) dans le champ(Order) de la collection
            Obj("Name") = .Cells(I, "B")                        'on place  le contenu de la colonne(B) dans le champ(Name) de la collection
            Obj("Power") = .Cells(I, "C")                       'on place  le contenu de la colonne(C) dans le champ(Power) de la collection
            Obj.Update                                          'on charche len nouvel  enregistrement dans la collection
        End If
    Next
    End With
'--------------------------------------------------------------
Obj.MoveFirst                                                  'on place la colletion sur le premier
Randomize Format(Timer, "0")                                   'j'initialise le rendom
'**************************************************************
'   le tirage au sort ce fait sur un rendom de la collection Obj
'   pour éviter toutes redondance chaque enregistrement tiré au sort
'   serra affecté à la collection Joueur puis supprimer de la collection Obj
Dim H  As Integer 'permet de calculer le pas type entre les gande et les petite valeur 10/242,6=4.12201154163232E-02
'on peut favoriser les Power les plus élever en filtrant de priférance sur les Orde Bas colonne(A)
'mais dance cas on défavorise un joueur au détrimen de lautre car l'écar est souvan supperreure à 8
Dim FIltreOrder As Integer
FIltreOrder = 2
For I = 1 To 7                                                    'le trirage au sort ce fait sur la base de 7 N° sur les 33 retenu sur la Feuil1
     FIltreOrder = FIltreOrder + 2
     Obj.Filter = "Order<=" & FIltreOrder                          ' on applique un filtre sur  Obj.Filter = "Order"
    While Obj.EOF                                                       'on ajuste le filtre
        Obj.Filter = "Order<=" & FIltreOrder 
        FIltreOrder = FIltreOrder + 1
    Wend
    Obj.Move Int((Obj.RecordCount - 1) * Rnd)                   'On tire au sort un valeur dans la collection Obj
    Joueur.AddNew                                               'on ajoute un enregistrement à la collection Joueur
    Joueur("Order") = Obj("Order")                              'on affect ala colection Joueur("Order") la valeur de  Obj("Order") Colonne(A)
    Joueur("Name") = Obj("Name")                                'on affect ala colection Joueur("Name") la valeur de  Obj("Name") Colonne(B)
    Joueur("Power") = Obj("Power")                              'on affect ala colection Joueur("Power") la valeur de  Obj("Power") Colonne(C)
    Joueur("Joueur") = 1                                        'on afect le joueur 1 à Joueur("Joueur") Collone(D)
    Joueur.Update                                               'on charche len nouvel  enregistrement dans la collection
    '.........................................................
    'H repréente une plage de filtre entre Power du joueur1 et Power du joueur2 pour éviter un trop gran écart!
    ' par exeple
    '1  |   Peppermint boss |   242,6
    '2  |   Peppermint boss |   234,68
    ' Ici l'écart es de +/- 10
    '32 |   25M Sage Hourglass  | 3,53
    '33 |   25M Sage Hourglass  |  3,45
    ' alors que la il plus petit que 1
    '...........................................................
    P = Split(Obj("Power"), ",")(0)                             'on garde la partie entière Obj("Power")
    H = 4.12201154163232E-02 * Obj("Power")
    Obj.Delete                                                  'on suprime l'nregistrement della collection Obj
    'on applique un filtre sur la collection Obj pour ne garder que les enregistrement
    'situer dans une plage de valaures respectant au maximum l'éfaliter entre le joueur 1 et le joueur 2!
    Obj.Filter = "Power>=" & (P - H) & " AND Power<=" & (P + H) 'on applique un filtre sur  Obj.Filter = "Power" à +/- h de la valeur de P
    While Obj.EOF                                                       'on ajuste le filtre
        Obj.Filter = "Power>=" & (P - H) & " AND Power<=" & (P + H)
        H = H + 1
    Wend
    '...........................................................
    Obj.MoveFirst                                                'on revier au premier enregistrmrnt del la collection filtré
    Obj.Move Int((Obj.RecordCount - 1) * Rnd)                   '2xime tirage au sort un valeur dans la collection Obj filtré
   Joueur.AddNew                                                'on ajoute un enregistrement à la collection Joueur
    Joueur("Order") = Obj("Order")                              'on affect ala colection Joueur("Order") la valeur de  Obj("Order") Colonne(A)
    Joueur("Name") = Obj("Name")                                'on affect ala colection Joueur("Name") la valeur de  Obj("Name") Colonne(B)
    Joueur("Power") = Obj("Power")                              'on affect ala colection Joueur("Power") la valeur de  Obj("Power") Colonne(C)
    Joueur("Joueur") = 2                                        'on afect le joueur 2 à Joueur("Joueur") Collone(D)
    Joueur.Update                                               'on charche len nouvel  enregistrement dans la collection
    '.........................................................
     Obj.Delete                                                 'on suprime l'nregistrement della collection Obj
    Obj.Filter = ""                                             'on supprime le filtre
    Obj.MoveFirst                                               'on place Obj sur le prmier enregistrment
    Joueur.MoveFirst                                            'on place Joueur sur le prmier enregistrment
    DoEvents                                                    'on permet à Windows de rafaichir sa mémore
Next
'*************************************************************
Joueur.Sort = "Order"                                           'on fai untri crossant sur Joueur("Order") colonne(A)
'onplace le contenu de la collection {RecordSet} dans la feulle Analyse
With Sheets("Analyse")
    .Range("A2").CopyFromRecordset Joueur
    .Range(.Range("D2"), .Cells(.Rows.Count, "D").End(xlUp)).NumberFormat = """JOUEUR"" 0"
End With

End Sub
 

Schaeffer40

XLDnaute Nouveau
Ah c'était donc bien [Différence] qui fait la tolérance, elle définie cette marge en "power" ou en pourcentage ?

Un grand merci pour tes explications, pardonne moi si je réponds tardivement, j'ai remarqué une différence de fonctionnement en incorporant cette nouvelle Sub comme si elle ne s'arrêtait jamais mais je vais voir ça de plus près tout à l'heure ou demain.

Enorme merci je vous tiens au courant.
 

Schaeffer40

XLDnaute Nouveau
Je clos le sujet sur mon projet : distribution de valeurs pour un partage équitable entre deux joueurs.
Ce fichier permet de conserver le meilleur partage après un nombre d'itérations et une tolérance définie.

Il y a peu de modifications par rapport à la dernière fois, merci énormément pour votre travail XLDnautes vous êtes les bests.

@dysorthographie
@sylvanu
 

Pièces jointes

  • Pet power dysorth V2.1.xlsm
    46.4 KB · Affichages: 0

Statistiques des forums

Discussions
314 656
Messages
2 111 607
Membres
111 218
dernier inscrit
Jean-Kev