#include #define n 4 int deb[n]={ 1, 0, 7, 9}, // date de début de tâche au plus tôt fin[n]={ 4, 6,13,12}, // date de fin de tâche au plus tard dur[n]={ 3, 2, 2, 3}, // durée de la tâche cou[n]={ 7, 4, 4, 7}; // pénalité si la tâche n'est pas faite dans les limites de temps typedef struct{int min, // évaluation par défaut : somme des pénalité des tâches ne pouvant plus être faites à temps maj, // évaluation par excès : somme des pénalité des tâches non fixées fin, // date de fin de la dernière des tâches fixées deb[n]; // date de début des tâches fixées, -1 pour les tâches non fixées } noeud; noeud h; int min(int a,int b) {return ab?a:b;} void eval(noeud *a) { int i; a->maj=a->min=0; for(i=0;ideb[i]<0) // le coût de chaque tâche i non fixée { a->maj+=cou[i]; // est ajouté a l'évaluation par excès if(max(deb[i],a->fin)+dur[i]>fin[i]) a->min+=cou[i]; // et à l'évaluation par défaut si elle ne peut pas être } // faite à temps après la date fin if(a->majdeb[i]<0) // On sépare en choisissant une des tâches i non fixées { t[m]=*a; t[m].deb[i]=x=max(a->fin,deb[i]); // qui sera exécutée le plus tôt possible après la date a->fin t[m].fin=x+=dur[i]; // date de fin de cette tâche if(x<=fin[i]) eval(t+m++); // Si cette tâche peut être faite à temps, on garde ce noeud et on l'évalue } for(i=m;i--;) // On trie les fils de *a dans l'ordre croissant des évaluations par défaut for(j=0;jt[j+1].min) u=t[j], t[j]=t[j+1], t[j+1]=u; for(i=0;ideb[i]>=0) printf(" %d:%d->%d",i,a->deb[i],a->deb[i]+dur[i]); else printf(" %d:(%d)",i,cou[i]); printf(" %d\n",a->maj); } void sepeval() { int i; for(i=0;icc[Jm]) Jm=J; // Jm est l'ensemble de tâches réalisables à temps qui maximise cc for(i=0;iJ) // Ji=J u{i} donc Ji>J <=> i n'est pas dans J { int x=max(FIN[J],deb[i])+dur[i]; // date de fin de la tâche i exécutée dès que possible après toutes les tâches de J if(x<=fin[i] && x%d",i,FIN[Ji]-dur[i],FIN[Ji]); } for(i=0;i