/*------------------------------------------------------------------------------ 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. -------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------- 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 typedef struct{ int id; //azonsito long ProcT; //muveleti ido long StartT; //kezdesi ido long EndT; //befejezesi ido long d; //hatarido long L; //keses }T_JOB; //Munka (Job) typedef struct{ long Csum; //befejezesi idopontok osszege double ASL; //atlagos keszletszint long Lmax; //legnagyobb keses long Cmax; //utolso munka befejezesi idopontja }T_OBJF; //celfuggveny, objective function typedef struct{ int id; int l; //load, terheles (elvegzendo munkak szama) long Cmax; //completion time on the resource, felszabadulas ideje }T_RES; //resource void Simulation(T_JOB* job, int* sch, int NJ, int t_ref); void Simulation_P(T_JOB* job, int** s, int NJ, int NM, T_RES* res, int t_ref); //void Evaluate(T_JOB* job, int* sch, int NJ, T_OBJF* obj); void Evaluate(T_JOB* job, int NJ, T_OBJF* obj); void Print_Job_Gantt(T_JOB* job, int* sch, int NJ); //idotabla megjelenitese void Print_Res_Gantt(T_JOB* job, int** s, int NJ, int NM, T_RES* res); void SPT_rule(T_JOB* job, int* sch, int NJ); void EDD_rule(T_JOB* job, int* sch, int NJ); void MSPT_rule(T_JOB* job, int** s, int NJ, int NM, T_RES* res); void Print_ObjF(T_OBJF* obj); void LPT_rule(T_JOB* job, int* sch, int NJ); void LPT_List_rule(T_JOB* job, int** s, int NJ, int NM, T_RES* res); int main(int argc, char* argv[]) { int i; //futoindex a munkakhoz int NJ; //munkak szama int m; //gepek (eroforrasok) futoindexe int NM; //gepek eroforrasok) szama T_RES* res; //eroforrasok listaja T_JOB* job; //strukturavektorra mutato pointer //int* sch; //utemterv vektorara mutato pointer int** s; //utemterv a parhuzamos gepek szamara long t_ref = 0; //referencia idopont T_OBJF obj; printf("\n Parhuzamos gepeket uzemelteto gyartorendszer utemezese."); printf("\n Munkak szama:"); scanf("%d", &NJ); //betoltes bill.-rol printf("\n Gepek szama:"); scanf("%d", &NM); //betoltes bill.-rol //memoriafoglalas res = (T_RES*) calloc( NM, sizeof(T_RES) ); for( m=0; mCsum = Csum; //obj->ASL = (double) Csum / job[ sch[NJ-1] ].EndT; obj->ASL = (double) Csum / Cmax; obj->Lmax = Lmax; obj->Cmax = Cmax; } void Print_Job_Gantt(T_JOB* job, int* sch, int NJ) { int i; printf("\n Sorszam \t Munka \t Indit \t Befejez \t Hatarido \t Keses"); for (i=0; i \n", m, res[m].l ); Print_Job_Gantt(job, s[m], res[m].l); //egy gep } } void SPT_rule(T_JOB* job, int* sch, int NJ) { //SPT szerinti rendezes int i, j; int temp; for ( i=0; i < NJ-1; i++) for ( j=i+1; j <= NJ-1; 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* sch, int NJ) { //EDD szerinti rendezes int i, j; int temp; for ( i=0; i < NJ-1; i++) for ( j=i+1; j <= NJ-1; j++ ) if ( job[ sch[i] ].d > job[ sch[j] ].d ) { //csere temp = sch[i]; sch[i] = sch[j]; sch[j] = temp; } } void Simulation_P(T_JOB* job, int** s, int NJ, int NM, T_RES* res, int t_ref) { int m; for( m=0; mCsum, obj->ASL, obj->Lmax, obj->Cmax ); } void LPT_List_rule(T_JOB* job, int** s, int NJ, int NM, T_RES* res) { //heurisztikus megoldas int i; int m; int tm; //target machine int* r; r = (int*) calloc(NJ, sizeof(int) ); for( i=0; i res[m].Cmax ) tm = m; //kivalasztas //terheles s[ tm ][ res[tm].l ] = r[i]; //munka a gep soranak soronkovetkezo rekeszebe res[tm].l++; //munkak szama a gepen res[tm].Cmax += job[ r[i] ].ProcT; //felszabadulas idopontja } free(r); } void LPT_rule(T_JOB* job, int* sch, int NJ) { //LPT szerinti rendezes int i, j; int temp; for ( i=0; i < NJ-1; i++) for ( j=i+1; j <= NJ-1; j++ ) if ( job[ sch[i] ].ProcT < job[ sch[j] ].ProcT ) { //csere temp = sch[i]; sch[i] = sch[j]; sch[j] = temp; } }