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

Java Discussion :

copie matricielle optimale


Sujet :

Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 9
    Points : 5
    Points
    5
    Par défaut copie matricielle optimale
    bonjour,

    voila dans le cadre de mes études j'ai eu un projet à effectuer en java :
    l'intelligence artificielle du jeu othello.
    on nous a fourni l'interface du jeu et à nous de faire le reste.

    Maintenant le projet est fini mais je cherche toujours à l'améliorer et à optimiser les traitements.

    j'ai mis en place une recherche de coup possible puis une création d'un arbre N-aire avec l'élagage alpha beta, où chacun des fils à une copie de la matrice (le plateau de jeu) du père ou il est ajouté le coup possible.

    la matrice en question est de taille 8x8 de type Couleur (NOIR, BLANC, VIDE).

    Mon problème se porte sur la copie de cette matrice

    au départ j'ai écrit ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private Couleur[][] copyMatrice(Couleur matrice[][]){
        int tailleMatrice = matrice.length;
        Couleur matriceCopy[][] = new Couleur[tailleMatrice][tailleMatrice];
        for(int i = 0 ; i < tailleMatrice ; i ++){
            for(int j = 0 ; j < tailleMatrice ; j ++){
                matriceCopy[i][j] = matrice[i][j];
            }
        }
        return matriceCopy;
    }
    mais mon IDE (NetBeans 7.0) m'a dit d'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    System.arraycopy(matrice[i], 0 matriceCopy[i], 0, tailleMatrice);
     
    //plutôt que ceci : 
     
    for(int j = 0 ; j < tailleMatrice ; j ++){
        matriceCopy[i][j] = matrice[i][j];
    }
    Le tout fonctionne bien, mais avec un niveau de recherche de profondeur 5 dans mon arbre, je trouve le programme long à répondre.

    C'est pourquoi j'ai utilisé l'outil de profilage intégré à NetBeans et je passe plus de 300ms dans cette fonction à chaque appel.

    ce qui au bout d'un certain nombre de coup représente des secondes.

    Enfin la question :

    existe-t-il un moyen de copier cette matrice plus rapidement que cela ?



    Merci d'avance,

    Ballerssd

  2. #2
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Points : 13 670
    Points
    13 670
    Par défaut
    mais mon IDE (NetBeans 7.0) m'a dit d'utiliser :
    Vraiment Ton IDE te dit les optimisations possibles dans ton code ?

    Citation Envoyé par ballerssd Voir le message
    existe-t-il un moyen de copier cette matrice plus rapidement que cela ?
    Via un tableau, je dirais non. J'ai comme principe de me dire que s'il y a une méthode dans la JVM pour faire ce que je veux, il faut mieux que je l'utilise, elle sera surement mieux testée et optimisée que la mienne.

    Du coup, j'aborderais ton problème d'une autre façon en me posant les questions suivantes :
    - Pourquoi dois-je copier cette matrice autant de fois ?
    - Pourquoi les objets que je copie contiennent-ils autant de données ?
    - ... etc

    En espérant que ça t'aide.
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Robin56 Voir le message
    Vraiment Ton IDE te dit les optimisations possibles dans ton code ?
    Ouais, on est parfois surpris des mauvaises pratiques détectées par l'IDE. Et encore plus de celles détectées par des outils comme findBugs :p

    exemple, dans eclipse, si je tappe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (Object o : maMap.valueSet()){
       //faire des trucs
    }
    eclipse me met un warning disant "pour parcourir un map, utilisez plutot entrySet(), qui évite la création d'un Collection temporaire"

    Blague à part, oui System.arrayCopy est de loin plus performant. Car il n'effectue qu'une seule fois la vérification des limites du tableau, alors que la boucle le fait pour chaque itération. Autrement dit, si t'as 2000 entrées à copier, ta jvm va faire 2000 fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (indexDestination > tailleTableau) 
      throw new ArrayIndexOutOfBoundException()

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    merci de vos réponses,

    Citation Envoyé par Robin56
    Pourquoi dois-je copier cette matrice autant de fois ?
    Je copie autant de fois cette matrice, car à chaque fois que je trouve un coup possible, je crée un nœud dans mon arbre.
    Dans ce nœud, il y a un copie de la matrice du père, le coup à jouer.
    Lors de l'instanciation de ce nœud, je positionne le pion sur la matrice et je retourne les pions capturés.
    Cette copie est importante pour ne pas impacter la matrice du père voire même la matrice du plateau


    Citation Envoyé par Robin56
    Pourquoi les objets que je copie contiennent-ils autant de données ?
    Il s'est avéré que toutes les données de mes nœuds sont nécessaire pour le développement de l'arbre (à un ou deux objets près).


    Citation Envoyé par tchize_
    oui System.arrayCopy est de loin plus performant.
    Il n'y a donc pas de moyen plus rapide pour la copie de matrice, je vais donc être amené à changer le plateau de jeu.

    Pour cela, quel type de collection vous me conseillerez (ArrayList, Vector, Map, ...) ?


    merci d'avance

    Ballerssd

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ca ne vas pas vous avancer, toutes ces collections utilisent des tableau en backend


    Êtes vous sur que c'est la copie qui vous pose problème dans votre algorithme? N'est-ce pas plutot l'algorithme en lui même qui est à revoir? Vous pouvez toujours gagner un peu de temps en utilisant un tableau à 1 dimension [tailleMatrice*tailleMatrice] pour copier l'intégralité en un seul appel, mais après faut voir la taille des données et combien de fois vous les copiez.

    De plus, une matrice de jeu d'othello, ça doit pas être bien grand, c'est 64 cases, un byte par case, c'est pas la copie de 64 malheureux octets qui vont jouer sur vos perfs.

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Points : 338
    Points
    338
    Par défaut
    Citation Envoyé par ballerssd Voir le message
    Pour cela, quel type de collection vous me conseillerez (ArrayList, Vector, Map, ...) ?
    Je ne crois pas que tu trouves de collection miracle pour ça, les tableaux sont généralement ce qu'il de plus efficace et la plupart des collections utilisent des tableaux en interne.

    Mais puisque tes données sont déjà organisées en arbre, pourquoi ne stockes tu pas que les éléments qui ont changés dans un enfant et pour connaître les autres éléments tu demandes au parent ?

    Edit: orthographe

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    merci pour vos réponses rapide.

    Citation Envoyé par tchize_
    Ça ne vas pas vous avancer, toutes ces collections utilisent des tableau en backend
    Bon alors je n'ai rien à changer de ce coté là.
    Je vais essayé de voir les optimisations possible dans mes algorithmes de recherche et de création de nœuds fils.

    Citation Envoyé par -gma-
    pourquoi ne stockes tu pas que les éléments qui ont changés dans un enfant et pour connaître les autres éléments tu demande au parent ?
    Si je comprends bien tu me conseilles de n'avoir qu'un "tableau" de coup joué et et la couleur associée au pion et de ne garder que ça en mémoire et de ne plus utiliser la matrice de Couleur ?

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Points : 338
    Points
    338
    Par défaut
    Citation Envoyé par ballerssd Voir le message
    Si je comprends bien tu me conseilles de n'avoir qu'un "tableau" de coup joué et et la couleur associée au pion et de ne garder que ça en mémoire et de ne plus utiliser la matrice de Couleur ?
    Quelque chose de cet ordre là. Mais l'impact sur le temps d'exécution dépendra de comment (et avec qu'elle fréquence) tu utilises tes matrices et de leur taille aussi. Au lieu de regarder la Couleur dans la matrice aux coordonnées (i,j), tu regarde si le coup a été joué à partir ou vers (i,j) et en fonction de la réponse et de l'état de (i,j) dans le parent tu en déduis la Couleur.

    Ca devrait accélérer la construction de ton arbre puisque tu n'auras plus toute la matrice à copier, en contrepartie le parcours de l'arbre sera peut être sensiblement plus long mais généralement le temps de lecture des données est très inférieur au temps d'écriture. Encore une fois ça dépend du reste de l'algo, donc je ne peux que te le suggérer

  9. #9
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    Un arbre de décision ne devrait comporter que les coups joués (voir les exemples de notation aux échecs).

    Pour simplifier(optimiser) la représentation du plateau après "simulation" de n-coups, il est possible de créer une matrice de Case plutôt que de Couleur. Chaque case permettant de stocker une couleur et les décisions/éventualités/simulation de coups.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par -gma-
    Quelque chose de cet ordre là. Mais l'impact sur le temps d'exécution dépendra de comment (et avec qu'elle fréquence) tu utilises tes matrices et de leur taille aussi. Au lieu de regarder la Couleur dans la matrice aux coordonnées (i,j), tu regarde si le coup a été joué à partir ou vers (i,j) et en fonction de la réponse et de l'état de (i,j) dans le parent tu en déduis la Couleur.
    pour le moment ça me parait encore abstrait, mais j'y réfléchirai à tête reposée.


    Citation Envoyé par Nemek
    Pour simplifier(optimiser) la représentation du plateau après "simulation" de n-coups, il est possible de créer une matrice de Case plutôt que de Couleur. Chaque case permettant de stocker une couleur et les décisions/éventualités/simulation de coups.
    Avec cette solution, je pense que cela reviendrai au même, car même si dans une seule case du plateau je stocke la couleur, et le(s) coup(s) possible(s), il faudra bien que je développe plus loin et que je copie cette matrice de Case.


    Je vous remercie d'avoir répondu à ma question.

    Pas que je ne veuille pas continuer sur cette conversation là mais ce n'est plus dans le cadre du sujet original, je vais appliquer le tag et si j'ai de nouveau besoin d'aide, je rouvrirai un sujet.

    Merci encore, bonne continuation.

    Ballerssd

  11. #11
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    Citation Envoyé par ballerssd Voir le message
    Avec cette solution, je pense que cela reviendrai au même, car même si dans une seule case du plateau je stocke la couleur, et le(s) coup(s) possible(s), il faudra bien que je développe plus loin et que je copie cette matrice de Case.
    Non tu ne copies pas la matrice justement. Chaque case stocke ses éventualités (une liste triée comme les feuilles d'un B-Tree). Les cases non-sollicitée prennent toujours autant de place et tu ne stockes qu'une information par éventualité.
    Dans ton cas tu copiais la matrice pour chaque éventualité.

    L'arbre des éventualités d'une case devrait présenter qu'une branche par changement et pour trouver la valeur de la case lors d'une itération il faudrait identifier chaque embranchement de l'arbre de décision (ex : On part de l'état 0, on a 3 éventualités, on a donc les état { "0", "0.0", "0.1", "0.2" }.
    La case associée à "0.0" voit sa lister devenir ["0" => B, "0.0" => N]
    Disons qu'à l'itération suivante cette case est également sollicité par "0.1" => [ "0" => B, "0.0" => N, "0.1.0" => N ]
    On arrive par exemple aux éventualités suivantes pour une case [ "0" => B, "0.0" => N, "0.1.0" => N, "0.1.0.1" => B, "0.2.0.1" => N, "0.2.1" => N, "0.2.1.0" => B]
    A partir de cette liste et d'une simple recherche binaire, je peux donner l'état de la case pour les différents éventualités
    |                                                                                                           0                                                                                                           |
    |                                                                                                           B                                                                                                           |
    |                                  0.0                                  |                                  0.1                                  |                                  0.2                                  |
    |                                   N                                   |                                   B                                   |                                   B                                   |
    |         0.0.0         |         0.0.1         |         0.0.2         |         0.1.0         |         0.1.1         |         0.1.2         |         0.2.0         |         0.2.1         |         0.2.2         |
    |           N           |           N           |           N           |           N           |           B           |           B           |           B           |           N           |           B           |
    |0.0.0.0|0.0.0.1|0.0.0.2|0.0.1.0|0.0.1.1|0.0.1.2|0.0.2.0|0.0.2.1|0.0.2.2|0.1.0.0|0.1.0.1|0.1.0.2|0.1.1.0|0.1.1.1|0.1.1.2|0.1.2.0|0.1.2.1|0.1.2.2|0.2.0.0|0.2.0.1|0.2.0.2|0.2.1.0|0.2.1.1|0.2.1.2|0.2.2.0|0.2.2.1|0.2.2.2|
    |   N   |   N   |   N   |   N   |   N   |   N   |   N   |   N   |   N   |   N   |   B   |   N   |   B   |   B   |   B   |   B   |   B   |   B   |   B   |   N   |   B   |   B   |   N   |   N   |   B   |   B   |   B   |
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/05/2007, 08h20
  2. Protéger une disquette contre la copie
    Par benzaza dans le forum Assembleur
    Réponses: 20
    Dernier message: 16/01/2005, 10h42
  3. Copier et afficher une copie d'ecran
    Par Bobx dans le forum Langage
    Réponses: 6
    Dernier message: 02/08/2002, 22h20
  4. Copie de fichier
    Par Bjorn dans le forum C
    Réponses: 4
    Dernier message: 11/06/2002, 15h23
  5. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 16h20

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