7
votes

Améliorer l'algorithme de simulation de football

Dans une autre question, vous m'avez aidé à construire un algorithme de simulation pour le football. J'ai de très bonnes réponses là-bas. merci encore!

Maintenant que j'ai codé cet algorithme. Je voudrais l'améliorer et trouver de petites erreurs pouvant y être. Je ne veux pas discuter de la façon de le résoudre - comme nous l'avons fait dans la dernière question. Maintenant, je veux seulement l'améliorer. Pouvez-vous m'aider à nouveau s'il vous plaît?

  1. Y a-t-il des erreurs?
  2. est la structure des clauses non imbriquées OK? Pourrait-il être amélioré?
  3. sont la tactique intégrée correctement en fonction de ma description?

    Paramètres tactiques qui devraient avoir une influence sur le hasard:

    • $ Tactics [x] [x] Réglage (1 = défensive, 2 = neutre, 3 = offensant): Plus la valeur est élevée, le plus faible est la défense et le plus fort est l'infraction
    • $ tactique x vitesse de jeu (1 = lent, 2 = moyen, 3 = rapide): plus la valeur est élevée, meilleures sont les opportunités, mais plus le risque est le risque d'obtenir une contre-attaque rapide
    • $ tactique X distance des passes (1 = court, 2 = moyen, 3 = Longue): plus la valeur est élevée est la meilleure mais mieux que vous obtenez et plus vous êtes souvent hors jeu
    • $ tactique x création de modifications ( 1 = coffre-fort, 2 = moyen, 3 = risque): plus la valeur est élevée, meilleures sont vos opportunités, mais plus le risque est le risque d'obtenir une attaque rapide
    • $ tactique [x] [4] Pression en défense (1 = faible, 2 = moyen, 3 = élevé): Plus la valeur est élevée, les attaques de contre-attaques plus rapides que vous aurez
    • $ tactique [x] [5] Agressivité (1 = faible, 2 = moyen, 3 = élevé): Plus la valeur est élevée, plus la valeur est la plus attaque que vous allez arrêter par fautes

      Note: Tactique 0 et 4 tactiques 4 sont en partie intégrées dans le reste du moteur, non nécessaires dans cette fonction.

      L'algorithme actuel: xxx

      Mise à jour (2014): Quelques années plus tard, j'ai maintenant publié la base de code complète du jeu comme source ouverte sur github . Vous trouverez la mise en œuvre spécifique de cette simulation dans ce fichier < / a>, si quelqu'un est intéressé.


5 commentaires

Je ne suis pas sûr que Stackoverflow est le bon endroit pour discuter de 191 Loc. Surtout comme vous êtes probablement le seul à savoir si votre code est 100% sémaniquement correct. Astuce: Décidez d'une langue, ne mélangez pas l'anglais et l'allemand dans votre code.


@Middus: Je suis désolé. J'ai écrit le code en allemand mais j'ai traduit toutes les parties importantes en anglais pour vous. Peut-être question stupide: qu'est-ce que "191 loc"? Je pensais que quelqu'un pourrait m'aider parce que toutes les données nécessaires sont en question. Voyons voir ...


Ce que vous montrez ici est un modèle d'une correspondance de football, cependant, je ne suis pas sûr que cela qualifie techniquement comme une "simulation". La simulation est un type spécifique de modélisation qui modélise les changements d'état interne au fil du temps. Inhérent à cela est que l'état interne actuel (par opposition aux conditions externes ", qui sont partiellement ou totalement les paramètres de configuration ou d'attribut) détermine ou totalement les événements possibles ou probables à ce moment-là. Je ne suis pas compétente dans PHP, cependant, cela ne voit aucune référence au temps ou à un changement d'état, ou une détermination des événements basés sur un état mutable.


