/*------------------------------------------------------------------------------ 1||Szum(Ci) Utemezesi fedadat megoldasa SPT ütemezési szabály alkalmazásával. Egygépes termelésiütemezési feladat. Az ütemezés célja a befejezési idők összegének minimalizálása, ezáltal az átlagos készletszint minimalizálása. SPT Shortest Processing Time (műveleti idő szerint nemcsökkenő munkasorrend) A megoldás optimális ütemtervet eredményez. Bővítés: 1|di|Lmax Egygépes termelésiütemezési feladat. Az ütemezés célja a legnagyobb késés minimalizálása. EDD Earliest Due Date (határidő szerint nemcsökkenő munkasorrend) A megoldás optimális ütemtervet eredményez. -------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------- P||Szum(Ci) Utemezesi fedadat megoldasa MSPT ütemezési szabály alkalmazásával. Párhuzamos gépes termelésütemezési feladat. Az ütemezés célja a munkák befejezési időpontjai összegének minimalizálása, ezáltal az átlagos készletszint minimalizálása. MSPT Modified Shortest Processing Time módosított legrövidebb műveleti idejű munka előre: Alkalmazzuk az SPT szabályt a munkák sorbarendezésére (műveleti idők alapján nemcsökkenő sorrendbe), ezután képezzünk a gépek számának megfelelő hosszú csoportokat. Az első csoport munkái az elsők rendre az egyes gépeken, a második csoport munkái a másodikok rendre az egyes gépeken stb. Feltétel, hogy a munkák és a gépek számának hányadosa (N/M) egész legyen, ezt teljesíthetjük, ha bizonyos számú 0 műveleti idejű fiktív munkát hozzáadunk a rendeléscsoporthoz. A megoldás optimális ütemtervet eredményez. -------------------------------------------------------------------------------*/ #include #include typedef struct{ int id; //azonosito long ProcT; //muveleti ido long StartT; //inditasi idopont long EndT; //befejezesi idopont long d; //hatarido long L; //keses }T_JOB; //munka typedef struct{ long Csum; long Cmax; //max. Completion Time double ASL; //average stock level, atlagos keszletszint long Lmax; //max. Lateness, legnagyobb keses }T_OBJF; //objective function typedef struct{ int id; int l; //load, terheles: vegrehajtando munkak szama }T_RES; //resource, eroforras void Simulation(T_JOB* job, int NJ, int* sch, long t_ref); long Evaluate_Csum(T_JOB* job, int NJ); void Evaluate(T_JOB* job, int NJ, T_OBJF* obj); void print_gantt(T_JOB* job, int NJ, int* sch); void SPT_rule(T_JOB* job, int NJ, int* sch); void EDD_rule(T_JOB* job, int NJ, int* sch); void print_obj(T_OBJF* obj); void Simulation_P(T_JOB* job, int NJ, T_RES* res, int NM, int** s, long t_ref); void MSPT_rule(T_JOB* job, int NJ, T_RES* res, int NM, int** s); void print_gantt_P(T_JOB* job, int NJ, T_RES* res, int NM, int** s); int main(int argc, char* argv[]) { int NJ; //number of jobs, munkak szama T_JOB* job; //strukturavektorra mutato pointer int i; //munka futoindexe int* sch; //schedule utemterv long Csum; //celfuggveny erteke T_OBJF obj; //celfuggvenyek int** s; //parhuzamos gepek eseten a megoldast egy matrix irja le int NM; //number of machine, gepek szama int m; //gepek futoindexe T_RES* res; //eroforrasok //input generalas printf("\n Parhuzamos gepek termelesutemezesi feladata."); printf("\n Munkak szama: "); scanf("%d", &NJ); printf("\n Eroforrasok szama: "); scanf("%d", &NM); //memmoriafoglalas //eroforras res = (T_RES*) calloc( NM, sizeof(T_RES) ); //matrix s = (int**) calloc( NM, sizeof(int*) ); for( m=0; mCsum = Csum; obj->Cmax = Cmax; obj->ASL = (double) Csum / Cmax; obj->Lmax = Lmax; } void print_gantt(T_JOB* job, int NJ, int* sch) { int i; printf("\n Munkak vegrehajtasanak idoadatai:"); printf("\n Sorszam \t Munka \tIndul\t Befejezes \t Hatarido \t Keses"); for ( i=0; i", m, res[m].l ); print_gantt(job, res[m].l, s[m]); } } void SPT_rule(T_JOB* job, int NJ, int* sch) { //Shortest Processing Time //muveleti ido szerint nemcsokkeno munkasorrend kialakitasa int i, j; int temp; for( i=0; i < NJ-1; i++ ) for( j=i+1; j < NJ; j++ ) if ( job[ sch[i] ].ProcT > job[ sch[j] ].ProcT ) { //csere temp = sch[i]; sch[i] = sch[j]; sch[j] = temp; } } void EDD_rule(T_JOB* job, int NJ, int* sch) { //Earliast Due Date //hatarido szerint nemcsokkeno munkasorrend kialakitasa int i, j; int temp; for( i=0; i < NJ-1; i++ ) for( j=i+1; j < NJ; j++ ) if ( job[ sch[i] ].d > job[ sch[j] ].d ) { //csere temp = sch[i]; sch[i] = sch[j]; sch[j] = temp; } } void print_obj(T_OBJF* obj) { printf("\n Csum = %ld \n Cmax = %ld \n ASL = %lf \n Lmax = %ld", obj->Csum, obj->Cmax, obj->ASL, obj->Lmax); } void MSPT_rule(T_JOB* job, int NJ, T_RES* res, int NM, int** s) { int i, m; int* r; r = (int*) calloc( NJ, sizeof(int) ); for( i=0; i