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

Langage C++ Discussion :

Algorithme optimiser C++


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut Algorithme optimiser C++
    Bonjour,

    Je code un algo mémétique et j'ai besoin d'une fonction de croisement. J'utilise le LOX crossover et j'aimerais de l'aide pour optimiser cette fonction.


    LOX : Deux points de croisement sont choisis au hasard dans le premier parent P1. Les clients entre ces deux points sont recopiés dans C1 à la même position et sont supprimés de P2. C1 est ensuite complété par les clients restants de P2 dans le même ordre de gauche à droite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    QList<int> LOX(const QList<int> & P1, const QList<int> P2) {
        QList<int> C1;
     
        [...]
     
        return C1;
    }
    J'ai déjà coder une fonction mais elle est trop lente et fait des parcourts inutiles.

    Merci.

  2. #2
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    Beh si tu ne nous montres pas comment tu as fait, on risque pas de pouvoir te dire là où tu perds du temps ou ce qu'il ne va pas dans ton code

  3. #3
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    QList<int> LOX(const QList<int> & P1, const QList<int> & P2) {
        unsigned int i, value, n1 = P1.size(), n2 = P2.size();
        qsrand(QTime::currentTime().msec());
     
        // Points de croisements
        unsigned int min = randInt(  0, n1 - 1);
        unsigned int max = randInt(min, n1 - 1);
     
        // On recopie les élements de P1 situer entre les points de croisements
        QList<int> C1;
        for (i = min; i < max; ++i)
            C1.push_back(P1[i]);
     
        // On recopie tous les éléments de P2 dans C2
        QList<int> C2;
        for (i = 0; i < n2; ++i)
            C2.push_back(P2[i]);
        // On supprime dans C2 les éléments de P1 qui sont situer entre les points de croisements
        foreach (value, C1) {
            i = 0; bool stop = false;
    	while (i < C2.size() && stop != true) {
    	    if (value == C2[i]) {
    	        C2.removeAt(i); stop = true;
                }
    	    ++i;
            }
        }
     
        // On insère les derniers éléments dans C1
        i = 0;
        foreach (value, C2) {
            if (i < min) C1.insert(i, value);
    	else C1.push_back(value);
    	++i;
        }
     
        return C1;
    }

  4. #4
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    QList<int> LOX(const QList<int> & P1, const QList<int> & P2) {
        unsigned int i, value;
        qsrand(QTime::currentTime().msec());
     
        // Points de croisement
        unsigned int min = randInt(  0, n1 - 1);
        unsigned int max = randInt(min, n1 - 1);
     
        QList<int> C1;
        // On récupère dans C1 toute les valeur de P1 entre les points de croisements
        for (i = min; i < max; ++i)
            C1.push_back(P1[i]);
     
        // On retire de P2 toute les valeur de C1
        foreach (value, C1) {
           P2.removeAll(value);
        }
     
        if (min < P2.size())
          i = min-1;
        else
          i = P2.size()-1;
        unsigned int save = i;
        // On récupère les valeur de P2 entre 0 et min mais en ordre inverse pour utiliser le push_front
        while (i >= 0) {
           C1.push_front(P2[i]);
           i--;
        }
     
        // On complete par la droite C1 avec les valeur de P2 restante.
        i = save+1;
        while (i < P2.size)
        {
           C1.push_back(P2[i]);
           i++;
        }
     
        return C1;
    }

    Essaie avec ce code, je promet pas que ça fonctionne du premier coup, mais l'idée est là

  5. #5
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    538
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2012
    Messages : 538
    Par défaut
    Tu remplace mon insert par un push_front. C'est la même chose au final

  6. #6
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    Nop les boucles seront moins longue car on ne parcoure qu'une seule liste a la fois, sinon je suis en train de reflechir a une meilleur boucle, mais pas sur que tu puisses mieux optimiser que sa et que sa reste lisible :/

Discussions similaires

  1. [Algorithme] Optimiser l'espace entre des blocs
    Par bilaloch dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 10/07/2014, 02h12
  2. Recherche algorithme optimisation
    Par jlf205 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 12/07/2010, 09h56
  3. Optimisation algorithme de programmation
    Par mp_moreau dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 29/07/2007, 19h24
  4. Algorithme d'optimisation par colonie de fourmis
    Par floopy dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 08/11/2006, 15h03

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