/*------------------------------------------------------------------------------ TIA 8. gyakorlat F|perm|Cmax ütemezési feladat modellezése. 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 9. 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 10. 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|perm|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 typedef struct { int id; long* ProcT; //pointer: muveleti idok vektorara mutat long* StartT; //pointer: inditasi idopontok vektorara mutat long* EndT; //pointer: befejezesi idopontok vektorara mutat }T_JOB; //munka long max_l( long a, long b) { return a>b ? a : b; } long min_l( long a, long b) { return a sel_value ) { //megjegyzem index = j; value = sel_value; } } if ( index != i ) { //csere temp = v[ index ]; v[ index ] = v[ i ]; v[ i ] = temp; } } //beutemezes first = 0; last = NJ-1; for( i=0; i job[i].ProcT[r] ) pi0_min = job[i].ProcT[r]; if ( pi1_max < job[i].ProcT[r+1] ) pi1_max = job[i].ProcT[r+1]; if ( pi2_min > job[i].ProcT[r+2] ) pi2_min = job[i].ProcT[r+2]; } for( i=0; i= pi1_max || pi2_min >= pi1_max ) return 1; else return 0; } void Dannenbring_F( T_JOB* job, int NJ, int NR, int* s) { //Dannenbring-algoritmus alkalmazasa int i; //munka indexe int r; //gep indexe T_JOB* job_V2; //virtualis ketgepes eset idoadataihoz szukseges //transzformacio ket gepres esetre job_V2 = (T_JOB*) calloc( NJ, sizeof(T_JOB) ); //strukturavektor for ( i=0; i