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 :

Meilleure combinaison possible


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    Par défaut Meilleure combinaison possible
    Bonjour,

    le tableau suivant est trié par date d'expiration dans l'ordre croissant
    je voudrais trouver la combinaison de number dont la somme des quantités correspondantes serait égale à la quantité que je dois trouver en priorisant les dates d'expiration les plus proche

    exemple :
    je veux une quantité de 3700, l'algo doit me trouver 1 / 2 / 5
    je veux une quantité de 2500, l'algo doit me trouver 1 / 3

    Nom : Capture.JPG
Affichages : 294
Taille : 18,4 Ko

    je sais qu'il y a 6 * 5 * 4 * 3 * 2 possibilités.
    Est ce quelqu'un aurait une idée de à quoi pourrait ressembler l'algorithme?

    Merci.

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 754
    Par défaut


    Ca ressemble vachement au subset-sum problem : trouver un sous-ensemble d'items dont la somme vaut une constante. Il existe une myriade d'algorithmes pour ça (https://fr.wikipedia.org/wiki/Probl%...sous-ensembles).

    Les algos classiques vont ignorer ton objectif de date d'expiration. Je formaliserais ça comme un problème de sac à dos (https://fr.wikipedia.org/wiki/Probl%...sac_%C3%A0_dos) : les capacités sont les quantités, la capacité du sac la quantité que tu veux trouver, les valeurs dépendraient de la date d'expiration (très grande valeur pour une date prochaine, petite sinon, à toi de voir quelle fonction correspond le mieux à ton besoin). Pour l'algorithme, tente la programmation dynamique, algorithme le plus classique pour ce problème (si ça ne marche pas assez vite, on peut toujours trouver autre chose) --- par exemple, https://github.com/google/or-tools/b...psack_solver.h est une interface pour une série d'algorithmes qui fonctionnent chacun très bien dans une catégorie d'instances.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 342
    Par défaut
    Pour moi, de ce que je comprends, il suffit de trouver la PREMIERE bonne somme de quantité en parcourant la colonne quantity dans l'ordre donné par le tri selon la date d'expiration.

  4. #4
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 599
    Par défaut
    Bonjour,

    Je crois que je ferais d'abord un tri (un tri d'index si on ne veut pas modifier la table d'origine) par ordre de quantité décroissante.

    Pour aussi peu d'éléments cela n'a pas beaucoup d'intérêt mais cela pourrait le devenir si le nombre N est important

    Si on est sur un indice[n] et que la somme en cours, somme[n] + val[m > indice[n]], est supérieure à la cible on augmente j = indice[n] jusqu'à ce que val[j] <> val[indice[n]] alors indice[n] = j et on reprend l'étape suivante à m=indice[n]+1. On peut avoir besoin de 2 tableaux (indices et sommes) de N positions.

    Sauf erreur, on devrait avoir au maximum 2N-1 cas différents (un peu moins avec les valeurs répétées).

    Salutations

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 342
    Par défaut
    Si on tri par date, on a pas besoin de se faire tous les cas, on prend le premier qui correspond

    Ou mieux par date puis quantity

  6. #6
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 204
    Par défaut
    Si les données sont :
    A 2000 1er Janvier
    B 1000 2 Janvier
    C 1500 3 Janvier
    D 500 9 Janvier
    et si la somme à trouver est 2500, on veut avoir A+D ou B+C ?

    Et sur les exemples suivants, on veut quoi (toujours pour un total de 2500) ?
    A 500 1er Janvier
    B 1000 2 Janvier
    C 1500 3 Janvier
    D 2000 9 Janvier

    A 500 1er Janvier
    B 1000 2 Janvier
    C 800 3 Janvier
    D 1500 4 Janvier
    E 1200 5 Janvier

  7. #7
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 599
    Par défaut
    Bonjour disedorgue,

    Citation Envoyé par disedorgue Voir le message
    Si on tri par date, on a pas besoin de se faire tous les cas, on prend le premier qui correspond...
    Dans tous les cas on s'arrête à la première solution. Si les données sont triées par quantité on évite de tester trop de cas si il y a des répétitions de valeurs (voir l'esquisse d'algo que j'ai proposé).

    Comme le suggère tbc92 la priorisation des dates ne jouera que pour la première date de la solution qui sera la plus ancienne, mais l'âge moyen de cette solution peut s'avérer bien inférieure à une autre dont la première date serait pourtant plus récente.

    Salut

  8. #8
    Membre émérite
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    Par défaut
    Bonjour, merci pour ta réponse, j'ai entamé des recherches dans ce sens.

    Citation Envoyé par dourouc05 Voir le message
    Ca ressemble vachement au subset-sum problem : trouver un sous-ensemble d'items dont la somme vaut une constante. Il existe une myriade d'algorithmes pour ça (https://fr.wikipedia.org/wiki/Probl%...sous-ensembles).

    Les algos classiques vont ignorer ton objectif de date d'expiration. Je formaliserais ça comme un problème de sac à dos (https://fr.wikipedia.org/wiki/Probl%...sac_%C3%A0_dos) : les capacités sont les quantités, la capacité du sac la quantité que tu veux trouver, les valeurs dépendraient de la date d'expiration (très grande valeur pour une date prochaine, petite sinon, à toi de voir quelle fonction correspond le mieux à ton besoin). Pour l'algorithme, tente la programmation dynamique, algorithme le plus classique pour ce problème (si ça ne marche pas assez vite, on peut toujours trouver autre chose) --- par exemple, https://github.com/google/or-tools/b...psack_solver.h est une interface pour une série d'algorithmes qui fonctionnent chacun très bien dans une catégorie d'instances.

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

Discussions similaires

  1. Meilleure combinaison possible avec plusieurs choix
    Par jmmomg dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 15/01/2017, 09h54
  2. Déterminer la meilleure combinaison possible
    Par tfuhr dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 06/12/2012, 19h39
  3. trouver les combinaisons possibles d'un tableau ?
    Par titoumimi dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 20/09/2006, 20h29
  4. toutes les combinaisons possibles
    Par marocleverness dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 29/05/2006, 00h11
  5. Sortir d'un tableau les combinaisons possibles
    Par juelo dans le forum Algorithmes et structures de données
    Réponses: 33
    Dernier message: 26/03/2006, 17h11

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