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 :

Algorithme de réapprovisionnement de pharmacie


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Par défaut Algorithme de réapprovisionnement de pharmacie
    Bonjour,

    je bute depuis plusieurs semaines sur un algorithme permettant d'éditer une liste de médicaments à expédier.

    2 types de pharmacie :
    - pharmacie site
    - pharmacie pays qui réapprovisionne les pharmacies site du pays

    2 catégories de médicaments à réapprovisionner :
    - placebo (P)
    - médicament de l'étude (M)

    objectif :
    - permettre à une pharmacie pays d'éditer une liste de médicaments à expédier dans un site en se basant sur (1) un seuil défini pour le site dans une table de paramétrages et (2) les stocks actuellement disponibles sur le site

    contraintes :
    - toujours respecter l'équilibre 50/50 placebo/médicament de l'étude
    - les pharmacies sont en 'aveugle' -> commande des quantité globales (médicament + placebo)
    - on défini des quantités à commander calculées comme valeurs par défaut mais l'utilisateur peut modifier cette valeur

    j'ai essayé de définir les différents cas de figures mais je m'y perd
    une des difficultés est le fait que l'utilisateur est en aveugle et peut modifier la quantité calculée par défaut (il commande une quantité globale)


    ci-dessous, la fonction que j'ai commencé à écrire

    Code Python : 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
     
    # site : site a reapprovisionner
    # pays : pays du site à réapprovisionner
    # quantite : quantite demandee (peut être égale à la valeur par défaut calculée à partir des stocks disponibles sur site et du seuil de confort)
    def liste_medicaments_a_expedier(pays,site,quantite):
     
        # liste des médicaments à retourner
        medicaments = []
     
        # seuil du site
        seuil = Parametrage.objects.get(asp_par_loc = site).asp_par_con
     
        # Medicaments disponibles sur le site a réapprovisionner
        medicament_disponible_site = [m.med_num for m in Medicament.objects.filter(Q(med_dru = 1) & Q(med_sit = site) & Q(med_eta=1))]
        placebo_disponible_site = [m.med_num for m in Medicament.objects.filter(Q(med_dru = 2) & Q(med_sit = site) & Q(med_eta=1))]
     
        # Medicaments disponibles dans le pays du site a réapprovisionner
        medicament_disponible_pays = [m.med_num for m in Medicament.objects.filter(Q(med_dru = 1) & Q(med_sit = pays) & Q(med_eta=1))]
        placebo_disponible_pays = [m.med_num for m in Medicament.objects.filter(Q(med_dru = 2) & Q(med_sit = pays) & Q(med_eta=1))]
     
     
        # quantités à commander calculées en fonction du seuil
        quantite_medicament_a_commander = seuil - len(medicament_disponible_site)
        quantite_placebo_a_commander = seuil - len(placebo_disponible_site)
     
        # si les stocks sont suffisants
        if quantite_medicament_a_commander<=len(medicament_disponible_pays) and quantite_placebo_a_commander<=len(placebo_disponible_pays):
            medicaments = medicament_disponible_pays[:int(quantite_medicament_a_commander)] + placebo_disponible_pays[:int(quantite_placebo_a_commander)]
        # si les stocks sont insuffisants -> nouveau calcul des quantités à expédier
        else:
            if len(medicament_disponible_pays) < len(placebo_disponible_pays):
                quantite_equilibre = len(medicament_disponible_pays) + len(medicament_disponible_site)
     
            elif len(medicament_disponible_pays) > len(placebo_disponible_pays):
                quantite_equilibre = len(placebo_disponible_pays) + len(placebo_disponible_site)
     
            else:
                quantite_equilibre = len(placebo_disponible_pays) + min(len(medicament_disponible_site),len(placebo_disponible_site))
            medicaments = medicament_disponible_pays[:int(quantite_equilibre - len(medicament_disponible_site))] + placebo_disponible_pays[:int(quantite_equilibre - len(placebo_disponible_site))]
     
     
        return medicaments

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour

    Pourquoi une simple division par 2 n'est-elle pas suffisante ?

    Exemple : Une pharmacie a 400 médocs. Il lui en faut 600. Par défaut, elle nécessite 200. Mais elle demande 400. Donc la pharmacie pays lui envoie 200 placébos (P) et 200 médicaments (M). J'ai juste divisé la demande par 2 pour trouver les quantités. Et on a bien 50%-50%.

    Pourquoi ce raisonnement simple ne convient pas ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Par défaut
    bonjour,

    parce qu'il faut tenir compte des quantités de chaque catégorie de médicaments sur site pour conserver le 50/50

    en divisant par 2, on fait l'hypothèse que la répartition sur site avant réapprovisionnement est de 50/50 ce qui ne sera pas forcément le cas

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    D'accord mais dis-en plus. La pharmacie pays connaît-elle la répartition réelle d'une des pharmacies ? Si oui, il suffit de compléter l'écart et diviser le reste par deux. Sinon comment veux-tu obtenir un résultat alors que ni la pharmacie locale, ni la pharmacie pays n'ont l'information ?

  5. #5
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Par défaut
    aucune des pharmacies (pays ou site) ne connait la répartition des médicaments, ils sont en aveugle

    par contre en base, on a bien sûr les stocks de chaque catégorie de médicaments dans chacune des pharmacies

    ce que l'on veut c'est 'aider' les pharmacies pays dans leur réapprovisionnement à partir d'un seuil et en essayant de garantir une répartition 50/50

  6. #6
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Donc tu as la solution.

    Je reprends l'exemple précédent. La pharmacie a 300 médocs et 100 placebos, sans le savoir. Elle sait juste qu'elle a 400. Elle commande 400 (pour avoir plus de 600 comme précédemment). Et la base de données complète le différentiel de 200 puis divise le reste (200) par 2. Elle conseillera donc d'envoyer 300 placebos P et 100 médicaments M; pour un total de 800 médicaments dont 400P et 400M, 50%-50%.

    Si la quantité demandée est trop faible pour combler l'écart, on n'envoie que le produit déficitaire.
    Si on tombe sur un nombre impair, on garde en mémoire si c'est P ou M qui est en excédant pour une unité. La fois suivante, ce sera le contraire, pour retomber sur la parité.

Discussions similaires

  1. Formalisation graphique des algorithmes
    Par David R. dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 08/12/2012, 10h21
  2. Algorithme de randomisation ... ( Hasard ...? )
    Par Anonymous dans le forum Assembleur
    Réponses: 8
    Dernier message: 06/09/2002, 14h25
  3. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18
  4. Recherche de documentation complète en algorithmes
    Par Anonymous dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/03/2002, 12h09
  5. Algorithme génétique
    Par Stephane.P_(dis Postef) dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 15/03/2002, 17h14

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