/*------------------------------------------------------------------------------ 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. 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. Tovabbfejlesztes: 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. -------------------------------------------------------------------------------*/ #include #include #include #define N_OBJF 4 typedef struct { int id; long ProcT; //muveleti ido long StartT; //inditasi idopont long EndT; //befejezesi idopont long d; //hatarido long L; //keses } T_JOB; typedef struct { int id; int l; //load, terheles (a gephez rendelt munkak szama) } T_RES; void Simulate( T_JOB* job, int NJ, int* s, long t_ref); void Simulate_P( T_JOB* job, int NJ, T_RES* res, int NR, int** sch, long t_ref); 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 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 Print_s( 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() { int NJ; //munkak szama T_JOB* job; //munkak adatait int i; int* s; //utemterv double objf[N_OBJF]; time_t t; int NR; //eroforrasok szama T_RES* res; //eroforrasok int** sch; //utemezes matrixa int r; //eroforras index srand( time(&t) ); //veletlenszam generator inic. printf("\n Kerem a munkak szamat:"); scanf("%d", &NJ); //vedelem nincs printf("\n Eroforrasok szama:"); scanf("%d", &NR); //ellenorzes nincs job = (T_JOB*) calloc(NJ, sizeof(T_JOB) ); //strukturavektor 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 Lmax ) Lmax = job[i].L; Csum += job[i].EndT; if ( Cmax < job[i].EndT ) Cmax = job[i].EndT; } WIP = Csum / Cmax; objf[0] = Cmax; objf[1] = Csum; objf[2] = WIP; objf[3] = Lmax; } void Print_objf(double* objf) { printf("\n Cmax = %lf", objf[0]); printf("\n Csum = %lf", objf[1]); printf("\n WIP = %lf", objf[2]); printf("\n Lmax = %lf", objf[3]); } void SPT_rule( T_JOB* job, int NJ, int* s) { int i, j, temp, index; for( i=0; i