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

Mathématiques Discussion :

Systèmes Réducteur nouvel algo


Sujet :

Mathématiques

  1. #21
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 98
    Points : 10
    Points
    10
    Par défaut
    SUPER as tu changé quelque chose a mon algo ?
    en tout cas tu as reussi et le resultat est quand meme SUPER maintenant il faut essayer de comprendre POURQUOI avec cet algo on arrive pas au minimum qui est 14 je fais une erreur de logique quelque part mais je ne sais pas ou ?

    as tu essayer maintenant que nous savons que l'algo marche de faire avec 2 comme tu m'avais expliqué plus haut ?

    Je suis super content enfin je pense que toi aussi car je suppose que ce genre de probleme rentre en plein dans l'algo ?


    je comprends rien a ton programme :-)

    saurais tu le tranformer en C ?

    as tu verifier comme je le disais plus haut en gardant la premiere ayant le max de combi ?

    si tu as changé l'algo pourrais tu me dire quel est ton algo ( le plus precis possible avec des mots simples :-) )

    si c'est le cas comment se fait t'il que moi avec mon algo a la main j'arrive a 15 ?

  2. #22
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Je n'ai rien changé à ton algo, je l'ai appliqué tel quel.
    J'ai d'ailleurs été fort surpris de voir que l'ordre des combinaisons dans Tab1 avait une importance sur l'état final de Valid. Je ne me l'explique pas encore très bien mais c'est un fait.
    Je trouve donc la même chose que toi à la main, le même nombre 15 les mêmes combinaisons dans le même ordre.
    Maintenant tu me dis que 15 n'est pas optimal, c'est que ton algo n'est pas encore optimal.
    Je n'ai a priori, pour le moment, aucune bonne idée pour l'améliorer.
    Pour ce qui concerne la traduction en C, Python étant un langage non typé il n'y a aucune traduction automatique possible.
    Il faut donc tout refaire à la main et parfois c'est long. Python à des instructions très puissantes que j'utilise beaucoup et qui n'ont (à ma connaissance) pas leur équivalent en C pur.
    Cela dit, la traduction ne doit être faite que si elle est absolument nécessaire, c'est à dire si le programme Python est trop lent, et si on a un espoir d'arriver à un temps raisonnable en C (ce qui n'est d'ailleurs pas toujours le cas).
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  3. #23
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 98
    Points : 10
    Points
    10
    Par défaut
    AH super donc mon algo fonctionne bien et mon erreur etait d'avoir oublier de te dire de garder la premiere combi ayant le max c'est bien ça ?

    pour l'ordre des combi si c'est normal .
    car si par exemple ta 2 ieme bonne commence par un 2 elle couvrira moins de combinaisons qui commence par 1 pour la simple et bonne raison qu'il y a plus de combinaisons qui commence par 1 ensuite ce nombre diminue normal car il commence a y avoir plus de combi qui commence par 2 enfin je sais pas tres bien comment l'expliquer car malheureusement je n'ai pas les connaissances .

    pour l'optimisation je pensais a l'idée que tu as trouvé faire le total pour 2 je trouve que c'est une bonne idée .

    ton programme je le comprends pas car tu parle de binaire et la pour moi c'est de l'hebreu :-)


    je vais reflechir a des moyen pour essayer de faire en sorte qu'il soit optimal c'est un joli challenge mais je crois que c'est toi qui va trouver car je suis depuis trop longtemps dedans il y a certainement un TRUC evident que je ne voie pas .

    ce que je comprends pas c'est pourquoi avec cet algo je ne trouve pas 14 c'est ça que j'ai jamais jusqu'as maintenant compris je sais intuitivement qu'il manque un truc tout bete mais je vois pas lequel :-)

    pour info voici un groupe de 14 ( mais il y en as beaucoup d'autres comme pour 15 d'ailleurs ) qui reponds a notre probleme :

    1-2-3-4-5-6
    1-2-3-7-8-9
    1-2-4-6-9-10
    1-2-6-7-8-10
    1-3-4-5-7-10
    1-3-4-8-9-10
    1-5-6-7-8-9
    1-5-6-8-9-10
    2-3-5-6-8-10
    2-3-5-7-9-10
    2-4-5-7-8-9
    2-4-5-7-8-10
    3-4-6-7-8-9
    3-4-6-7-9-10


  4. #24
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Citation Envoyé par zhao Voir le message
    ton programme je le comprends pas car tu parle de binaire et la pour moi c'est de l'hebreu :-)
    Cela c'est purement technique c'est juste une astuce pour générer les combinaisons. Tu peux l'oublier, l'important est de comprendre ce que fait chaque fonction ayant un rapport direct avec ton algo.
    As-tu installé python ?
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  5. #25
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par zhao Voir le message
    je prends la combinaisons de tab1 qui auras le nombre de suppression potentiel le plus grand et je supprime ses combinaisons de RESTE et je met la combinaison qui eu le plus grand potentiel dans VALID et je continue jusqu'as ce que RESTE =0
    C'est l'heuristique que j'ai utilisé dans mon programme Java. L'experience a prouvé qu'elle n'etait pas optimale... et meme loin de là avec l'exemple 9-6/5.

    Je pense me souvenir que ce genre de problème (minimum weighted set cover) est NP-hard, mais je n'ai pas retrouvé la source.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  6. #26
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    J'ai traduit en C, comme tu le souhaites Zhao.
    L'algo est inchangé pour le moment, et le résultat est le même soit 15.
    Si tu veux comprendre j'ai utilisé une astuce pour ne traiter que des nombres et pas des combinaisons.
    La correspondance est la suivante:
    exemple 63, s'écrit en binaire 111111 =0000111111=[5,6,7,8,9,10]
    1008=1111110000=[1,2,3,4,5,6]
    Je vais commencer à réfléchir à une première optimisation basée sur les couples de candidats.

    Code C : 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
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    #include <stdio.h>
    #include <stdlib.h>
     
    unsigned int * Tab1, *Reste,*Valid;
    unsigned int taille;
     
    //calcule les puissances de 2
    unsigned int power2(unsigned int n)
    {
        unsigned int result=1;
        int i;
        for (i=1;i<=n;i++)
            result *=2;
        return result;
    }
     
    // calcule le nombre de chiffres de n en binaire
    unsigned int nbcb(unsigned int n)
    {
        unsigned int s=0;
        while (n)
        {
            s+=n%2;
            n/=2;
        }
        return s;
    }
     
    // nombre de chiffres comuns à m et n
    unsigned int communs(unsigned int m, unsigned int n)
    {
        return nbcb(m&n);
    }
     
    // Calcule combien peut supprimer n dans Reste
    // sur la base de p éléments communs
    unsigned int PeutSupprimer (unsigned int n, unsigned int p )
    {
        unsigned int s=0;
        unsigned int i;
        for (i=0;i<taille;i++)
            if (communs(n,Reste[i])>=p)
                s++;
        return s;
    }
     
    // Elimine de Reste tous les éléments ayant p au moins éléments communs avec n
    void eliminer(unsigned int n, unsigned int p)
    {
        unsigned int i;
        for (i=0; i<taille;i++)
            if (communs(n,Reste[i])>=p)
                Reste[i]=0;
    }
     
     
    // Calcule les coefficients Cp,n
    unsigned int Cpn(unsigned int p, unsigned int n)
    {
        unsigned int s=0;
        unsigned int i;
        for (i=0;i<power2(n);i++)
            if (nbcb(i)==p) s++;
        return s;
    }
     
    // initialise Tab1 , Reste et Valid
    void init(unsigned int p,unsigned int n)
    {
        unsigned int i,j;
        taille=Cpn(p,n);
        Tab1= (unsigned int *) malloc (taille*sizeof(unsigned int));
        for (i=0,j=taille-1;i<power2(n);i++)
            if (nbcb(i)==p)
                Tab1[j--]=i;
        Reste= (unsigned int *) malloc (taille*sizeof(unsigned int));
        for (i=0,j=0;i<power2(n);i++)
            if (nbcb(i)==p)
                Reste[j++]=i;
        Valid= (unsigned int *) malloc (taille*sizeof(unsigned int));
        for (i=0,j=0;i<power2(n);i++)
            if (nbcb(i)==p)
                Valid[j++]=0;
    }
     
    // ajouter un élément à Valid
    void append(unsigned int n)
    {
        unsigned int i=0;
        while (Valid[i])i++;
        Valid[i]=n;
    }
     
    // enlever un élément à un tableau (Tab1 ou Reste)
    void enleve(unsigned int n, unsigned int * T)
    {
        unsigned int i;
        for (i=0;i<taille;i++)
            if (n==T[i])
            {
                T[i]=0;
                break;
            }
    }
     
    unsigned int firstoftab1()
    {
        unsigned int i;
        for (i=0; i<taille;i++)
            if (Tab1[i]) return Tab1[i];
        return 0;
    }
     
     
    unsigned int TrouveSuivant(unsigned int p)
    {
        unsigned int i,s,t,S;
        s=PeutSupprimer(firstoftab1(),p);
        S=firstoftab1();
        for (i=0;i<taille;i++)
        {
            if (Tab1[i])
            {
                t=PeutSupprimer(Tab1[i],p);
                if (t>s)
                {
                    s=t;
                    S=Tab1[i];
                }
            }
        }
        return S;
    }
    unsigned int longueur (unsigned int * T)
    {
        unsigned int i,s=0;
        for (i=0;i<taille;i++)
            if (T[i])s++;
        return s;
    }
     
     
    // traitement pour trouver Valid
     
    void voir()
    {
        printf("%d\n",longueur(Tab1));
        printf("%d\n",longueur(Reste));
        printf("%d\n",longueur(Valid));
        printf("----------------\n");
    }
     
    // algo proprement dit
    void traite(unsigned int p)
    {
        unsigned X ;
        eliminer (Tab1[0],p);
        append(Tab1[0]);
        enleve(Tab1[0],Tab1);
        voir();
        while (longueur(Reste))
        {
            X=TrouveSuivant(p);
            eliminer(X,p);
            append(X);
            enleve(X,Tab1);
            voir();
        }
    }
     
    //fonction principale
    int main()
    {
        init(6,10);
        voir();
        traite(5);
        return 0;
    }
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  7. #27
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 98
    Points : 10
    Points
    10
    Par défaut
    Bonjour Zavonen , pseudocode et a tous .

    Oui j'ai installé Python mais comme EDI j'ai pris un truc qui se nomme Pyscripter c'est plus clair pour moi et je suis en train d'essayer de comprendre ton programme ( humm pas facile car ce genre de ligne en C je ne connais pas )
    return [i for i in range(0,n) if hpcb(i,p)] :-)

    GRAND merci a toi pour le C Zavonen tu est super :-)

    Pseudocode tu est sur que c'est le meme algo car ce que nous avons mis au point avec Zavonen fonctionne quelque soit le chiffre et est de plus tres rapide bon de toute façon ce qui est certain c'est qu'il n'est pas optimal il manque quelque chose mais je reste persuadé intuitivement ( si si ne rigolez pas ;-) ) que c'est une astuce toute bete mais on trouveras .

    Ce qui est sur c'est que ce genre de probleme est tres tres interessant et c'est bon pour le cerveau :-)
    Bon je vais vite essayer le programme C de Zavonen :-)

    Desolé Zavonen mais cette phrase
    La correspondance est la suivante:
    exemple 63, s'écrit en binaire 111111 =0000111111=[5,6,7,8,9,10]
    1008=1111110000=[1,2,3,4,5,6]
    je ne comprends pas rien a faire je vois pas le rapport entre 63 et 5 6 7 8 9 10 etc...
    Je vais lancer ton prog et reflechir :-)
    Zavonen pourrais tu mettre les bonnes combinaisons dans un tableau et les afficher a la fin du traitement ?
    Ton programme en C je comprends mieux que le Python mais il est pas facile pour moi , ton niveau n'est pas le mien mais tant mieux c'est comme ça que je progresserais :-)

    a ton avis serais t'il possible de rendre le traitement plus rapide ( ensuite on s'occuperas d'essayer de trouver le mini) par exemple :
    si je prends la combinaison suivante :
    1 2 3 4 5 6 et que je la teste avec les combi de reste quand j'arrive au 3 ieme chiffre de la combi de reste et que j'ai zero ou 1 chiffre en commun il n'est pas necesssaire de continuer enfin je sais pas si tu voit ce que je veut dire :-)

  8. #28
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Citation Envoyé par Zhao
    je ne comprends pas rien a faire je vois pas le rapport entre 63 et 5 6 7 8 9 10 etc...
    Je vais lancer ton prog et reflechir :-)
    Si je donne une suite de 10 éléments 0 ou 1 (en anglais bit=binary digit) où 6 éléments sont des 1 et 4 des zéros
    comme 1010101001 Je peux lui associer la suite [1,3,5,7,10], c'est la position des 1 qui me donne les numéros.
    Cela c'est simple, tu comprends.
    Maintenant tous les entiers peuvent s'écrire comme suite de 0 et de 1, c'est la numération de base 2:
    0=0
    1=1
    2=10
    3=11
    4=100
    5=101
    6=110
    7=111
    8=1000
    le premier nombre qui comporte 6 fois le chiffre 1 en binaire est 63=111111
    Google est ton ami (voir:"système binaire" ou "bases de numération").
    De sorte que pour générer les suites de 6 éléments entre 1 et 10, tu généres tous les nombres en binaire entre 0 et 1024 et tu ne gardes que ceux qui ont 6 fois exactement le chiffre1. Avec la convention de compléter par des 0 devant si on n'a pas 10 chiffres.
    J'avance assez vite maintenant.
    L'idée est de tester non pas seulement un élément mais des suites de 2, 3 4 ou plus du point de vue du nettoyage de Reste. c'est là qu'on a besoin de toute la puissance de C en ne traitant que des entiers, Python rame trop avec ses listes.
    Je ne suis pas arrivé à Card(Valid)=14 mais j'ai trouvé des ensembles à 14 éléments qui réduisent Reste à 1 seul élément au lieu de 2 par l'algo glouton, encore un effort. J'arrive à gagner beaucoup au début mais de moins en moins vers la fin. Par ailleurs plus Reste est petit et plus on peut tester des listes longues.
    Malheureusement demain je suis pris toute la journée, je reprendrai cela demain soir ou mercredi.
    Pyscripter est un bon produit mais attention sauve tes sources avant de lancer l' exécution en interne, sans ça il te plante et tu perds ton programme, c'est vraiment un gros bug de cet EDI.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  9. #29
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 98
    Points : 10
    Points
    10
    Par défaut
    Ok j'ai compris pour le binaire , je comprends vite mais faut m'expliquer longtemps :-)
    J'ai hate d'etre demain soir :-)
    de mon coté je vais bien sur reflechir aussi :-)

    vu les heures ou tu est present quelque chose me dit que tu n'est pas en france actuellement :-)

    Je suis desolé Zavonen mais je ne trouve pas l'endroit ou tu stock les bonnes combinaisons dans ton programme C , par contre le fait de ne pas declarer de tableau fixe mais en fonction de Cnp c'est genial ( j'ai vraiment beaucoup a apprendre ;-) )

  10. #30
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par zhao Voir le message
    Pseudocode tu est sur que c'est le meme algo car ce que nous avons mis au point avec Zavonen fonctionne quelque soit le chiffre et est de plus tres rapide
    Oui, c'est pratiquement le même algo a quelques différences près:

    1. J'ai une seule table au lieu des 2 tables Tab1[] et Reste[]

    2. Dans ma version de "TrouveSuivant()", je conserve toutes les grilles qui suppriment le plus de tirages, et pas seulement la premiere trouvée comme dans votre algo => je dois choisir une grille parmis tous les candidats => monté carlo.

    3. Les tirages de départ (Tab1) ne sont pas dans le meme ordre. Et ca, ca change beaucoup les résultats.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  11. #31
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 98
    Points : 10
    Points
    10
    Par défaut
    Bonjour Pseudocode :-)

    ok pour l'algo , oui l'ordre est tres important comme je l'ai dit a Zanoven malheureusement j'ai pas vos connaissances pour l'expliquer ce que je peut dire c'est ceci :

    au debut comme vous le savez il y a plus de combinaisons qui commence par que par 2 ,3 ...etc supposons que la premiere combinaison que l'on garde dans Valid commence par un 2 cela signifie que dans Reste il y auras encore plus de combinaisons qui commence par 1 que par 2 meme si la deuxieme combi que nous gardons dans Valid commence par un 1 statistiquement ( je sais pas si c'est le terme approprié) il sera maintenant plus dur de supprimer toute les combinaisons dans Reste en 1 minimum de combinaisons car la premiere qui commence par 2 a deja peut etre supprimer une combi potentiel plus forte que celle qu'ils restent mais de toute façon il reste trop de combi commencant par 1 pour etre supprimer en un minimum valable mais ceci est aussi valable pour 2 ou 3 etc... et c'est valable aussi pour la suite enfin bon je sais pas si vous comprenez ce que je veux dire :-)

  12. #32
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Rien de bien nouveau hélas. je veux dire rien de mieux que les 15.
    J'aurais aimé trouvé 14 ou moins par programme, mais c'est l'échec.
    J'ai étendu ta méthode en cherchant la meilleure suite de combinaisons éliminant le plus de possibilités dans Reste. Il s'agit donc encore d'algo 'glouton' mais on raisonne sur un ensemble fini de possibilités au lieu d'une seule.
    En pratique on ne peut dépasser la profondeur 4, après les temps de calcul deviennent trop longs.
    J'ai donc essayé toutes les possibilités de faire 14 avec 1,2,3 et 4
    Comme 4 4 4 3 et puis 3 3 4 4 ou 3 4 34 etc...
    Rien à faire, à la fin il reste toujours 1 ou 2 éléments dans Reste (et ce ne sont jamais les mêmes).
    Je vais maintenant explorer une autre voie, déterminer à chaque fois dans Reste quels sont les chiffres les plus fréquents, et à possibilité de suppression égale, choisir la combinaison dont les chiffres sont les plus fréquents dans Reste.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  13. #33
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 98
    Points : 10
    Points
    10
    Par défaut
    Bonjour Zavonen :-)

    Oui mais si cela était simple quel serais l'intérêt ,le plaisir ? :-)
    Je voulais te demander dans ton programe C je ne trouve pas l'endroit ou tu stock les 15 combinaisons .

    Te serais t'il possible de faire si cela n'est pas trop embetant une version sans ton astuce binaire car je ne maitrise pas ce genre de systeme et je voudrais de mon coté travailler sur le RANG des chiffres .

    donc il faudrais dans ses 2 programmes stocker les bonnes combinaisons .

    on peut deja optimiser le programme pour le temps de traitement en jouant sur le rang des combinaison .
    si je prends 1 2 3 4 5 6 dans TAB1 et que je la teste avec 3 4 5 6 7 8 de TAB1(ou RESTE) je constate que une fois le chiffre 2 tester j'ai AUCUN chiffres en commun et donc il me seras impossible d'avoir 5 donc tester 3 4 5 6 avec le reste des chiffres ne sert a rien je pense que cela peut ameliorer sensiblement la vitesse de traitement et plus le chiffre est grand plus cela sera interessant car pour notre exemple on travaille pour 10 mais sur 15 , 20 :-)

    de toute façon la solution se trouve peut etre dans le decalage des chiffres .
    si on prends les 14 Combi :

    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
     
    1  2  3  4  5  6 
     1  2  3  7  8  9 
     1  2  4  6  9 10 
     1  2  6  7  8 10 
     1  3  4  5  7 10 
     1  3  4  8  9 10 
     1  5  6  7  8  9 
     1  5  6  8  9 10 
     2  3  5  6  8 10 
     2  3  5  7  9 10 
     2  4  5  7  8  9 
     2  4  5  7  8 10 
     3  4  6  7  8  9 
     3  4  6  7  9 10
    entre la premiere et la deuxieme on fait tourner ( je dit tourner car cela me fait penser a une roue) de 3 crans ensuite je sais pas :-) enfin c'est des pistes peut etre que je dit n'importe quoi :-)

    au debut je voulais les trouver manuellement j'avais creer un programme qui me tester les combinaisons dans un fichier si par exemple je mettais les 15 ou 14 combinaisons dans ce fichier et que je lancais mon programme j'aurais comme resultat X combi gagnante a 6 et Y combi gagnante a 5 et bien sur aucune a 4 ,3 car cela aurais signifier que je ne couvrais mas les 5 :
    et donc je prenais une combi parexemple la premiere 1 2 3 4 5 6 je lancais mon prog et je regarder combien j'avais de combi a 3 4 5 6 et mon but c'etait de descendre les chiffres 3,4 pour arriver a un total de 210 uniquement avec des combi a 6 et 5 et je continuais etc... mais les chemins possible sont enorme et j'ai abandonné mais peut etre que cela peut etre une solution avec un algo de parcour de chemin :
    pour info voici mon "programme" humm je vais faire hurler les puristes quand il vont voire ce programme :-)

    Code C : 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
     
    #include<fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <dos.h>
    #include <time.h>
     
     
    main()
    {
    FILE *fichier ;
    int w=0,z=0,f=0,y=0,u=0,max=0,v=0,numscommuns,cptc=0;
    float cpt0=0,cpt1=0,cpt2=0,cpt3=0,cpt4=0,cpt5=0,cpt6=0;
    int i=0,j=0,k=0,l=0,m=0,n=0,zz=0,a=0,nt=0,xx=0,c=0;
    int x[250][6];
    int tab[6];
    int tc[6];
    int line;
    float temp_reel=0,temp_ecoule=0;
    time_t deb_total,fin_total,deb_reel,fin_reel;
    bool stop;
     
    //PARCOUR FICHIER ET CHARGEMENT TABLEAU ***************************************
    if (fichier =fopen ("Combinaisons.txt", "r")) { //Si ouverture réussie : 
      while (!feof(fichier)) {
        for (u=0 ; u<6 ; u++) {
          if (fscanf (fichier, "%d", &y)==1)  { x[w][u] = y; }
          }//End for u...
          w++;//Compteur de combinaisons contenues dans le fichier
      }//End while...
     fclose (fichier); //  fermeture du fichier
     if (w>0) { printf("Le fichier contient %d ligne(s)\n", w); }//Vérif lignes lues
    }//End if...
    else { //Si échec d'ouverture : if fopen retourne false et alors on arrive ici
     printf("Echec a l'ouverture du fichier.\n");
     printf("Appuyez sur n'importe quelle touche pour quitter.");
     getchar();
     exit(0); }
    // FIN PARCOUR FICHIER ET CHARGEMENT TABLEAU **********************************
     
     printf("Entrez votre nombre de numeros : ");
    scanf("%d",&nt);
    //nt=10;
     printf("\n");
     deb_reel=time(NULL);
     a=nt-5;
     
     for(i=1;i<=a;i++)
      for(j=i+1;j<=a+1;j++)
       for(k=j+1;k<=a+2;k++)
        for(l=k+1;l<=a+3;l++)
         for(m=l+1;m<=a+4;m++)
          for(n=m+1;n<=a+5;n++)
     
    {
           tc[0]=i;tc[1]=j;tc[2]=k;tc[3]=l;tc[4]=m;tc[5]=n;
           cptc++;
     
         for (z=0, max=0; z<w ;z++) {        
     
           for (u=0, numscommuns=0; u<6 ; u++) //Comparaison
             for(xx=0; xx<6; xx++) 
               if(x[z][u]==tc[xx]) { numscommuns++; }
     
           if (numscommuns > max) { max = numscommuns; } //Stocker le max trouvé
          }//End z...
     
             if(max==6) { cpt6++; }
             if(max==5) { cpt5++; }
             if(max==4) { cpt4++; }
             if(max==3) { cpt3++; }                        
             if(max==2) { cpt2++; }
             if(max==1) { cpt1++; }
             if(max==0) { cpt0++; }
            // printf("progression : %d\r",cptc);//Vérifie la progression en test 
            // getchar();                       
    }//End boucle imbriquée i..n
     
    fin_reel=time(NULL);
    temp_reel=difftime(fin_reel,deb_reel);
    printf("\r");//Effacer la ligne "progression"
    printf(" 6 numeros  = %g  fois\n",cpt6);
    printf(" 5 numeros  = %g  fois\n",cpt5);
    printf(" 4 numeros  = %g  fois\n",cpt4);
    printf(" 3 numeros  = %g  fois\n",cpt3);
    printf(" 2 numeros  = %g  fois\n",cpt2);
    printf(" 1 numeros  = %g  fois\n",cpt1);
    printf(" 0 numeros  = %g  fois\n",cpt0);
    printf("   TOTAL    = %g\n",cpt6+cpt5+cpt4+cpt3+cpt2+cpt1+cpt0);
    printf("\n");
    printf("duree reelle de calcul :  %g seconde(s)\n",temp_reel);
    scanf(" %d ",nt);
    getchar();
    }

    petite precision Zavonen :-)
    je sais parfaitement ou se trouve l'incrementation de VALID :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void append(unsigned int n)
        {
            unsigned int i=0;
            while (Valid[i])i++;
     
            Valid[i]=n;
     
     
        }

    mais rien a faire je vois pas comment recuperer les bonnes combinaisons pour moi cette fonction incremente le nombre de bonnes combi mais sans leur contenu car pour moi il faut un tableau a 2 dimensions enfin on est pas vraiment obliger d'avoir un tableau a 2 dim mais cela me parais plus simple bref j'ai beau cherché je trouve pas comment tu fais :-)

    petite question technique au niveau temps de traitement le fait d'avoir beaucoup de fonction est t'il un avantage ou pas si on compare avec un programme plus sequentiel ?

    reduction possible par groupement ( je sais pas si c'est le terme approprié)je ne sais pas ce que ça vaut qu'en pensez vous :

    supposons que je veux etre sur d'avoir 3 bon numeros si les 6 sont parmi ma selection de 9 :

    si je prends ses combinaisons :

    A: 01-02-03-04-05-06
    B: 04-05-06-07-08-09
    j'ai 2 combinaisons mais je peut la reduire a une tout en conservant mon objectif je vais donc la fusionner et cela me donneras ceci :

    C: 01-02-03-07-08-09 si je me trompe pas cela doit marché enfin comme d'habitude ce sont des idées comme ça :-)

  14. #34
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Voici une version plus conviviale, entièrement commentée et affichant les résultats 'en clair'.
    Code C : 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
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    // Pour Zhao par Zavo
    // Programme commenté avec visualisation des solutions sous forme de listes
    // temps d'exécution: 15 millisecondes
    #include <stdio.h>
    #include <stdlib.h>
     
    unsigned int * Tab1, *Reste,*Valid; // Les trois tableaux du traitement (algo Zhao)
    unsigned int taille; // contiendra la taille de Tab1, Reste et Valid
    unsigned char * numeros; // Contiendra tous les numéros possibles (1,2,3,...10,..)
     
    //calcule les puissances de 2
    unsigned int power2(unsigned int n)
    {
        unsigned int result=1;
        int i;
        for (i=1;i<=n;i++)
            result *=2; // multiplier résultat par 2
        return result;
    }
     
    // calcule le nombre de chiffres de n en binaire
    // une expérience récente sur le forum DVP a prouvé que les décalages ne sont pas plus rapides.
    unsigned int nbcb(unsigned int n)
    {
        unsigned int s=0; // totalisateur
        while (n) // tantq ue n est non nul
        {
            s+=n%2; // ajoute le chiffre des unités
            n/=2; // divise n par 2
        }
        return s;
    }
     
    // nombre de chiffres comuns à m et n
    unsigned int communs(unsigned int m, unsigned int n)
    {
        return nbcb(m&n); // très rapide car & est un opérateur câblé (le bitwise-AND)
    }
     
     
    // Calcule combien peut supprimer n dans Reste
    // sur la base de p éléments communs
    unsigned int PeutSupprimer (unsigned int n, unsigned int p )
    {
        unsigned int s=0; // total mis à zéro au départ
        unsigned int i;
        for (i=0;i<taille;i++)
        {
            if (!Reste[i])// si l'élement est déjà supprimé passer immédiatement au suivant
                continue;
            if (communs(n,Reste[i])>=p) // on en a trouvé un
                s++; // on incrémente le total
        }
        return s;
    }
     
    // Elimine de Reste tous les éléments ayant p au moins éléments communs avec n
    void eliminer(unsigned int n, unsigned int p)
    {
        unsigned int i;
        for (i=0; i<taille;i++)
            if (communs(n,Reste[i])>=p)// plus de p éléments communs ?
                Reste[i]=0; // si oui on enlève
    }
     
     
    // Calcule les coefficients Cp,n
    unsigned int Cpn(unsigned int p, unsigned int n)
    {
        unsigned int s=0; // totalisateur
        unsigned int i;
        for (i=0;i<power2(n);i++)
            if (nbcb(i)==p) s++;// Si p chiffres en base 2 on incrémente le compteur
        return s;
    }
     
    // initialise Tab1 , Reste et Valid
    void init(unsigned int p,unsigned int n)
    {
        unsigned int i,j;
        taille=Cpn(p,n); // nombre de combinaisons de p dans n
        // on remplit Tab1 à l'envers
        Tab1= (unsigned int *) malloc (taille*sizeof(unsigned int));
        for (i=0,j=taille-1;i<power2(n);i++)
            if (nbcb(i)==p)
                Tab1[j--]=i;
        // On remplit Reste à l'endroit
        Reste= (unsigned int *) malloc (taille*sizeof(unsigned int));
        for (i=0,j=0;i<power2(n);i++)
            if (nbcb(i)==p)
                Reste[j++]=i;
        // Valid est initalisé rien qu'avec des zéros ce qui veut dire 'vide'
        Valid= (unsigned int *) malloc (taille*sizeof(unsigned int));
        for (i=0,j=0;i<power2(n);i++)
            if (nbcb(i)==p)
                Valid[j++]=0;
        // C'est la liste des numéros possibles pour restituer les listes à partir des binaires
        numeros=(unsigned char *) malloc (n);
        for (i=0;i<n;i++)
            numeros[i]=(unsigned char)(i+1);
     
    }
     
    // ajouter un élément à Valid
    // on le met au premier emplacement contenant une donnée nulle
    void append(unsigned int n)
    {
        unsigned int i=0;
        while (Valid[i])i++; // avancer jusqu'à trouver un zéro
        Valid[i]=n;
    }
     
    // enlever un élément à un tableau (Tab1 ou Reste)
    // On met 0 à sa place
    void enleve(unsigned int n, unsigned int * T)
    {
        unsigned int i;
        for (i=0;i<taille;i++)
            if (n==T[i])
            {
                T[i]=0;
                break;
            }
    }
     
    // retourne le premier élément de Tab1 (non nul)
    unsigned int firstoftab1()
    {
        unsigned int i;
        for (i=0; i<taille;i++) // on parcourt Tab1
            if (Tab1[i]) return Tab1[i]; // On s'arrête sur le premier non nul et on le renvoit.
        return 0;
    }
     
    // Trouve la combinaison suivante par algorithme Zhao
    unsigned int TrouveSuivant(unsigned int p)
    {
        unsigned int i,s,t,S;
        // a priori la prochaine combinaison est la première qui se présente
        s=PeutSupprimer(firstoftab1(),p);
        S=firstoftab1();
        for (i=0;i<taille;i++) // un parcourt Tab1
        {
            if (Tab1[i]) // seulement si l'élément n'a pas été supprimé
            {
                t=PeutSupprimer(Tab1[i],p); // on calcule combien il peut en supprimer
                if (t>s) // plus que s ?
                {
                    // si oui alors mise à jour de s et S
                    s=t;
                    S=Tab1[i];
                }
            }
        }
        return S; // retourner le meilleur candidat, celui qui en supprime le plus
    }
     
    // Calcule la longueur d'un tableau (le nombre d'éléments non nuls)
    unsigned int longueur (unsigned int * T)
    {
        unsigned int i,s=0;
        for (i=0;i<taille;i++)
            if (T[i])s++;
        return s;
    }
     
     
    // Voir la progression du traitement
    void voir()
    {
        printf("%4d",longueur(Valid)); // pour voir combien d'éléments dans Valid
        printf(" - ");
        printf("%4d\n",longueur(Reste)); // pour voir combien d'éléments dans Reste
    }
     
     
    // algo proprement dit pour trouver Valid
    void traite(unsigned int p)
    {
        unsigned X ;
        printf("Progression:\n");
        eliminer (Tab1[0],p); // on commence avec la première combinaison
        append(Tab1[0]); // on la met dans Valid
        enleve(Tab1[0],Tab1); // On nettoie Reste
        voir(); // pour voir l'avancement
     
        while (longueur(Reste)) // tant que Reste n'est pas vide
        {
            X=TrouveSuivant(p); // Trouver le suivant d'après le critère de Zhao
            eliminer(X,p); // nettoyer Reste
            append(X); // ajouter la nouvelle combinaison à Valid
            enleve(X,Tab1); // retirer de Tab1 cette nouvelle combinaison
            voir(); // Pour voir l'avancement
        }
    }
     
    // reconstitue une liste de numéros à partir d'un nombre binaire
    char * restitue (unsigned int n,unsigned int p, unsigned int k)
    {
        char * r=(char *) malloc(p); // pour p nombres tous <256
        unsigned int i,u,v;
        i=0;
        v=p-1;
        while (k) // tant que k n'est pas nul
        {
            u=k%2; // prendre le chiffre des unités de k
            if (u) // est il égal à 1 ?
                r[v--]=numeros[n-1-i]; // Si oui placer le numéro correspondant
            k=k/2; // diviser k par 2
            i++; // incrémenter i
        }
        return r;
    }
     
    // Liste tous les binaires de Valid sous forme de listes
    void MontreValid(n,p)
    {
        unsigned int t= longueur(Valid);
        unsigned int i,j; // compteurs de boucles
        char * pc; // pour récupérer les listes
        printf("Solution:\n");
        for (i=0;i<t;i++) // affichage des éléments de Valid
        {
            pc=restitue(n,p,Valid[i]); // allocation de mémoire et affectation
            for (j=0;j<p;j++) // affiche la liste reconstituée
                printf("%2d ",pc[j]);
            printf("\n");
            free(pc); // libération de la mémoire allouée
        }
    }
     
    //fonction principale
    int main()
    {
        init(6,10); // initialisation
        traite(5); // traitement
        MontreValid(10,6); // Voir le résultat
        return 0;
    }
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  15. #35
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Wikipedia
    (Set cover problem) The decision version of set covering is NP complete, and the optimization version of set cover is NP hard.
    C'est un problème qui vaut 1 million de $.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  16. #36
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Citation Envoyé par Zhao
    petite question technique au niveau temps de traitement le fait d'avoir beaucoup de fonction est t'il un avantage ou pas si on compare avec un programme plus sequentiel ?
    Avoir beaucoup de fonctions n'augmente pas l'efficacité mais augmente la LISIBILITE du programme et permet sa compréhension et sa maintenance. Les grosses fonctions fourre-tout, sont très difficilement compréhensibles c'est pourquoi on a inventé la programmation structurée en 'modules' 'fonctions' 'procédures ' comme tu voudras, blocs de codes spécialisés et réutilisables.
    Par ailleurs les compilateurs modernes sont capables de compiler des fonctions 'in-line' c'est à dire de supprimer un appel de fonction et de remplacer cet appel par une substitution de code, donc ce style de programmation ne nuit pas.
    Ne t'inquiètes pas trop du point de vue des 'puristes', ce sont en général des gens qui s'intéressent plus au langage lui-même qu'à ce qu'on peut dire avec.
    Cela dit ton programme est vraiment un programme de débutant, c'est clair, mais qu'en j'avais des débutants capables d'écrire ça très rapidement, j'étais très satisfait et après quelques mois ils étaient experts.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  17. #37
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 98
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup Zavonen , je vais etudier ça de plus pres :-)
    que pense tu de mes quelques idée concernant la solution ,fusion,elimination,chemin etc... pas realisable je suppose :-)

    OUI Pseudocode mais est ce que ce genre de probleme est considerer comme NP complet ?

    Bon de toute façon les 14 existe ça c'est un FAIT donc ce que quelqu'un peut faire d'autre le peuve car certains on trouvé le moyen de trouver le mini ( ou s'en rapproché) donc il n'y as pas de raison que nou sni arrivons pas nous aussi :-)

    ET on va TROUVER :-)
    bon je vais etudier le code de Zavonen :-)

  18. #38
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Citation Envoyé par pseudocode
    C'est un problème qui vaut 1 million de $.
    C'est toi qui a fait la mise à prix ?
    Plus sérieusement je ne doute pas qu'on ai affaire à un gros morceau, et en général les 'grosses pointures' ne laissent pas trainer grand chose. Mais pour s'enrichir vaut-il mieux:
    Résoudre le problème ou jouer au Loto ?
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  19. #39
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Citation Envoyé par Zhao
    Merci beaucoup Zavonen , je vais etudier ça de plus pres :-)
    que pense tu de mes quelques idée concernant la solution ,fusion,elimination,chemin etc... pas realisable je suppose :-)
    Je pense que la ou les personnes qui ont qualifié le Pb NP y ont certainement pensé avant nous. Mais bon... il ne faut pas avoir de complexes.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  20. #40
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par zhao Voir le message
    Bon de toute façon les 14 existe ça c'est un FAIT donc ce que quelqu'un peut faire d'autre le peuve car certains on trouvé le moyen de trouver le mini ( ou s'en rapproché) donc il n'y as pas de raison que nou sni arrivons pas nous aussi :-)
    Pour trouver le minimum global, il faut explorer TOUTES les solutions. Pour 10/6-5 c'est faisable. Long mais faisable. Et effectivement le minimum est 14.

    Pour des tirages plus grands, c'est beaucoup trop long: tout ce qu'on connait, ce sont des minimum locaux. Aucune preuve qu'on ne puisse pas faire mieux.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

Discussions similaires

  1. Systèmes réducteurs (par exemple de loto) : un point reste obscur
    Par tails dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 31/07/2013, 19h27
  2. Les meilleurs cours et tutoriels Systèmes ( 10 nouvelles publications )
    Par Lana.Bauer dans le forum Autres systèmes
    Réponses: 0
    Dernier message: 05/02/2013, 11h43
  3. système réducteur à garantie
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 30/10/2008, 21h08

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