/*------------------------------------------------------------------------------ TIA 2. gyakorlat Egygépes termelésütemezési feladat modellezése és megoldása. Az ütemezés célja a befejezési idők összegének minimalizálása, ezáltal az átlagos készletszint minimalizálása. Az SPT (Shortest Processing Time) műveleti idő szerint nemcsökkenő munkasorrend optimális ütemtervet eredményez. TIA 3. gyakorlat Továbbfejlesztés: Határidős munkák utemezése a legnagyobb késés minimalizálása érdekében. Egygépes termelésiütemezési feladat. Minden munkának saját határideje van. Az ütemezés célja a legnagyobb késés minimalizálása. EDD Earliest Due Date (határidő szerint nemcsökkenő munkasorrend) A megoldás optimális ütemtervet eredményez. TIA 4. gyakorlat Továbbfejlesztés: Bővítés: P||Sum(Ci) Utemezesi fedadat megoldasa MSPT ütemezési szabály alkalmazásával. Párhuzamos gépes termelésütemezési feladat. Az ütemezés célja a munkák befejezési időpontjai összegének minimalizálása, ezáltal az átlagos készletszint minimalizálása. MSPT Modified Shortest Processing Time módosított legrövidebb műveleti idejű munka előre: Alkalmazzuk az SPT szabályt a munkák sorbarendezésére (műveleti idők alapján nemcsökkenő sorrendbe), ezután képezzünk a gépek számának megfelelő hosszú csoportokat. Az első csoport munkái az elsők rendre az egyes gépeken, a második csoport munkái a másodikok rendre az egyes gépeken stb. Feltétel, hogy a munkák és a gépek számának hányadosa (N/M) egész legyen, ezt teljesíthetjük, ha bizonyos számú 0 műveleti idejű fiktív munkát hozzáadunk a rendeléscsoporthoz. A megoldás optimális ütemtervet eredményez. TIA 5. gyakorlat Továbbfejlesztés: P||Cmax ütemezési fedadat megoldása LPT+LIST ütemezési szabály alkalmazásával. Párhuzamos gépes 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. LPT+LIST Alkalmazzuk az LPT szabályt a munkák sorbarendezésére (műveleti idők alapján nemnövekvő sorrendbe), ezután az így kapott sorrendben vesszük a munkákat és mindig a legkorábban felszabaduló gépre ütemezzük a már beütemezettek mögé, ha több gép egyidejűleg szabadul fel, akkor a legkisebb azonosítójút terheljük. A megoldás nem optimális mert a feladat NP-hard, de jó közelítő ütemtervet eredményez. Bővítés: P|di|Lmax ütemezési fedadat megoldása EDD+LIST ütemezési szabály alkalmazásával. Párhuzamos gépes termelésiütemezési feladat. Az ütemezés célja a legnagyobb késés minimalizálása. EDD+LIST Alkalmazzuk az EDD szabályt a munkák sorbarendezésére (határidők alapján nemcsökkenő sorrendbe), ezután az így kapott sorrendben vesszük a munkákat és mindig a legkorábban felszabaduló gépre ütemezzük a már beütemezettek mögé, ha több gép egyidejűleg szabadul fel, akkor a legkisebb azonosítójút terheljük. A megoldás nem optimális mert a feladat NP-hard, de jó közelítő ütemtervet eredményez. -------------------------------------------------------------------------------*/ #include #include #include #define N_OBJF 4 typedef struct { int id; //azonosito long ProcT; //muveleti ido long StartT; //inditasi idopont long EndT; //befejezesi idopont long d; //hatarido long L; //keses } T_JOB; typedef struct { int id; //eroforras azonosito int l; //load: terheles (gephez rendelt munkak szama) long C; //Completion time (mikor szabadul fel a terheles alol) } T_RES; void Simulation( T_JOB* job, int NJ, int* s, long ref_time); void Simulation_P( T_JOB* job, int NJ, T_RES* res, int NR, int** sch, long ref_time); void Evalute( T_JOB* job, int NJ, double* objf); void Print_objf( double* objf); void SPT_rule( T_JOB* job, int NJ, int* s); void LPT_rule( T_JOB* job, int NJ, int* s); void EDD_rule( T_JOB* job, int NJ, int* s); void MSPT_rule( T_JOB* job, int NJ, T_RES* res, int NR, int** sch); void EDD_LPT_LIST_alg( T_JOB* job, int NJ, T_RES* res, int NR, int** sch, int rule); void Print_Sch( T_JOB* job, int NJ, int* s); void Print_Sch_P( T_JOB* job, int NJ, T_RES* res, int NR, int** sch); int main ( ) { time_t t; int NJ; //number of jobs int i; //job index int* s; //utemterv double objf[N_OBJF]; //statikus int NR; //number of resources T_JOB* job; T_RES* res; int** sch; //utemterv matrix int r; //index az eroforrashoz srand( (unsigned) time(&t) ); printf("\n Demo utemeyes egy eroforrasra Csum celfv-vel"); printf("\n Kerem a munkak szamat:"); scanf("%d", &NJ); //nincs ellenorzes printf("\n Eroforrasok (gep) szama:"); scanf("%d", &NR); //nincs ellenorzes job = (T_JOB*) calloc(NJ, sizeof(T_JOB) ); //strukturatomb s = (int*) calloc(NJ, sizeof(int) ); res = (T_RES*) calloc(NR, sizeof(T_RES) ); //strukturavektor sch = (int**) calloc(NR, sizeof(int*) ); //pointervektor for ( r=0; r job[ s[j] ].ProcT ) index = j; if ( index != i ) { //csere temp = s[index]; s[index] = s[i]; s[i] = temp; } } } void LPT_rule( T_JOB* job, int NJ, int* s) { int i,j, index, temp; //inic. for ( i=0; i job[ s[j] ].d ) index = j; if ( index != i ) { //csere temp = s[index]; s[index] = s[i]; s[i] = temp; } } } void Print_Sch( T_JOB* job, int NJ, int* s) { int i; printf("\n id \t Start \t ProcT \t End \t d \t L"); for ( i=0; i