/*------------------------------------------------------------------------------ TIA 6. gyakorlat F|perm|Cmax Egyutas előzésnélküli többoperációs ütemezési feladat. Cél: A befejezési időpont minimalizálása. 1. rész: Modellépítés és szimuláció. A Simulation_F 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. TIA 7. gyakorlat F2|perm|Cmax ütemezési fedadat megoldása Johnson-algoritmussal. Az algoritmus optimális megoldást eredményez (két gép esetén). TIA 9. gyakorlat F3|perm|Cmax ütemezési fedadat megoldása kiterjesztett Johnson-algoritmussal. A három gépes feladatot két virtuális gépre vezetjük vissza úgy. hogy minden munka esetében az első és a második operáció műveleti idejét összeadjuk, és a második és harmadik operáció műveleti idejét szintén összeadjuk. Az így előállított virtuális kétgépes feladatra alkalmazzuk a Johnson-algoritmust. 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ó! Továbbfejlesztett modell: F|permut|Cmax Dannenbring-módszer lényege az, hogy a tetszőleges számú sorba kapcsolódó gépeket egy virtuális kétgépes modellre vezetjük vissza egy alkalmasan megválasztott súlyozási szisztéma segítségével. Az így előállított virtuális kétgépes feladatra alkalmazzuk a Johnson-algoritmust. TIA 10. gyakorlat F|perm|Cmax Utemezesi fedadat megoldasa kereső algoritmus alkalmazásával. Lokális szomszédsági kereső algoritmus implementálása (egy továbbfejleszthető alap kereső algoritmsu váz). Futási eredmények: A keresési módszer lassabban működik, de jobb eredményt ad mint a korábban vizsgált heurisztikus algoritmusok. -------------------------------------------------------------------------------*/ #include #include #include typedef struct { int id; //azonosito long* ProcT; //pointer mutat a muveleti idok vektorara long* StartT; //pointer mutat a kezdesi idok vektorara long* EndT; //pointer mutat a befejezesi idok vektorara } T_JOB; void Simulation_F( T_JOB* job, int NJ, int NR, int* s, long t0); long Evaluate_F( T_JOB* job, int NJ, int NR, int* s); void Print_Res_Gantt( T_JOB* job, int NJ, int NR, int* s); void Johnson_alg( T_JOB* job, int NJ, int r, int* s); void Johnson_alg_ext_F3( T_JOB* job, int NJ, int r, int* s); void Dannenbring( T_JOB* job, int NJ, int NR, int* s); void copy_sch( int* s1, int* s2, int NJ); void CDS_alg( T_JOB* job, int NJ, int NR, int* s); void Search_alg( T_JOB* job, int NJ, int NR, int* s, int STEP, int LOOP); void Neighbour( int* s_0, int* s_act, int NJ); /*CodeBlocks eseten definialjuk a max fuggvenyt long max(long a, long b) { return a>=b ? a : b; } long min(long a, long b) { return a<=b ? a : b; } */ int main() { T_JOB* job; //mutat a strukturavektorra int NJ; //munkak szama int NR; //eroforrasok (munkahelyek) szama time_t t; int i; //munka index int r; //eroforras index int* s; //utemtervre mutat long Cmax; srand( time(&t)); //inic. printf("\n Flow Shop demo."); printf("\n Munkak szama:"); scanf("%d", &NJ); //ellenorzes nincs printf("\n Eroforrasok szama:"); scanf("%d", &NR); //ellenorzes nincs //Valosagban a technologiai tervbol kiolvashatok a muveleti idok job = (T_JOB*) calloc(NJ, sizeof(T_JOB)); //strukturavektor s = (int*) calloc(NJ, sizeof(int)); //utemterv for ( i=0; i act_val ) { min_index = j; //jelolt megjegyzese min_val = act_val; } } if ( min_index != i ) { //csere temp = v[ i ]; v[ i ] = v[ min_index ]; v[ min_index ] = temp; } } //elokeszites kesz //utmezes first = 0; last = NJ-1; for ( i=0; i Cmax_act ) { copy_sch( s_act, s_best, NJ ); Cmax_best = Cmax_act; } } } //eredmeny copy_sch( s_best, s, NJ ); free( s_act ); free( s_best ); } void copy_sch( int* s1, int* s2, int NJ) { int i; for( i=0; i Cmax_act ) { copy_sch( s_act, s_ext, NJ ); Cmax_ext = Cmax_act; } } } //loop //bazis kivalasztasa //mindig a legjobb szomszed lesz az uj bazis copy_sch( s_ext, s_0, NJ); if ( Cmax_best > Cmax_ext ) { copy_sch( s_ext, s_best, NJ); Cmax_best = Cmax_ext; } } //step //eredmeny copy_sch( s_best, s, NJ ); free( s_0 ); free( s_act ); free( s_ext ); free( s_best ); } void Neighbour( int* s_0, int* s_act, int NJ) { //szomszedsagi operator //veletlenszeruen valasztott cella tartalmat felcsereli az elotte levo cella tartalmazal int x; copy_sch( s_0, s_act, NJ); //masolat x = rand()%NJ; //veletlenszeru valasztas if ( x == 0 ) { //gyuruve alakitjuk a vektort es a 0. baloldalan megjelenik az utolso elem s_act[x] = s_0[NJ-1]; s_act[NJ-1] = s_0[x]; } else { s_act[x] = s_0[x-1]; s_act[x-1] = s_0[x]; } }