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

Intelligence artificielle Discussion :

Chemin Tableau ou Graphe


Sujet :

Intelligence artificielle

  1. #21
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    Citation Envoyé par nicodn02 Voir le message
    Sujet : Tower Defense
    Map :
    _ map vide
    _ zone entree - zone sortie
    _ murs sur la map ( zones constructibles pour les tours)

    Donc en fait, c'est pas vraiment un labyrinthe .. juste qu'il y a des murs où je n'est pas le droit de passer dessus pour trouver mon chemin ...
    Bah moi je te dirais bien de partir directement vers la zone de sortie, et si tu rencontres un mur (une tour), tu le contournes, puis tu reprends ton chemin.

    Ce qui m'étonne c'est que ta map ne correspond pas du tout à un tableau. Qu'as-tu déjà fait ?
    Mindiell
    "Souvent, femme barrit" - Elephant man

  2. #22
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    salut j'avais fait un dijkstra dans un tableau (en 4-connexité):


    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
    void calc_chemin (Int i1, Int j1, Int i2, Int j2, Int v) {
        // si on est en dehors du tableau
        if (i1 == 0 || (i1 == maxi-1) || j1 == 0 || j1 == maxj-1) return ;
        // on met en (i1,j1) le poids v
        _matrice[j1][i1] = v;    
        v++; // on incrémente directement le poids
        if (i1 == i2 && j1 == j2) return ; // on est arrivé ! départ = arrivée
        // si le poids déja dans la case d'à côté est plus grand que le poids avec lequel on va y arriver, alors on y va
        if (v < _matrice[j1+1][i1] || _matrice[j1+1][i1] == 0) 
            calc_chemin (i1, j1+1, i2, j2, v);
        if (v < _matrice[j1-1][i1] || _matrice[j1-1][i1] == 0)
            calc_chemin (i1, j1-1, i2, j2, v);
        if (v < _matrice[j1][i1+1] || _matrice[j1][i1+1] == 0)
            calc_chemin (i1+1, j1, i2, j2, v);
        if (v < _matrice[j1][i1-1] || _matrice[j1][i1-1] == 0)
            calc_chemin (i1-1, j1, i2, j2, v);
    }
     
    /* on initialise à +infini toutes les cases vides du labyrinthe
    on met -1 pour les murs 
    puis on appelle dijkstra
    */
    calc_chemin (xdepart,ydepart,xarrivee,yarrivee, 1);

  3. #23
    Membre régulier Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Points : 97
    Points
    97
    Par défaut
    ba en fait .. pour le calcul du chemin:
    je pars d'une des zones d'entrées .. et je trouve un chemin (le plus court si possible) jsuqu'à une des zones de sorties, en évitant les murs
    Autrement dit, sur la map :
    _lieux de départ
    _murs
    _lieux d'arrivée

  4. #24
    Membre régulier

    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 105
    Points
    105
    Par défaut
    Une technique assez simple, qui a été de très nombreuses fois éprouvée, est celle des points de contrôle.

    Si tu n'as accès à la carte qu'une fois le programme lancé, il te faudra le calculer de manière automatique... Il y a quelques algorithmes assez efficaces (spacial partioning est le terme anglais si tu compte chercher). Perso, te conseillerais simplement de quadrier la carte puis d'élaguer les surplus, à la manière "marching cube" en 3d, de sorte à en avoir très peu dans les grands espaces et un maximum dans les petits espaces.
    Tu n'as qu'à ensuite calculer la distance entre chaque points.
    Dans tous les cas, c'est bien évidement à faire offline, c'est à dire lors de la sauvegarde de la carte (si tu y as accès), soit lors du chargement.

    Il ne te restera qu'à effectuer un A* avec une heuristique (distance direct du point de contrôle le plus proche à un autre) extrêmement proche de l'heuristique optimale, donc particulièrement efficace.

    Pour prendre en compte les obstacles, si tes points de contrôle sont correctement placés, c'est à dire de manière à former des lignes directes (si tu veux t'amuser, tu peux les relier par des splines... ) l'occlusion sera très facile à déterminer à l'exécution. C'est en plus une méthode très efficace dans le cas d'ajouts d'obstacles permanents, puisqu'il suffit alors de supprimer l'arrête reliant deux nœuds. En cas d'ajouts de nouvelles surface sur lesquels se déplacer, il suffit de modifier localement le graphe ; ça se fait également très simplement.


    De manière plus avancée, tu pourras de plus optimiser ça avec :
    - un regroupement des unités proches d'un point de contrôle et le calcul du chemin le plus court pour le groupe entier (à utiliser sur les grande "avenues", et les graphes à faible connexité)
    - un système de programmation linéaire de type flot à coût minimum, pour déplacer un flot équivalent au nombre d'unité du point de contrôle le plus proche vers le point cible (à utiliser dans les petites "rues" et les graphes à forte connexité)
    - un système de LoD sur le graphe des points de contrôle et de manière plus poussé un système hiérarchique par zones

    Si il faut considérer le fait qu'un simple agent est une occlusion pour un autre, je voterais soit pour leur regroupement, ou pour un système de flocking behavior.
    "The worst errors I've ever seen do not came from no knowledge, but from having just the the right amount of it, too small to really understand what you're doing, but enough to think you did. That amount of knowledge, is evil."

  5. #25
    Membre actif
    Inscrit en
    Mars 2008
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 209
    Points : 227
    Points
    227
    Par défaut
    j aimerai bien voir un exemple pour mieux raisonner
    voici un labyrinthe ... comment va tu coder ta matrice ?
    Images attachées Images attachées  

  6. #26
    Membre régulier Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Points : 97
    Points
    97
    Par défaut
    mon labyrinthe sera coder comme sa .. en représentation visuel , sur un tab [][]:

    |E|E|-|-|-|-|-|-|-|-|
    |E|E|-|-|-|-|-|-|-|-|
    |-|-|-|-|-|-|-|-|-|-|
    |-|-|X|X|-|-|-|-|-|-|
    |-|-|X|-|-|-|-|-|-|-|
    |-|-|X|-|-|-|-|-|-|-|
    |-|-|X|-|-|X|X|-|-|-|
    |-|-|-|-|-|-|-|-|-|S|
    |-|-|-|-|-|-|-|-|-|S|
    |-|-|-|-|-|-|X|X|X|-|
    |-|-|-|-|-|-|-|-|-|-|

    où E : zone d'entrée (les créatures apparaisseront surement directement en tab[1][1]
    S : zone de sortie (dès qu'une créature est sur une zone de sortie elle disparait)
    X : mur

    Aszarsha:
    je ne comprend pas vraiment ce que tu viens de me dire --"

  7. #27
    Membre régulier

    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 105
    Points
    105
    Par défaut
    En gros, ce que je te conseil, c'est de quadriller intelligemment la carte en waypoints (puisque apparemment elle peut être potentiellement grande), puis de faire des A* dessus.
    Pour la gestion des occlusions, il me semble que c'est clair.
    Une fois que tu aura ce système de fonctionnel, tu devrais ensuite étiqueter chaque arrête avec sa capacité (comme une débit dans des tuyaux) de manière à simuler un flot (d'unités par exemple).

    Pour des détails, voir le message précédent.
    "The worst errors I've ever seen do not came from no knowledge, but from having just the the right amount of it, too small to really understand what you're doing, but enough to think you did. That amount of knowledge, is evil."

Discussions similaires

  1. Calcul de plus court chemin dans un graphe
    Par Elmilouse dans le forum Prolog
    Réponses: 6
    Dernier message: 21/03/2010, 20h26
  2. Actualiser tableau et graph dynamique
    Par Fadafana dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/01/2008, 17h54
  3. Section avec tableau et graphe
    Par frederic_s dans le forum Deski
    Réponses: 12
    Dernier message: 26/12/2006, 15h34
  4. Tableau et graphe l'un au dessus de l'autre en format paysage ?
    Par flaxseed dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 3
    Dernier message: 24/08/2006, 23h09
  5. N plus courts chemin dans un graphe
    Par MLK jr dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 13/03/2006, 00h32

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