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

VB.NET Discussion :

Un problème de combinatoire


Sujet :

VB.NET

  1. #1
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut Un problème de combinatoire
    Bonjour,

    Pour un projet de R.O. (Recherche opérationnelle) Statistique, je dois faire plusieurs choses:

    1. Tout d'abord, lister l'ensemble A toutes les combinaisons de k éléments dans un ensemble de n éléments (k<=n)
    2. Ensuite, pour chaque combinaisons Ai lister l'ensemble Bi toutes les permutations de j valeurs possibles.
    3. Enfin pour chaque Bil vérifier si elles correspond aux contraintes (à définir en fonction de la recherche).

    D'un point de vue mathématiques, l'ensemble A contient n! / ( k! ( n - k ) ! ) et chaque ensemble Bi contient j! éléments; soit un total de j! ( n! / ( k! ( n - k ) ! )).

    Exemple:
    Un bus de 80 places possède 15 passagers et chaque passager à une particularité spécifique parmi 10 catégories, recenser l'ensemble des possibilités de placement de ces passagers dans le bus.
    Le nombre de combinaisons total est donc de 10! ( 80! / ( 15! (80 - 15) ! )) = 5 472 782 816 133 670 000 000

    Je voudrais votre avis sur comment procéder, dois-je commencer par calculer l'ensemble A dans son intégralité ou faire en sorte qu'au fur et à mesure que celui-ci se remplit créer les ensembles Bi auxquels j'ai "accès"; ou aborder une toute autre approche..?

    De plus j'aimerais un coup de main sur quelques points où je ne vois pas comment procéder:

    * Gérer la sauvegarde du processus, de sorte à pouvoir le reprendre ultérieurement au stade où il s'était arrêté (comme pour le moment je gère tout cela à l'aide de récursive je n'arrive pas à correctement sauver mon état)
    * Permettre l'affichage de la progression à l'aide d'un ProgressBar, le problème étant les grands nombres à gérer et quel format utiliser pour les stocker sachant que cela doit ralentir le moins possible le reste (donc les Decimal à éviter par exemple)
    * Toute piste utile à l'optimisation du tout aussi bien en terme de vitesse d'exécution, qu'en terme de mémoire (du processus en lui même d'une part et du format de stockage des résultats valides d'autre part, sachant que toute base de données est exclue (au moins pour le moment))


    Merci d'avance à tous, pour l'attention portée à ce message ainsi qu'à toute aide apportée !
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Points : 330
    Points
    330
    Par défaut
    Bonjour,
    Toutes mes condoléances, j'ai pas un souvenir impérissable de mes cours de R.O.

    Pour ton deuxième point, je te conseille de passer par la backgroundworker qui gère un thread séparé (tu trouveras sans pb des tutos à ce sujet).
    Avantages : ton appli n'est pas bloquée et cette classe gère l'avancement de l'algo.

    Tu peux ajouter à la form affichant le progressbar un bouton pause/resume qui va (par exemple) enregistrer dans un fichier les valeurs en cours des paramètres de ta fonction récursive.
    Une fonction de chargement des valeurs sauvegardées qui appelle ton traitement en alimentant les paramètres avec ces valeurs et ça devrait faire l'affaire !

  3. #3
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Pour les backgroundworkers je m'en sert déjà de deux (un pour les combinaisons) et un pour les permutations de chacune en fonction des valeurs admissibles.

    En ce qui concerne ta méthode de sauvegarde elle ne conviendra pas, car je dois non seulement enregistrer l'état des valeurs mais aussi les niveaux d'empilage de la fonction récursive c'est surtout ce point qui me pose problème.
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Points : 330
    Points
    330
    Par défaut
    Tu peux très bien ajouter en paramètre ce niveau d'empilage (qui est mis à jour dans la fonction récursive) !

    En tout cas, si tu dois parcourir la totalité des combinaisons possible, je ne suis pas sur que tu n'atteignes pas des limites en terme de mémoire et de temps de traitement. N'y a t'il pas des règles d'éliminations (des non sens) qui réduiraient la combinatoire ?

  5. #5
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Enregistrer la profondeur de la récursive ne suffira malheureusement pas, quant à réduire les possibilités cela ne pourra se faire de toute façon qu'après le listage des possibilités, car le seul moment où l'on peut restreindre le choix, c'est lors des choix des permutations, mais les combinaisons elles doivent etre recensée de façon exhaustive
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

Discussions similaires

  1. problème de combinatoire
    Par gpcbitnik38 dans le forum Probabilités
    Réponses: 1
    Dernier message: 29/04/2014, 17h25
  2. Problème Algorithme combinatoire
    Par Neiflheim dans le forum Mathématiques
    Réponses: 4
    Dernier message: 09/02/2012, 15h26
  3. Problème de calcul combinatoire
    Par Onimaru dans le forum Mathématiques
    Réponses: 8
    Dernier message: 09/11/2011, 20h17
  4. Réponses: 1
    Dernier message: 24/10/2011, 10h49
  5. Problème d'optimisation combinatoire. Enfin je crois
    Par Arpivu dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 30/07/2007, 11h01

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