/*------------------------------------------------------------------------------- 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. Továbbfejlesztés: F2|perm|max(Ci) Ütemezési fedadat megoldása Johnson-algoritmussal. void Johnson_Alg( T_JOB* job, int NJ, int* s, int m1, int m2 ); Az algoritmus optimális megoldást eredményez. F3|perm|max(Ci) feladatra a Johnson-algoritmus kiterjeszthető! Ha az első gép legkisebb időadata nagyobb mint a középső gép legnagyobb időadata, vagy a harmadik gép legkisebb időadata nagyobb mint a középső gép legnagyobb időadata akkor a megoldás optimális, egyébként az optimalitás nem garantálható! void Johnson_Alg_Ext_F3( T_JOB* job, int NJ, int* s ); 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 NM gépes feladatból NM-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. -------------------------------------------------------------------------------*/ #include #include typedef struct{ int id; //identifier of the job long* ProcT; //processing time of the operations long* StartT; long* EndT; } T_JOB; void Simulation_FS( T_JOB* job, int NJ, int NM, int* s, long t_ref); void Print_Job_Gantt( T_JOB* job, int NJ, int NM, int* s); void Print_Machine_Gantt( T_JOB* job, int NJ, int NM, int* s); long Evaluation_FS( T_JOB* job, int NJ, int NM, int* s); void Johnson_Alg( T_JOB* job, int NJ, int* s, int m1, int m2); void Johnson_Alg_Ext_F3( T_JOB* job, int NJ, int* s); void copy_sch( int* s1, int* s2, int NJ); void CDS( T_JOB* job, int NJ, int NM, int* s); int main(int argc, char* argv[]) { int NJ; //number of jobs in the system int NM; //number of machines (people) int i; //index of job int m; //index of machine T_JOB* job; //list of jobs int* s; //schedule long Cmax; //completion time //adatok betoltese printf("\n Egyutas, elozes nelkuli utemezesi feladat."); printf("\n Munkak szama:"); scanf("%d", &NJ); printf("\n Gepek szama:"); scanf("%d", &NM); //memoriamodell job = (T_JOB*) calloc(NJ, sizeof(T_JOB) ); //strukturavektor for( i=0; i min( job[ r[j] ].ProcT[m1], job[ r[j] ].ProcT[m2] ) ) { //csere temp = r[i]; r[i] = r[j]; r[j] = temp; } //beutemezes f = 0; //first l = NJ - 1; //last for (i=0; i Cmax_act ) { copy_sch(s_act, s_best, NJ); Cmax_best = Cmax_act; } } //legjobb megoldas copy_sch(s_best, s, NJ); free(s_best); free(s_act); } void copy_sch( int* s1, int* s2, int NJ) { //vektor masolasa elemenkent int i; for( i=0; i