/*------------------------------------------------------------------------------- TIA F|perm|max(Ci) Ütemezési fedadat szimulációja. Egyutas előzésnélküli többoperációs termelésütemezési feladat. A Simulation_FS adott műveleti idők és adott indítási sorrend esetében kiszámítja az operációk indítási és befejezési időpontjait. F2|perm|max(Ci) Ütemezési fedadat megoldása Johnson-algoritmussal. Az algoritmus optimális megoldást eredményez. void Johnson_alg(T_JOB* job, int N, int M, int* sch, int x, int y); F3|perm|max(Ci) feladatra a Johnson-algoritmus kiterjeszthető! Bizonyos feltételek teljesülése esetén a megoldás optimális, egyébként az optimalitás nem garantálható! int Johnson_alg_3gepre(T_JOB* job, int N, int M, int* sch, int x); Továbbfejlesztett modell: F|permut|max(Ci) Utemezesi fedadat: Többgépes egyutas előzés nélküli 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. CDS-algoritmus: A Campbell-Dudek-Smith algoritmus a többgépes feladatot kétgépes problémákra vezeti vissza. Az algoritmus az eredeti M gépes feladatból M-1 darab mesterséges kétgépes problémát generál úgy, hogy az egymást követő gépek lesznek a kétgépes feladat gépei. A kétgépes feladatok egyenként megoldhatók a Johnson-algoritmussal. Kiválasztva közülük a teljes feladatra vonatkozó átfutási idő szempontjából a legjobbat, az lesz az M-gépes probléma megoldása. A megoldás nem optimális mert a feladat NP-hard, de jó közelítő ütemtervet eredményez. Dannenbring-algoritmus: Az eredeti M-gépes problémából egy mesterséges kétgépes problémát generál úgy, hogy a műveleti idők súlyozott lineáris kombinációjával állítja elő a virtuális kétgépes probléma időadatait. A kétgépes feladat megoldható a Johnson-algoritmussal és ez adja az eredeti probléma megoldását. . DTFSZTIR Továbbfejlesztett modell: F|perm|max(Ci) Utemezesi fedadat megoldasa véletlenszerűen kereső algoritmus alkalmazásával. Lokális kereső algoritmus demo (kész). Továbbfejlesztett modell: Szakaszosan rendelkezésre álló erőforrások terhelésére szolgáló algortimus. A Load_STET_to_Cal függvény a megadott terhelést [st, et] az adott gépre megszakitás nelkul helyezi el (a legkorábbi rendelkezésre állási intervallumra, amelyen egészben elfér). Folytatás: Az új módszer alkalmazása a szimulációban FS-re. -------------------------------------------------------------------------------*/ #include #include #include #include typedef struct{ int id; long *ProcT, /*vektorban tarolhato az operaciok ideje*/ *StartT, *EndT; long T, /* tardiness, csuszas */ d; /* due date, hatariido */ }T_JOB; typedef struct{ long Cmax; /*Cmax Completion Time*/ }T_OBJF; typedef struct{ long ST; //idointervallum eleje long ET; //idointervallum vege }T_TW; //Time Window, idointervallum typedef struct{ int id; //eroforras azonosito int NCal; //number of calendar elements, T_TW* Cal; //Calendar }T_RES; //resurce, eroforras void Simulation_FS(T_JOB* job, int N, int M, int* sch, long t); void Evaluation(T_JOB* job, int N, int M, T_OBJF* obj); void print_Machine_Gantt_FS(T_JOB* job, int N, int M, int* sch); void print_Job_Gantt_FS(T_JOB* job, int N, int M, int* sch); void Johnson_alg(T_JOB* job, int N, int M, int* sch, int x, int y); int Johnson_alg_3gepre(T_JOB* job, int N, int M, int* sch, int x); void CDS_alg(T_JOB* job, int N, int M, int* sch); void copy_sch(int* s1, int* s2, int N); void Dannenbring_alg(T_JOB* job, int N, int M, int* sch); //DTFSZTIR int Search(T_JOB* job, int N, int M, int* sch, int STEP, int LOOP, int mode); void Neighbour(int* s0, int* s, int N); void Neighbour_v2(int* s0, int* s, int N); int Load_STET_to_Cal( long* ST, long* ET, long last, T_RES* res, int m); void print_Res_Cal(T_RES* res, int M ); int main(int argc, char* argv[]) { int par; //kiterjeszthetoseg feltetelenek vizsgalata T_JOB* job; //munkak adatai T_RES* res; //gepek int M; //gepek szama int m; //gepek indexe int c; //idointervallumok futoindexe 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); randomize(); //res res = (T_RES*) calloc( M, sizeof(T_RES)); for(m=0; mCmax = job[0].EndT[M-1]; for (i=1; i obj->Cmax ) obj->Cmax = job[i].EndT[M-1]; } void Johnson_alg(T_JOB* job, int N, int M, int* sch, int x, int y) { int i, j; int temp; int * r; int f, l; r = (int*) calloc(N, sizeof(int)); for(i=0; i min( job[r[j]].ProcT[x], job[r[j]].ProcT[y] ) ) { temp = r[i]; r[i] = r[j]; r[j] = temp; } f = 0; /* first */ l = N-1; /* last */ for(i=0; i job[i].ProcT[x]) min_0 = job[i].ProcT[x]; if ( max_1 > job[i].ProcT[x+1]) max_1 = job[i].ProcT[x+1]; if ( min_2 > job[i].ProcT[x+2]) min_2 = job[i].ProcT[x+2]; } } if ( min_0 >= max_1 || min_2 >= max_1 ) return 1; else return 0; } void CDS_alg(T_JOB* job, int N, int M, int* sch) { int m; //gepek futoindexe int i; //munkak futoindexe T_OBJF obj; //celfuggveny T_OBJF obj_best; //legjobb megoldashoz tartozo celfuggveny int* sch_best; //legjobb utemterv (megoldas) sch_best = (int*) calloc(N, sizeof(int)); for (m=0; m obj.Cmax ) { copy_sch(sch, sch_best, N); obj_best = obj; } } } copy_sch(sch_best, sch, N); free(sch_best); } void copy_sch(int* s1, int* s2, int N) { int i; for (i=0; i obj_s.Cmax ) { //kiterjesztes legjobbjanak megjegyzese copy_sch(s, s_ext, N); //utemterv obj_s_ext = obj_s; //celfuggveny } }//loop copy_sch( s_ext, s0, N); //uj bazis if ( obj_s_best.Cmax > obj_s_ext.Cmax ) { //legjobb megoldas megjegyzese copy_sch( s_ext, s_best, N); obj_s_best = obj_s_ext; best_step = step; } }//step copy_sch( s_best, sch, N); //eredmeny //felszabaditas free( s0 ); free( s ); free( s_ext ); free( s_best ); return best_step; //legjobb lepes sorszama } void Neighbour(int* s0, int* s, int N) { //szomszedsag definicioja //pelda: veletlenszeruen valasztott sorszamu elemet a tole balra levo elemmel felcsereljuk int i; //cel kivalasztasa int x = rand()%N; for (i=0; i= res[m].NCal ) { newST = res[m].Cal[c-1].ET; newET = newST + size; break; } continue; } } c++; } *ST = newST; //erdmeny felulirja a kezdoerteket *ET = newET; return found; //megtalalt intervallum sorszama } void print_Res_Cal(T_RES* res, int M ) { int c, m; for(m=0; m", m, res[m].NCal ); printf("\n\tsorszam\t eleje \t vege"); for(c=0; c