/*------------------------------------------------------------------------------ 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. -------------------------------------------------------------------------------*/ #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); /*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