/*------------------------------------------------------------------------------ 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, hatarido*/ } T_JOB; typedef struct { long Csum, Tmax, Cmax; } T_OBJ; typedef struct { int id, l; /* a hozzarendelt munkak szama*/ long C; /* felszabadulas idopontja*/ } 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_OBJ* obj); 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 Print_Gantt(T_JOB* job, int N, int* sch); void Print_Mach_Gantt(T_JOB* job, int N, T_MACHINE * machine, int M, int** s); 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_OBJ obj; int* sch; int** s; //ketdimenzios tomb T_MACHINE* machine; int N; //job-ok szama int M; //gepek szama int i, m; long Csum; printf("Kerem a munkak szamat:"); scanf("%d", &N); printf("\n Kerem a gepek szamat:"); scanf("%d", &M); /* egygepes feladatban az utemtervet leiro dontesi valtozo egy vektor*/ sch = (int*) calloc(N, sizeof(int)); /* parhuzamosgepes feladatban az utemtervet leiro dontesi valtozo egy matrix*/ s = (int**) calloc(M, sizeof(int*)); for (m=0; m 0 ) Simulation(job, machine[m].l, s[m], t); /* ha nincs a gephez munka hozzarendelve nem kell szamolni*/ } void Evaluation(T_JOB* job, int N, T_OBJ* obj) { int i; obj->Csum = 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); 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 SPT_rule(T_JOB* job, int N, int* sch) { int i, j; int temp; /* Shortest Processing Time */ 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) { int i, j; int temp; /* Longest Processing Time */ for (i=0; i job[ sch[j] ].d ) { temp = sch[i]; sch[i] = sch[j]; sch[j] = temp; } } void Print_Gantt(T_JOB* job, int N, int* sch) { int i; printf("\n sorsz \t job \t ST \t PT \t ET \t d \t T"); for (i=0; i machine[m].C ) sel_mach = m; //az i.-edik munka beutemezese a kivalasztott gepre //a terhelesi lista vegere kerul pos = machine[sel_mach].l; s[ sel_mach ][ pos ] = r[i]; machine[sel_mach].l++; machine[sel_mach].C += job[r[i]].ProcT; } free(r); } void MSPT_rule(T_JOB* job, int N, T_MACHINE * machine, int M, int** s) { int* r; int i; //job index int m; //gep index int pos; //kovetkezo szabad rekesz sorszama r = (int*) calloc(N, sizeof(int)); /* rendezes elott inicializalas */ for (i=0; i