/*------------------------------------------------------------------------------ 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. -------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------ 1||Tmax Utemezesi fedadat megoldasa EDD ütemezési szabály alkalmazásával. Egygépes termelésiütemezési feladat. Az ütemezés célja a legnagyobb csúszá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 (M) 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. -------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------- P||max(Ci) Utemezesi fedadat megoldasa LPT+LIST ütemezési szabály alkalmazásával. Párhuzamos gépes termelésiütemezési feladat. Az ütemezés célja a legkésőbbi befejezési időpont minimalizálása, ezáltal a teljes rendeléscsoport átfutási idejének minimalizálása. LPT+LIST Alkalmazzuk az LPT szabályt a munkák sorbarendezésére (műveleti idők alapján nemnövekvő sorrendbe), ezután az így kapott sorrendben vesszük a munkákat és mindig a legkorábban felszabaduló gépre ütemezzük a már beütemezettek mögé, ha több gép egyidejűleg szabadul fel, akkor a legkisebb azonosítójút terheljük. A megoldás nem optimális mert a feladat NP-hard, de jó közelítő ütemtervet eredményez. -------------------------------------------------------------------------------*/ #include #include #include #include typedef struct{ int id; long ProcT, StartT, EndT, T, /* tardiness, csuszas */ d; /* due date, hatariido */ }T_JOB; typedef struct{ long Csum, Tmax; /* Max Tardiness */ long Cmax; /*Cmax Completion Time*/ }T_OBJF; typedef struct{ int id, l; /*load, teheles, hozzarendelt munkak szama*/ long C; /*Completion, felszadulasi ido */ }T_MACHINE; void Simulation(T_JOB* job, int N, int* sch, long t); void Simulation_P(T_JOB* job, int N, T_MACHINE* machine, int M, int** s, long t); void Evaluation(T_JOB* job, int N, T_OBJF* obj); void print_job(T_JOB* job, int N); void print_Gantt(T_JOB* job, int N, int* sch); void print_Gantt_P(T_JOB* job, int N, T_MACHINE* machine, int M, int** s); void SPT_rule(T_JOB* job, int N, int* sch); void LPT_rule(T_JOB* job, int N, int* sch); void EDD_rule(T_JOB* job, int N, int* sch); void MSPT_rule(T_JOB* job, int N, T_MACHINE* machine, int M, int** s); void LPT_List_rule(T_JOB* job, int N, T_MACHINE* machine, int M, int** s); int main(int argc, char* argv[]) { T_JOB* job; T_MACHINE* machine; int M; //gepek szama int m; //gepek indexe int** s; //utemterv int* sch; T_OBJF obj; int N; //munkak szama int i; //munkak indexe printf("\n Kerem a munkak szamat:"); scanf("%d", &N); printf("\n Kerem a gepek szamat:"); scanf("%d", &M); machine = (T_MACHINE*) calloc(M, sizeof(T_MACHINE)); randomize(); job = (T_JOB*) calloc( N, sizeof(T_JOB)); for (i=0; iCsum = 0; obj->Tmax = 0; obj->Cmax = 0; for (i=0; iCsum += job[i].EndT; job[i].T = max( 0, job[i].EndT - job[i].d); /*Tardiness*/ if (i==0) { obj->Tmax = job[i].T; obj->Cmax = job[i].EndT; } else { if ( obj->Tmax < job[i].T ) obj->Tmax = job[i].T; if ( obj->Cmax < job[i].EndT ) obj->Cmax = job[i].EndT; } } } void print_job(T_JOB* job, int N) { int i; printf("\n id \t StartT \t ProcT \t EndT"); for (i=0; i job[ sch[j] ].ProcT ) { temp = sch[i]; sch[i] = sch[j]; sch[j] = temp; } } } void LPT_rule(T_JOB* job, int N, int* sch) { /* Longest Processing Time*/ int temp; int i, j; for (i=0; i job[ sch[j] ].d ) { temp = sch[i]; sch[i] = sch[j]; sch[j] = temp; } } } void MSPT_rule(T_JOB* job, int N, T_MACHINE* machine, int M, int** s) { int i, m; int* r; r = (int*) calloc(N, sizeof(int)); for (i=0; i machine[ m ].C ) sel_mach = m; /* a gep terhelesi soranak vegehez hozzaadjuk a munkat*/ /* a beutemezendo munka sorszama i azonositoja r[i] */ s[ sel_mach ][ machine[sel_mach].l ] = r[i]; machine[sel_mach].l++; /* noveljuk a terhelesek szamat*/ machine[sel_mach].C += job[ r[i] ].ProcT; /*muveleti idovel noveljuk*/ } /* az utemterv az s matrixban eloallt*/ free(r); }