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

Algorithmes et structures de données Discussion :

Heuristique pour le taquin


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 139
    Par défaut Heuristique pour le taquin
    Bonjour,

    Je dois faire un resolveur de taquin en C++ (sans les classes et objets) et je ne comprends pas comment trouver l'heuristique avec le nombre de cases mal placé et le but. et surtout g et h dans f(e) = g(e) + h(e)
    J'ai 2 piles lee et leae pour stocker les états établis et états à établir qui se retrouve dans ma structure Taquin.

    Ma structure Etat contient un damier, l'indice de l'état précédent se trouver dans la pile lee, les coordonnées de la case vide, le mouvement, g et h.


    Pouvez-vous m'aider pour implémenter en c++ et trouver g et h ?

    Il me semble que je dois trouver quelles sont les positions possibles à chaque fois mais je ne vois pas comment trouver ?

    Merci

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 294
    Par défaut
    Bonjour

    Pouvez-vous m'aider pour implémenter en c++
    Non. Par contre, tu peux le faire et nous pouvons commenter.

    Pouvez-vous m'aider pour trouver g et h ?
    Non. En bon mathématicien, je ne parle pas aux fonctions que je ne connais pas.
    Tu voudrais qu'on explicite g et h alors qu'on ne sait même pas ce que c'est. Ni la fonction f, d'ailleurs.

    Il me semble que je dois trouver quelles sont les positions possibles à chaque fois mais je ne vois pas comment trouver ?
    Le taquin a un trou.
    Une des 4 pièces qui sont autour peut combler le trou.
    Chaque mouvement possible aboutit à une nouvelle position.
    Et de position en position, tu auras listé tous les cas possibles.

    Si une solution existe, elle sera dans ta liste.

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 139
    Par défaut
    Bonjour,

    h est l'heuristique. (nombre de chiffres mal placés)

    g est le coût optimal connu d'un état à un final.


    Est-ce que dans un taquin, il est possible d'avoir uniquement un état final ou plusieurs états finaux ?

    Je pense que la valeur de h se calculerait dans cette fonction ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    inline uint heuristiqueSimple(const Tableau2D &jeu, const Tableau2D &etatFini) {
        uint k = 0;
        for ( uchar i = 0; i < nombre_de_lignes; ++i) {
            for ( uchar j = 0; j < nombre_de_colonnes; ++j ) {
                if ( jeu[i][j] != etatFini[i][j] ) {
                    ++k;
                }
            }
        }
        return k;
    }
    Ce serait en entrée le plateau en cours et le plateau final à atteindre.

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 139
    Par défaut
    Il faut que je change car les paramètres d'entrée demandés dans mon exercice sont heuristiqueSimple(Etat &ei) donc voilà dans l'idée :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    inline uint heuristiqueSimple(Etat &jeu) {
        uint k = 0;
        for ( uchar i = 0; i < nombre_de_lignes; ++i) {
            for ( uchar j = 0; j < nombre_de_colonnes; ++j ) {
                if ( jeu.damier[i][j] != etatFini.damier[i][j] ) {
                    ++k;
                }
            }
        }
        return k;
    }

    Bien sûr, il faudra que je trouve un moyen de faire utiliser etatFini dans la fonction.

    Pour info, la structure Etat que j'ai établie :
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    struct Etat
    {
    	Tableau2D damier;
     
    	enum Mouvement { FIXE, NORD, EST, OUEST, SUD };
    	Mouvement mouvement;
    	int indicelee;
     
    	int g;
    	int h;
     
    	int indicecolonneVide;
    	int indiceligneVide;
    };

    Qu'en dites-vous ?

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 491
    Par défaut
    salut

    la fonction heuristique simple calcul le nombre d’élément mal placé ?
    ce qui veut dire qu'il va falloir explorer toutes les solution possible avant de trouver la solution optimal ?

    pour résumé simplement si j'ai bien compris

    tu as un tableau de Case
    Pour chaque case tu as une position final est une position courante qui au final devrais être la même

    je verrai bien une structure de case comme celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TCase = RECORD 
      PosFinal      : TPos
      Vide           : Boolean; 
      ...
    FIN
    pour chaque case tu peut déterminer les différents mouvement possible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      MouvPossible = [FIXE, NORD, EST, OUEST, SUD ];
    a chaque coup joué il faut actualiser la possibilité de mouvement des cases
    la case vide n'est jamais FIXE

    en sachant que les mises a jour des cases ne s'applique qu'aux cases directement voisines à celles(vide et non vide) que tu vient de déplacer
    posCorant et PosFinal peut être un entier il est possible de linéariser ton tableau
    cela veut dire qu'un tableau de 4*4 peut être représenté par une ligne de 16 éléments
    les cases doivent être dans le tableau positionnée dans l'ordre de la position courante afin d’accéder aux voisins le plus rapidement

    tans que ta poseCourant <> PosFinal Faire un traitement


    Ps pour infos les calculs intéressant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       IPOS = COL+(LIG-1)*NBCOL
       LIG   =   (IPOS DIV  NBCOL)+1 ;//
       COL  =   IPOS MOD NBCOL;//

  6. #6
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 235
    Par défaut
    Je pense que tu n'as jamais joué à ce jeu, et donc, tu ne peux pas t'en sortir. Le fait que tu mettes 'FIXE' dans la liste des mouvements, c'est révélateur. J'imagine qu'on peut trouver des jeux de taquin en ligne. Joue 5 ou 6 parties, ça va te permettre d'assimiler les règles du jeu, et l'objectif.
    Ensuite, tu pourras réfléchir au sujet.

    S'il y a N cases mal placées, alors, une chose est sure, il faudra au moins N mouvements pour arriver à la solution. Mais souvent, il en faudra beaucoup plus. Si tu as 3 cases mal placées à 3 coins du taquin, c'est en gros comme si tu avais toutes les cases mal placées.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 3.X] Besoin d'aide pour tkinter jeu taquin
    Par cilouc dans le forum Général Python
    Réponses: 1
    Dernier message: 18/04/2016, 23h04
  2. Heuristique pour le jeu du Sudoku
    Par sciencem1 dans le forum Intelligence artificielle
    Réponses: 0
    Dernier message: 07/11/2015, 11h39
  3. API pour les cartes heuristiques
    Par sciencesmaths dans le forum Général Java
    Réponses: 0
    Dernier message: 13/02/2012, 14h18
  4. Réponses: 2
    Dernier message: 24/11/2009, 18h08
  5. Heuristique pour Taquin
    Par sn@ke51 dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 12/12/2008, 17h58

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