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 :

Ordre de construction de mines


Sujet :

Algorithmes et structures de données

  1. #1
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 162
    Points : 4
    Points
    4
    Par défaut Ordre de construction de mines
    Bonjour !

    J'essaye de trouver un bon algorithme pour résoudre ce problème, mais je n'y arrive pas, quelqu'un pourrait-il s'y intéresser ?


    Voici en quoi consiste le problème :

    On souhaite optimiser l’ordre de construction de mines.

    Une mine est un bâtiment qui a un coût, mais qui rapporte une certaine somme d’argent tous les jours. On a à notre disposition plusieurs mines qu’il est possible de construire, à condition bien entendu d’avoir l’argent nécessaire pour les payer. Le but du jeu est de construire toutes ces mines en un minimum de temps. En effet, on se rend compte que l’ordre de construction des mines a son importance, puisque les mines rapportent de l’argent une fois construites, et qu’elles minimisent donc le temps d’attente avant la construction des mines suivantes. Le but de l’algorithme est de trouver l’ordre de construction idéal, qui nécessite un temps total minimal.

    Je n’ai pas réussi à trouver d’algorithme intelligent, autre que le test de toutes les combinaisons possibles.

    On a à notre disposition n mines.
    Chaque mine M_i a un coût c_i et une production p_i.
    Au départ, on n’a pas d’argent, mais on gagne p argent par jour.
    On considère ici que les mines n’ont pas de temps de construction, c’est-à-dire qu’une fois payées, elles sont fonctionnelles instantanément.

    Soit T_i le temps d’attente avant la construction de la mine M_i.

    On a T_i = c_i / (p + somme pour j allant de 1 à i-1 de p_j)

    Le but est donc de minimiser la somme des T_i.


    Voilà ! Si quelqu'un a une idée, merci d'avance !

  2. #2
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Sans démonstration aucune, je pense que construire les mines dans l'ordre décroissant des valeurs est la stratégie gagnante
    -- Yankel Scialom

  3. #3
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 162
    Points : 4
    Points
    4
    Par défaut
    En effet, ça paraît être la solution au premier abord, mais en réalité ce n'est pas le cas :

    On prend M_1 avec c_1=1 ; p_1=1
    et M_2 avec c_2=10 ; p_2=infini

    p_1/c_1 = 1
    p_2/c_2 = infini

    donc M2 devrait être avant.

    Or avec p=1,
    Pour la configuration M1,M2, on trouve T=6
    Et pour M2,M1, on trouve T=10

    Donc M1,M2 est meilleur

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    p_2/c_2 tend vers 0 plutôt non ?

  5. #5
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 162
    Points : 4
    Points
    4
    Par défaut
    Euh non, c'est p_2 qui est infini

  6. #6
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Exact, j'ai omis un détail de mon raisonnement, c'est que le chronomètre s'arrête une fois la dernière mine construite, on ne profite donc pas de sa production. Et personnellement, j'ai toujours eu du mal à optimiser un système non continu ... La seule chose que je peux apporter c'est une formalisation du problème :

    Soient
    • une suite de couples de réels représentant les mines, leur coût et leur production ;
    • une bijection de dans lui-même représentant l'ordre dans lequel les minues sont construites ;
    • le temps de construction de toutes les minues suivant l'ordre ;
    • la production totale une fois la n-ième mine construire suivant l'ordre ;
    • et le temps d'attente nécessaire entre la construction de la (n-1)-ième mine et la n-ième suivant l'ordre



    Alors, les égalités suivantes sont respectées :


    Et c'est ce dernier terme qu'il faut minimiser en jouant sur . Bon courage !
    -- Yankel Scialom

  7. #7
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 162
    Points : 4
    Points
    4
    Par défaut
    Ouép c'est tout à fait ça
    Merci, on y voit plus clair (même si ça n'apporte pas la solution ^^)

    Le problème, c'est qu'on ne peut pas établir de relation d'ordre entre les mines, puisque ça dépend de la permutation u, ainsi que de la production initiale p

  8. #8
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 162
    Points : 4
    Points
    4
    Par défaut
    Bon j'ai peut-être une première piste :

    Soit la liste de mines suivante :
    (A1,...,Ap,B1,...,Bq)

    Si on permute les mines B_i entre elles, le temps d'attente pour les mines A_i n'est pas modifié, puisque celui-ci ne dépend que de ce qui se passe avant, pas après.

    De même, si on permute les mines A_i entre elles, la production résultante au début des B_i reste la même, puisque on permute les éléments d'une somme de productions. Ainsi le temps d'attente pour les mines B_i n'est pas modifié.



    Avant d'aller plus loin, il faut faire attention à la notion de liste idéale :

    L'ordre idéal des mines dans une liste varie en fonction de la production initiale (pas forcément évident à première vue, mais le calcul et des exemples le prouvent).
    Il faut donc parler de liste idéale pour la production p.



    Ceci implique (si je ne me trompe pas) :

    Soit (A1,...,Ap,B1,...,Bq) une liste de mines ordonnée de façon idéale pour p.

    Alors (A1,...,Ap) est une liste idéale pour p
    Et (B1,...,Bq) est une liste idéale pour la somme des productions des A_i


    Je crois que c'est quand même une propriété intéressante.


    De ce fait, on peut par exemple en tirer cette règle :

    Soit (M1,...,Mn) une liste idéale pour p.
    Alors toutes les listes (M_i,M_(i+1)) sont idéales pour la production résultante à la fin de M_(i-1).

    Or la condition d'idéalité pour une liste de taille 2 est la suivante :

    Soit M1 avec c1 et p1
    Soit M2 avec c2 et p2
    Soit p la production initiale

    (M1,M2) est mieux que (M2,M1)
    ssi T12 < T21

    or T12 = c1/p + c2/(p+p1)
    et T21 = c2/p + c1/(p+p2)

    donc la condition est équivalente à :

    c1 * (1+p/p1) < c2 * (1+p/p2)

    Au passage, ce calcul montre que l'ordre dépend de p.



    Donc là on a une condition nécessaire d'idéalité : toutes les mines connexes vérifient 2 à 2 cette propriété.
    Je ne sais pas si c'est une condition suffisante... (ça serait cool quand même ^^, mais faut pas trop rêver je crois)

    En tout cas, on a un moyen d'améliorer une liste non idéale :
    On parcourt les couples de mines connexes, et on permute si elles ne vérifient pas la condition d'idéalité.


    Par contre, la recherche d'une solution vérifiant la propriété d'idéalité 2 à 2 peut être longue :

    Prenons une liste de 3 mines (1,2,3)

    on fait un test et on a 1<2 et 2>3
    on permute donc 2 et 3, on a alors (1,3,2)
    si 1>3, on a ensuite (3,1,2)
    or c'est possible que 2>1 ici, puisque la production de base considérée a changé (1<2 si c'est p, 2>1 si c'est p+p3)
    donc on peut encore continuer comme ça, avec au maximum le test des 6 combinaisons... pas génial

  9. #9
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Points : 77
    Points
    77
    Par défaut
    Ca me semble NP-Hard... Donc je ne crois pas que tu puisses trouver de solutions exactes en temps polynomial

    Néanmoins si tu cherches un formalisme adapté, ça devrait ressembler à :
    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
     
    long computeTime(Mine mines_restantes[], long production, long argent, long temps){
     
       // Si plus de mines, le resultat est le temps courant
       if(isEmpty(mines_restantes)){
          return temps;
       }
     
       // Sinon, on calcule le temps minimum :
       // pour chaque mine, je regarde quel est le resultat si c'est elle que je construis, et je choisis le minimum !
     
       long temps_min[] = new long[mines_restantes.length];
     
       for(int index = 0 ; i<mines_restantes.length ; ++i){
          Mine mine = mine_restantes[i];
          if(mine.cout() <= argent){
             // Dans ce cas, la mine peut etre construite instantanement !
             temps_min[i] = computeTime(mines_restantes.remove(i), production + mine.production(), argent - mine.cout(), temps);
          }
          else{
             // Sinon, combien de temps pour la construire ?
              long difference = mine.cout() - argent;
              long modulo = difference % production;
              short offset = 0;
              if(modulo != 0){
                 offset = 1;
              }
              long temps_construction = difference / prodution + offset;
              temps_min[i] = computeTime(mines_restantes.remove(i), production + mine.production(), argent + (temps_construction * production) - mine.cout(), temps + temps_construction);
          }
       }
     
       // Retourner le temps minimum
       int indexMin = getIndexMin(temps_min);
       long temps_min_glob = temps_min[indexMin];
       return temps_min_glob;
     
    }
    Selon ton nombre de mines, ca pourrait tenir la charge

  10. #10
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    J'ai l'impression que tu supposes que dans tous les cas, si possible, il faut construire. Il est des cas où il est plus intéressant d'attendre afin de construire une mine plus chère.
    -- Yankel Scialom

  11. #11
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Points : 77
    Points
    77
    Par défaut
    Non, pour une mine donnée soit je peux la construire (suffisamment d'argent) et je regarde le temps résultant si je la construis, soit je ne peux pas la construire et alors je regarde combien de temps je dois attendre pour la construire en fonction de mon argent et de ma poduction.
    La seule chose dont on est sûr, c'est qu'attendre alors qu'on a suffisamment d'argent pour construire la mine est contre productif

  12. #12
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 162
    Points : 4
    Points
    4
    Par défaut
    Ouép le code est bien, tu calcules en fait le temps résultant pour toutes les permutations. On a donc une complexité en n! je crois.

    Je reviens sur mon post plus haut :

    On pourrait éventuellement trouver un meilleur algorithme grâce au test d'idéalité 2 à 2. C'est-à-dire tester si chaque couple de mines connexes est dans le bon ordre. C'est comme je l'ai prouvé une condition nécessaire d'idéalité de la liste.

    Les questions à se poser sont donc :

    Est-ce une condition suffisante ? (je crois qu'il ne faut pas trop rêver, mais j'ai du mal à exhiber un contre-exemple pour une liste de 3 mines)

    Dans le cas où ce n'est pas une condition suffisante, ne pourrait-on pas partir d'une liste de mines quelconque, déterminer l'ensemble des permutations qui vérifient la condition d'idéalité 2 à 2, puis simplement prendre le minimum de toutes ces listes ? Serait-ce plus rapide ?

    Pour déterminer une (ou la) liste idéale 2 à 2 à partir d'une liste donnée, comment faire ? Faire les permutations au hasard des couples ne vérifiant pas la propriété amène-t-il à une solution ? Des boucles infinies peuvent-elles survenir ?

  13. #13
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Points : 77
    Points
    77
    Par défaut
    Vérifier tes listes se fait en temps polynomial, mais les construire est plus compliqué.

    En fait je pense que ton problème doit pouvoir se réduire au partition problem :
    http://en.wikipedia.org/wiki/Partition_problem !

    Mais c'est quoi tes ordres de grandeur ? Le nombre de mines, leur cout, leur production, etc ?

  14. #14
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Points : 77
    Points
    77
    Par défaut
    Je l'ai codé en Java, et en gros ça reste viable jusque 11 mines. Au delà trop d'itérations.

    Néanmoins je maintiens ma question précédente, tu as des infos sur les mines ? Notamment est-ce que tu as plusieurs mines qui ont les mêmes caractéristiques ?

    Ta propriété est difficilement exploitable car elle suppose de se retrouver dans une même configuration de production, d'argent actuel de temps actuel et de mines restantes !

  15. #15
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 162
    Points : 4
    Points
    4
    Par défaut
    Ah oué ? Tu peux expliquer pourquoi ça peut se ramener au partition problem ?

    Ta propriété est difficilement exploitable car elle suppose de se retrouver dans une même configuration de production, d'argent actuel de temps actuel et de mines restantes !
    Euh tu peux mieux expliquer s'il te plaît ?

    L'ordre de 2 mines connexes ne dépend que de la production avant celles-ci. De plus, si on permute 2 mines connexes, les temps d'attente pour toutes les autres mines de la liste ne sont pas modifiés (voir post avant). Ce qui fait que quand on optimise une sous liste, le temps de construction total pour la liste ne peut que diminuer.

    Bah j'espérais au départ trouver un algorithme qui ne nécessite pas de connaissances particulières des données ^^. Mais bon ça paraît en effet difficile. A vrai dire ce n'est pas vraiment ce problème qui m'intéressait au départ, c'est plutôt une généralisation du problème : on ne manie plus de l'argent, mais plusieurs ressources, les coûts et les productions ayant des composantes dans ces différentes ressources. Mais c'est à mon avis encore plus difficile...

  16. #16
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Je pense que ce problème est une bonne occasion de se mettre aux algo génétiques. Tu n'obtiendra pas l'ordre idéal mais tu aura alors quelque chose de très acceptable.

    N'hséite pas à continuer à nous faire part de ton avancement.
    -- Yankel Scialom

  17. #17
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Points : 77
    Points
    77
    Par défaut
    Je donnerai d'avantage de détails plus tard (demain ?) sur les optimisations que je vois avec la propriété que tu as énoncée.

    En attendant je livre le bout de code Java que j'ai réalisé cet aprem. J'ai ajouté un système de comparaison entre les mines qui permet en fait de reduire la charge de telle sorte que si N mines ont les memes caractéristiques (meme cout et meme production) alors la complexité n'augmente que de manière linéaire, ces N mines ayant un role similaire. Concrètement, ça permet à la fonction d'accepter une infinité de mines, mais seulement 11 - 12 mines avec des caractéristiques différentes ...

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
     
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.LinkedList;
    import java.util.List;
     
    public class Mine implements Comparable<Mine> {
     
        public long cout;
        public long production;
        public String nom;
     
        public Mine(long cout, long production, String nom) {
            this.cout = cout;
            this.production = production;
            this.nom = nom;
        }
     
        public Mine() {
        }
     
        public int compareTo(Mine o) {
            long diffc = this.cout - o.cout;
            if (diffc > 0) {
                return 1;
            } else if (diffc < 0) {
                return -1;
            } else {
                long diffp = this.production - o.production;
                if (diffp < 0) {
                    return -1;
                } else if (diffp > 0) {
                    return 1;
                } else {
                    return 0;
                }
            }
        }
     
        /*
         * Type de retour de la fonction de calcul : un temps total et l'ordre de
         * construction des mines
         */
        public class Res {
     
            public long temps;
            public List<Mine> mines;
     
            public Res(long temps, List<Mine> mines) {
                this.temps = temps;
                this.mines = mines;
            }
        }
     
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            // TODO code application logic here
     
            Mine m1 = new Mine(10, 4, "m1");
            Mine m2 = new Mine(5, 3, "m2");
            Mine m3 = new Mine(1, 1, "m3");
     
            List<Mine> mines = new LinkedList<Mine>();
            mines.add(m1);
            mines.add(m2);
            mines.add(m3);
            mines.add(m1);
            mines.add(m1);
            mines.add(m3);
     
     
            // Tri pour optimisation des permutations
            Collections.sort(mines);
     
            List<Mine> minesConstruites = new LinkedList<Mine>();
     
            Res res = (new Mine()).computeTime(mines, 1L, 0L, 0L, minesConstruites);
     
            System.out.println(res.temps);
            for (Mine mine : res.mines) {
                System.out.print(mine.nom + " | ");
            }
            System.out.println();
     
     
        }
     
        /*
         * Fonction de calcul du temps et de l'ordre de construction
         */
        public Res computeTime(List<Mine> minesRestantes, long production,
                long argent, long temps, List<Mine> minesConstruites) {
     
            if (minesRestantes.isEmpty()) {
                return (new Res(temps, minesConstruites));
            }
     
            List<Res> resMin = new ArrayList<Res>(minesRestantes.size());
            Mine derniereMine = minesRestantes.get(0);
     
            // Pour chaque mine restante, on calcule le meilleur temps si elle est
            // la prochaine construite
            for (int index = 0; index < minesRestantes.size(); ++index) {
                List<Mine> minesRestantes_ = new LinkedList<Mine>(minesRestantes);
                Mine mineCour = minesRestantes_.remove(index);
     
                // Si la mine courante est la meme que la precedente, inutile de
                // recalculer le cout de la construire
                if (index > 0 && mineCour.compareTo(derniereMine) == 0) {
                    continue;
                }
                List<Mine> minesConstruites_ = new LinkedList<Mine>(minesConstruites);
                // On ajoute la mine a construire dans la liste des mines construites
                minesConstruites_.add(mineCour);
     
                // On peut la construire directement
                if (mineCour.cout <= argent) {
                    resMin.add(computeTime(minesRestantes_,
                            production + mineCour.production,
                            argent - mineCour.cout,
                            temps,
                            minesConstruites_));
                } // On n'a pas assez d'argent, on calcule le temps d'attente
                // necessaire pour engager la construction
                else {
                    long difference = mineCour.cout - argent;
                    long modulo = difference % production;
                    short offset = 0;
                    if (modulo != 0) {
                        offset = 1;
                    }
                    long temps_construction = (difference / production) + offset;
                    resMin.add(computeTime(minesRestantes_,
                            production + mineCour.production,
                            argent + (temps_construction * production) - mineCour.cout,
                            temps + temps_construction,
                            minesConstruites_));
                }
     
                // On met a jout la derniere mine construite
                derniereMine = mineCour;
            }
     
            // On retourne le resultat ayant un temps minimum
            int indexMin = 0;
            long tempsMinGlob = Long.MAX_VALUE;
            for (int index = 0; index < resMin.size(); ++index) {
                if (resMin.get(index).temps < tempsMinGlob) {
                    tempsMinGlob = resMin.get(index).temps;
                    indexMin = index;
                }
            }
     
            return resMin.get(indexMin);
        }
    }
    Tu avais une application spécifique ou c'était juste pour la beauté du geste ?

  18. #18
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Une optimisation supplémentaire peut aussi être faite dans le cas de dominances : si une mine A coûte moins cher et produit plus que la mine B, alors A sera nécessairement construite avant B.

    Si ce genre de cas peut être assez courant, une première évaluation des mines peut être faite ; à chaque mine est alors associé le nombre de mines dominées. Le problème est alors subdivisé en problèmes de plus petite taille, ce qui dans le cas d'un problème en O(n!) est une avancée majeure.

    Sinon ce message ne sert à rien
    -- Yankel Scialom

  19. #19
    Membre actif Avatar de Acrim
    Profil pro
    En recherche d'emploi
    Inscrit en
    Septembre 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Septembre 2010
    Messages : 134
    Points : 204
    Points
    204
    Par défaut
    J'ai l'impression que vous ne prenez pas en compte le cas où la production est telle qu'on peut construire deux mines à la fois. Une M1 peut être plus intéressante qu'une mine M2 et une mine M3 prises individuellement mais moins intéressante qu'une mine M2+M3.

    Si tu arrives à prouver qu'il s'agit effectivement d'une CNS (je pense qu'il s'agit d'une inégalité large et que chaque "membre" doit être arrondi à l'entier supérieur puisqu'on parle d'un nombre de jour), tu pourras alors "facilement" (IMHO) trouver une solution en construisant à chaque itération, pour la production courante, la mine "min" (au sens de ta comparaison).

    Ça me rappelle les problèmes qu'on rencontre quand on joue aux RTS Tu pourras peut être trouver des infos intéressantes en cherchant "build order".
    « La science informatique n'est pas plus la science des ordinateurs que l'astronomie n'est celle des télescopes. » — Edsger Dijkstra

  20. #20
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 162
    Points : 4
    Points
    4
    Par défaut
    Oula t'en as fait du boulot Vakhyw ^^ Dsl j'ai pas le courage de me plonger le code, surtout que je connais toujours pas vraiment le java ^^, mais jte fais confiance xD.

    Une optimisation supplémentaire peut aussi être faite dans le cas de dominances : si une mine A coûte moins cher et produit plus que la mine B, alors A sera nécessairement construite avant B.
    Oui ! En effet j'y avais déjà pensé, et je pense qu'il y a des recherches à faire de ce côté là.

    Mais attention, il faut auparavant démontrer ceci (si c'est vrai) :

    Soit L une liste de mines de production initiale p.
    Soit M1 et M2 des éléments de L, tq p1>p2 et c1<c2.
    Montrer que pour n'importe quelle permutation de L, et quel que soit p, permuter M1 et M2 de manière à avoir M1 avant donne une meilleure liste.

    Si on prouve ça, on aura donc une relation d'ordre partielle sur L.

    Je n'ai pas exactement compris ce dont tu parles, mais j'ai l'impression que tu crois qu'on peut facilement ramener une liste L à une liste L* d'ensembles de mines, avec une relation d'ordre sur L*.

    Je dis facilement parce-qu'on n'a pas de relation d'équivalence, au sens où :
    Si on prend M dans L. On crée L1, L2, L3 tq : tous les éléments de L1 sont "avant" (au sens p>p' et c<c') M, tous les éléments de L3 sont après M, et L2 contient tous les autres.
    Si on prend maintenant M' dans L2, M' différente de M.
    On n'a pas nécessairement L1'=L1 et L3'=L3.

    Donc certes, il se peut qu'on puisse regrouper des mines entre elles, et ainsi diviser notre problème. Mais en général ça n'arrive que rarement je pense.
    En effet, supposons qu'on puisse découper de la sorte la liste L en 2 listes L1 et L2, où L1 inférieur à L2. Ca signifie que le max des productions de L1 est inférieur au min des productions de L2, et que le min des coûts de L1 est supérieur au max des coûts de L2. C'est donc réalisé peu souvent je pense.

    Néanmoins, si on peut découper une liste de la sorte, c'est tout bénef ! Reste à voir si l'algorithme de recherche de ces ensembles de mines est rapide.

    De plus, même si on arrive pas à découper la liste, on a quand même une relation d'ordre partielle. On divise donc le nombre de n! permutations à évaluer par le nombre de relations d'ordre trouvées, ce qui n'est pas négligeable. Là aussi, il faut voir comment implémenter ça.

    Je rappelle que tout cela est vrai à condition de prouver la proposition au-dessus.



    Je ferme la parenthèse soumise à l'hypothèse de l'existence d'une relation d'ordre partielle.

    Je reviens sur l'idéalité 2 à 2 :

    L'ordre d'une liste (M1,M2) initialisée à p, ne dépend que de p.

    on a T12 < T21 <=> c1 * (1+p/p1) < c2 * (1+p/p2)

    ce qui équivaut à p * (c1/p1-c2/p2) < c2-c1

    donc si on note p* = (c2-c1)/(c1/p1-c2/p2)
    p* ne dépend que des caractéristiques de M1 et M2, et p* est symétrique (si on échange 1 et 2, p* ne change pas).

    on montre ceci :

    si p<p* , alors le moins rentable est avant
    si p>p* , alors le plus rentable est avant

    (comprendre la rentabilité au sens p/c)

    Voilà, c'est juste histoire de simplifier l'ordonnancement des couples de mines connexes.

    Euh j'ai pas compris ce qu'on ne prenait pas en compte Acrim

Discussions similaires

  1. Ordre de construction des membres de classe
    Par camboui dans le forum C++
    Réponses: 7
    Dernier message: 14/01/2010, 17h22
  2. [JBuilder 7] Construction d'executable natif
    Par renaudfaucon dans le forum JBuilder
    Réponses: 3
    Dernier message: 24/11/2006, 22h28
  3. ORDER BY dans un ordre inhabituel
    Par Riam dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 21/03/2003, 13h29
  4. Ordre de parcours de l'arbre...
    Par Sylvain James dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 01/12/2002, 18h41
  5. [] Tri d'un tableau par ordre alphabétique
    Par cafeine dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/09/2002, 08h43

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