/*------------------------------------------------------------------------------- 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. Továbbfejlesztett modell: F|permut|max(Ci) Utemezesi fedadat megoldasa véletlenszerűen kereső algoritmus alkalmazásával. Lokális kereső algoritmus demo. A keresési módszer lassabban működik, de jobb közelítést ad mint a CDS algoritmus. Továbbfejlesztés: Több célfüggvény számítása, a felhasználó választhatja ki az aktuális célfüggvényt. -------------------------------------------------------------------------------*/ #include #include #define NObjF 4 typedef struct { int id; long* ProcT; //vektor long* StartT; //vektor long* EndT; //vektor long d; //hatarido, due date }T_JOB; /*CodeBlocks esetén long min( long a, long b) { return a < b ? a : b; } long max( long a, long b) { return a > b ? a : b; } */ void Simulation_FS( T_JOB* job, int NJ, int NM, int* s, long t_ref ); //long Evaluation_FS( T_JOB* job, int NJ, int NM, int* s); long Evaluation_FS( T_JOB* job, int NJ, int NM, int* s, double* ObjF); void Print_Machine_Gantt( 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 CDS_Alg( T_JOB* job, int NJ, int NM, int* s ); void copy_sch(int* s1, int* s2, int NJ); //void Search_Alg( T_JOB* job, int NJ, int NM, int* s, int STEP, int LOOP ); void Search_Alg( T_JOB* job, int NJ, int NM, int* s, int STEP, int LOOP, int objf_index ); void Neighbour( int* s0, int* s_act, int NJ); //szomszegos megoldas keszitese int main(int argc, char* argv[]) { int i, NJ; //number of jobs int m, NM; //number of machines int objf_index; //kivalsztott celfv sorszama T_JOB* job; //jobs int* s; //schedule long Cmax; //befejezesi idopont double ObjF[ NObjF ]; //celfv vektor printf("\n Flow Shop feladat szimulacioja"); printf("\n Munkak szama: "); scanf("%d", &NJ); printf("\n Gepek szama: "); scanf("%d", &NM); printf("\n Celfv sorszam: "); //ellenorzes!!! scanf("%d", &objf_index); //munkak job = (T_JOB*) calloc( NJ, sizeof(T_JOB)); for ( i=0; i 1) { //heurisztikus megoldas printf("\n\n CDS sorrend"); CDS_Alg( job, NJ, NM, s ); Simulation_FS( job, NJ, NM, s, 0 ); //valos 3 gepen Cmax = Evaluation_FS( job, NJ, NM, s, ObjF ); //Print_Machine_Gantt( job, NJ, NM, s); printf("\n Cmax = %ld", Cmax); } if ( NM > 1) { //heurisztikus megoldas int STEP; //lepesek szama int LOOP; //kiterjesztesben vizsgalt szomszedok szama printf("\n\n Kereses "); printf("\n STEP= "); scanf("%d", &STEP); printf("\n LOOP= "); scanf("%d", &LOOP); Search_Alg( job, NJ, NM, s, STEP, LOOP, objf_index ); Simulation_FS( job, NJ, NM, s, 0 ); //valos 3 gepen Evaluation_FS( job, NJ, NM, s, ObjF ); //Print_Machine_Gantt( job, NJ, NM, s); printf("\n ObjF = %lf", ObjF[objf_index]); } //memeoria felszabaditas for( i=0; i job[ s[i]].d ? 1 : 0; ObjF[1] += Ui; //keso munkak szamat Ti = max( 0, Ci - job[ s[i]].d ); //csuszas ObjF[2] += Ti; //keso munkak szamat if ( Ti > ObjF[3] ) ObjF[3] = Ti; } //korabbi hasznalathoz return job[ s[NJ-1] ].EndT[NM-1]; } void Print_Machine_Gantt( T_JOB* job, int NJ, int NM, int* s) { int i, m; printf("\n Eroforras-orientalt Gantt diagram"); for ( m=0; m min( job[ r[j] ].ProcT[m1], job[ r[j] ].ProcT[m2]) ) { //csere temp = r[i]; r[i] = r[j]; r[j] = temp; } //utemterv f = 0; l = NJ-1; for(i=0; i