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

 C Discussion :

idée d'algorithme d'affectation


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 116
    Points : 49
    Points
    49
    Par défaut idée d'algorithme d'affectation
    En fait, le problème consiste à placer n taches sur m machines pour minimiser les retards totaux.
    La règle est la suivante : placer la tache dont la durée d'exécution est la plus petite à la machine disponible.
    A chaque fois on doit calculer le retard "T" de chaque tache (formule est la suivante : date de fin d'exécution de la tache "c" -date de fin au plus tard de la tache "d") : T= c -d.
    Ce qui est demandé :
    1) écrire un programme qui permet de trier les taches par durée d'exécution croissant: c'est fait!

    2) écrire un programme qui permet placer les taches sur les machines pour calculer les retards totaux selon la formule donnée.
    Là, je me bloque . Je n'arrive pas à le faire
    Pourriez vous me donner un coup d'aide?
    Merci!
    Voici un exemple pour mieux assimiler:
    soit
    6 taches : j1, j2, j3, j4, j5, j6
    3 machines : m1, m2, m3
    durée d'exécution : 3, 6, 1, 2, 10, 4
    d : 12, 5, 7, 8, 10, 6, 18
    r(date de début de la tache, nécessaire pour placer les taches sur la machine) : 0, 1, 6, 3, 9, 12

    1)
    séquence de tache (3,4,1,6,2,5)
    2)manuellement
    sur m1 : les taches 3, 5
    sur m2 : les taches 4, 2
    sur m3 : les taches 1, 6

    retards :
    T1 :3-12<0->T1=0 (retard ne peut pas être négatif)
    T2 : 10-5=5->T2=5
    T3: 7-7=0
    T4:5-10<0
    T5:17-6=11
    T6:7-8<0
    T retards totaux: 5+11=16

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 93
    Points
    93
    Par défaut
    Citation Envoyé par laureat Voir le message
    selon la formule donnée.
    Ou ça ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 116
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par laureat Voir le message
    (formule est la suivante : date de fin d'exécution de la tache "c" -date de fin au plus tard de la tache "d") : T= c -d.

  4. #4
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 16
    Points : 18
    Points
    18
    Par défaut
    Quand tu dis minimiser les retards totaux, c'est la solution optimale qu'il faut trouver ? Est-ce qu'il y a un type d'algorithme particulier qu'il faut utiliser ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 116
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par cameleon65 Voir le message
    Quand tu dis minimiser les retards totaux, c'est la solution optimale qu'il faut trouver ? Est-ce qu'il y a un type d'algorithme particulier qu'il faut utiliser ?
    non

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 16
    Points : 18
    Points
    18
    Par défaut
    Si on fait ce que la règle dit, il suffit de mettre la tâche la plus petite du tri croissant que tu as fait dans la première étape à la machine qui a la moins de temps accumulé.

    Donc, de façon itérative, tu fais:

    Tant qu'il y a une tâche à placer
    Trouver la machine qui a le moins de temps accumulé
    Placer sur cette machine la tâche la plus courte qui n'a pas encore été assignée
    Fin du tant que

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 116
    Points : 49
    Points
    49
    Par défaut
    Salut,

    Merci pour votre réponse.
    J'ai écris cet algorithme. Il me semble inefficace!
    Des idées??
    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
     
    soit :
    i:compteur tache
    k=3: nombre de machine;
    k:machine;
    t(k): date de disponibilité de la machine;
    t(k)=0 quelque soit la machine k;
    J : {j1, j2, j3, j4, j5}ensemble de taches ordonnancées par ordre de priorité
    tant que J<>0 faire
    pour(i=0;i<2;i++) faire
    placer les j1, j2 et j3 respectivement sur k1, k2 et k3;
    corriger la date de disponibilité de la machine k1,k2 et k3;
    enlever j1, j2 et j3 de J;
    pour(i=3;i<5;i++)
    chercher une machine k* disponible au plus tôt(min t(k));
    placer j3 sur k*;
    corriger la date de disponibilité de k*;
    enlever j3 de J;
    fait
    Merci d'avance!

  8. #8
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 16
    Points : 18
    Points
    18
    Par défaut
    Voici mon idée:


    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
    /******************************
            Déclarations des types
    *******************************/
    typedef struct
    {
    	unsigned int tempsAccumule;	
    }Machine;
     
    typedef struct
    {
    	unsigned int duree;
    	unsigned int finAuPlusTard;
    }Tache;
     
    /***************************************
            Déclarations des variables locales
    ****************************************/
    unsigned int nombreMachines;
    unsigned int nombreTaches;
     
    unsigned int numeroMachineDisponible;
    int tempsRetard;
     
    Machine machines[nombreMachines];
    Tache taches[nombreTaches];
     
    /******************************
            Corp de la fonction
    *******************************/
    tempsRetardsTotaux = 0;
     
    //Pour toutes les machines
    Pour i allant de 0 à nombreMachines en pas de 1
    	machines[i].tempsAccumule = 0;
    Fin du pour
     
    //Pour toutes les tâches à placer
    Pour i allant de 0 à nombreTaches en pas de 1
     
    	//Trouver la machine ayant le moins de temps accumulé
    	numeroMachineDisponible = 0;
    	Pour j allant de 1 à nombreMachines en pas de 1
    		Si machines[j].tempsAccumule < machines[numeroMachineDisponible].tempsAccumule
    			numeroMachineDisponible = j;
    		Fin du si.
    	Fin du pour.
     
    	//Accumuler le temps sur la machine trouvée
    	machines[numeroMachineDisponible].tempsAccumule += taches[i].duree;	
     
    	//Accumuler le retard de la tâche aux retards totaux
    	tempsRetard = taches[i].finAuPlusTard - (machines[numeroMachineDisponible].tempsAccumule + taches[i].duree);
    	Si tempsRetard > 0
    		tempsRetardsTotaux += tempsRetard;
    	Fin du si.
     
    Fin du pour
    On peut utiliser des tableaux à la place des structures, mais j'ai préféré utiliser des strutures pour regrouper les attributs et donc faciliter la compréhension.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 116
    Points : 49
    Points
    49
    Par défaut
    Merci pour cette idée géniale.
    Je vais essayer de la codé en c.
    merci beaucoup.

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

Discussions similaires

  1. Algorithmes d'affectation de traitements à des données
    Par Didou139 dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 12/11/2014, 09h09
  2. idée algorithme d' affectation
    Par laureat dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 24/08/2009, 23h16
  3. Des idées d'algorithme pour une tâche de planification
    Par laureat dans le forum Intelligence artificielle
    Réponses: 1
    Dernier message: 22/08/2009, 14h39
  4. Algorithme d'affectation de personnel
    Par camron dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 28/04/2009, 11h46
  5. Réaliser un algorithme d'affectations
    Par Nanouche dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/09/2008, 17h21

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