Oui, bien sûr, il y a des changements d'état: objectifs, offsides, jaune, redevances et fautes sont augmentés (++). ;) En outre, de nouveaux commentaires sont ajoutés au rapport de correspondance. Le compteur de temps est mis en œuvre hors de cette fonction. Cette fonction est appelée à chaque attaque.


Mais à moins que ces changements affectent les événements qui se produisent (ou qui peuvent se produire) dans le modèle, ils sont vraiment externes, plutôt que l'état interne. Donc, par exemple, l'accumulation de cartes rouges peut éventuellement entraîner un joueur étant sorti de jeu, avec les modifications résultant des attributs en jeu de cette équipe. Si oui, alors oui, j'appellerais qu'une simulation (je ne sais pas, car je ne sais pas assez bien PHP pour discerner les détails de cette question dans le code).


4 Réponses :


0
votes

À quelle fréquence ces valeurs vont-elles être vérifiées? Si cela va être utilisé par beaucoup de gens et recouvre constamment ces déclarations if / else, je peux vous voir manger beaucoup de mémoire et courir assez lentement.

Peut-être que vous pourriez peut-être que quelques commutateurs là-bas pour remplacer certaines des siestes?

C'est tout ce que je peux voir pour l'amélioration de la vitesse. Quant à l'algorithme lui-même, je devrai parcourir un peu plus tard si personne ne le fait.


4 commentaires

Merci beaucoup, Braedenp! Les commutateurs sont-ils vraiment plus rapides que des déclarations si / else? Je pense que je ne peux pas utiliser de commutateurs car toutes les déclarations conditionnelles sont imbriquées. Je n'ai aucune idée de l'utilisation des commutateurs ici raisonnablement. Ce serait génial si vous pouviez dire quelque chose à l'algorithme lui-même plus tard.


Pourquoi envisager d'optimiser? Il a demandé des améliorations pour son algorithme.


Et une optimisation n'est pas une amélioration?


Bien sûr que c'est. :) Une optimisation est une amélioration qui tente de faire quelque chose de parfait, n'est-ce pas? Il essaie de faire disparaître les dernières faiblesses.



8
votes

En général, il semble que c'est un problème assez compliqué, et je ne suis pas sûr de la manière dont vous l'obtiendrez efficacement.

Cela dit, j'ai vu des choses qui vous aideraient à vous aider. P >

D'abord, je saisirais les variables dans les paramètres. Cela peut ne pas nécessairement rendre votre code plus rapide, mais cela faciliterait la lecture et le déboguer. Ensuite, je supprimerais les paramètres $ TeamName_att, $ TeamName_Def et les avoir simplement comme des valeurs dans les matrices associatives $ Stride_att, $ forte_def. Étant donné que ces données sont toujours jumelées de toute façon, cela réduira le risque d'utiliser accidentellement un nom d'une seule équipe comme référence à l'autre équipe. P>

Cela le fera donc pour ne pas avoir à rechercher continuellement les valeurs tableaux: p> xxx pré>

Vous avez trois fonctions d'assistant qui ont tous le motif: p> xxx pré>

car cela signifie que cela signifie que vous devez Créez une variable supplémentaire (quelque chose qui peut être coûteux) chaque fois que vous exécutez la fonction, utilisez-les à la place: P>

$goalieStrength = strengths_weight($strength_def['goalkeeper']);


1 commentaires

Merci beaucoup! Vos conseils accélèrent le script et rendez-la plus claire. Je vais mettre en œuvre toutes vos propositions que je pense.



5
votes

