//*------------------------------------------------------------------------------- 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 int SetT, ProcT, OpT, StartT, EndT, D, L; }T_JOB; typedef struct { int id; int l; /*load*/ long int C; /*completion time*/ }T_MACHINE; typedef struct { long Cmax, /*utolso job bef. idopontja*/ Csum; /* bef. idok osszege*/ }T_OBJF; /*celfuggvenyek*/ void MSPT_rule(T_JOB* job, int** sch, int NJ, T_MACHINE* machine, int NM); void LPT_LIST_rule(T_JOB* job, int** sch, int NJ, T_MACHINE* machine, int NM); void simulation(T_JOB* job, int** sch, int NJ, T_MACHINE* machine, int NM, long t); void evaluation(T_JOB* job, int NJ, T_OBJF* objf); void print_objf(T_OBJF* objf); void print_Gantt(T_JOB* job, int** sch, int NJ, T_MACHINE* machine, int NM); void SPT_rule(T_JOB* job, int* r, int NJ); void EDD_rule(T_JOB* job, int* r, int NJ); void LPT_rule(T_JOB* job, int* r, int NJ); int main(int argc, char* argv[]) { int NJ; /* munkak szama*/ int NM; /* gepek szama*/ T_MACHINE * mach; int i, j; T_JOB* job; /* munkak strvektre mutato*/ int** sch; /* utemterv */ T_OBJF objf; /* modellepites, utemezes, szimulacio, ertekeles*/ /*modellepites*/ printf("\n Kerem a munkak aktualis szamat:"); scanf("%d", &NJ); printf("\n Kerem a gepek aktualis szamat:"); scanf("%d", &NM); job = calloc(sizeof(T_JOB), NJ); randomize(); for (i=0; iCsum = 0; objf->Cmax = 0; for (i=0; iCsum += job[i].EndT; job[i].L = job[i].EndT - job[i].D; /*keses*/ if (i==0) objf->Cmax = job[i].EndT; else if ( objf->Cmax < job[i].EndT ) objf->Cmax = job[i].EndT; } } void print_objf(T_OBJF* objf) { printf("\n Csum= %ld", objf->Csum); printf("\n Cmax= %ld", objf->Cmax); } void print_Gantt(T_JOB* job, int** sch, int NJ, T_MACHINE* machine, int NM) { int i; int m; for (m=0; m job[ r[j] ].OpT ) { temp = r[j]; r[j] = r[i]; r[i] = temp; } } } void EDD_rule(T_JOB* job, int* r, int NJ) { int i, j, temp; for (i=0; i job[ r[j] ].D ) { temp = r[j]; r[j] = r[i]; r[i] = temp; } } } void LPT_LIST_rule(T_JOB* job, int** sch, int NJ, T_MACHINE* machine, int NM) { int* r; int i; /*job index*/ int m; /*machine index*/ int am; /*gepek futoindexe*/ r = (int *) calloc(NJ, sizeof(int)); for (i=0; i