/*------------------------------------------------------------------------------ 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. TIA 8. gyakorlat F3|perm|Cmax ütemezési fedadat megoldása kiterjesztett Johnson-algoritmussal. 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 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 munkacsoport á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 NM-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; //azonosito long* ProcT; //muveleti idok, vector of processing times long* StartT; //keydesi idok, vector of starting times long* EndT; //befejezesi idok, vector of finishing (end) times } T_JOB; /*CodeBlocks long max( long a, long b) { return a > b ? a : b; //felteteles operator //if (a > b) return a; //else return b; } long min( long a, long b) { return a < b ? a : b; //felteteles operator } */ void Simulation_F( T_JOB* job, int NJ, int NM, int* s, long t_ref); void Print_Job_Gantt( T_JOB* job, int NJ, int NM); void Print_Machine_Gantt( T_JOB* job, int NJ, int NM, int* s); long Evaluate( T_JOB* job, int NJ, int NM, int* s); void Johnson_alg( T_JOB* job, int NJ, int m1, int m2, int* s); void Johnson_alg_extension( T_JOB* job, int NJ, int* s); void copy_vector( int* v1, int* v2, int NJ); void CDS_alg( T_JOB* job, int NJ, int NM, int* s); int main(int argc, char* argv[]) { int i; //munka indexe, job int NJ; //munkak szama, number of jobs int m; //gep indexe, muvelet sorszama int NM; //gepek szam, number of machines int* s; //utemterv, schedule T_JOB* job; //jobok listaja, vector of jobs long Cmax; //utolso munka bef. idopontja, maximal completion time printf("\n Flow Shop utemezesi feladat demo."); printf("\n Munkak szama:"); scanf("%d", &NJ); printf("\n Gepek szama:"); scanf("%d", &NM); //Modellepites, Model Building srand( 0 ); //inicializalja a veletlenszam generatort job = (T_JOB*) calloc( NJ, sizeof(T_JOB) ); //mem. foglalas for (i=0; i Bug: StartT helyett EndT job[ s[i] ].StartT[ m ] = job[ s[i-1] ].EndT[ m ]; //az elozo munka befejezodott a gepen } else { //kozbenso gep job[ s[i] ].StartT[ m ] = max( job[ s[i-1] ].EndT[ m ] ,job[ s[i] ].EndT[ m-1 ] ); // elozo munka az adott genen mikor fejezodik be // a munka elozo operacioja mikor fejezodik be } } job[ s[i] ].EndT[ m ] = job[ s[i] ].StartT[ m ] + job[ s[i] ].ProcT[ m ]; //bef. idoponto = kezdesi idopont + muveleti ido } } } void Print_Job_Gantt( T_JOB* job, int NJ, int NM) { int i; //job int m; //gep printf("\n Munka-orinetalt Gantt-diagram:\n"); for( i=0; i