i (rapidement) lu à travers elle et j'ai remarqué quelques choses:

  • Le pourcentage d'une carte rouge / jaune est distribué est la même chose aux tiers du champ, est-ce intentionnel? Je ne suis pas un gars de football, mais je dirais que les infractions sont plus susceptibles de se produire sur le dernier tiers du domaine que sur le premier. (Parce que si vous êtes sur le premier, vous défendez probablement)

  • Le pourcentage pour déterminer qu'une pénalité est marquée est la même pour chaque équipe, quelle que soit certaines équipes, ou plutôt des joueurs, sont plus susceptibles de marquer une pénalité que d'autres.

  • Vous ne prenez pas compte des coups de pied d'angle, des blessures possibles après une faute ou des objectifs marqués à l'aide de la tête (ce qui pourrait valoir la peine de mentionner dans le rapport).

    En dehors de cela, vous devrez simplement exécuter cette simulation un lot de fois et voir si les valeurs que vous avez choisi sont correctes; modifier l'algorithme. La meilleure chose à faire est la main la modifie (par exemple. Lire toutes les constantes d'un fichier et gérer quelques centaines de simulations avec des valeurs différentes et différentes équipes), la chose la plus facile à faire est probablement de mettre en œuvre un algorithme génétique pour essayer de trouver meilleures valeurs.

    Fondamentalement ce que vous avez ici est un code de gameplay / ai authentique, vous pouvez donc vouloir lire des techniques utilisées par Game Studios pour gérer ce type de code. (Une chose est de mettre les variables dans une feuille de calcul Google que vous pouvez ensuite partager / modifier plus facilement, par exemple).

    Également, même si vous manquez de choses sur lesquelles une réelle match de football a, il est impossible d'essayer d'être aussi réaliste que possible, car dans ces cas, il est plus important de fournir un gameplay agréable que de fournir une simulation précise .


5 commentaires

Merci, très belles suggestions! :) Je vais regarder tous. Je pense que je peux améliorer la qualité de la simulation avec vos conseils.


"Exécutez cette simulation beaucoup de fois et voyez si les valeurs que vous avez choisi sont correctes" Comment puis-je faire cela? Il suffit de jeter un coup d'œil à tous les rapports de match et décidez s'ils sont réalistes ou non? - "La chose la plus facile à faire est probablement de mettre en œuvre un algorithme génétique pour essayer de trouver de meilleures valeurs" Comment faire un algorithme génétique? Comment mesurer la qualité / remise en forme / le succès de chaque population?


Ce que vous faites est de trouver des valeurs pour certains équipes bien connues (ou plutôt des équipes qui gagnent la plupart du temps et des équipes que vous attendiez perdre tout le temps). Et puis vous décidez quels résultats vous aimez le plus. Maintenant, le problème avec cela est bien sûr que votre interprétation des résultats peut être très subjectivement.


Pour l'algorithme génétique, qu'est-ce que je ferais, c'est essayer d'imiter une compétition de football réelle, par exemple. Exécutez l'algorithme jusqu'à ce que le résultat de l'algorithme correspond aux bonnes positions dans la compétition. Basez le score de fitness, par exemple sur la distance de Levenshtein entre la concurrence générée et la concurrence réelle. Maintenant évidemment, les valeurs que vous avez attribuées aux équipes seront subjectives; Mais ces valeurs donneront à peu près les résultats souhaités. Il y aurait également un problème avec les nombres aléatoires, mais vous pourriez probablement simplement vous moquer du PNRG.


Maintenant, évidemment, vous n'avez pas vraiment besoin d'une implémentation parfaite, ni de l'algorithme parfait. La seule mission réelle est que les résultats que l'algorithme fournissent se conforment aux attentes de vos utilisateurs et sont amusantes à jouer avec.



5
votes

Vous semblez manquer: -

#include oscar.h;
void function dive (int ball_location, int[] opposition, int[] opposition_loc) {
    if (this.location != PenaltyBox || ball_location != PenatlyBox)
       return;
    } else {
       for (x = 0; x < 11; x++) {
           if ( opposition_loc[x] = PenaltyBox ) {
               scream(loudly);
               falldown();
               roll_around();
               cry();
               roll_around();
               scream(patheticaly);
               plead_with_ref();
               return;
            }
     }
     return;
}


1 commentaires

: D Très drôle, peut-être que je vais implémenter cela comme un œuf de Pâques ou pour des jeux amusants. ;)