/* F|perm|Cmax ütemezési feladat heurisztikus megoldasa. Egyutas előzésnélküli, többoperációs termelésütemezési feladat. Szimuláció. A Simulation_FS 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. Speciális eset: F2|perm|Cmax Ütemezési fedadat megoldása Johnson-algoritmussal. A Johnson_alg fv optimális megoldást eredményez (két gép esetében). Továbbfejlesztett modell: F|permut|max(Ci) Utemezesi fedadat megoldasa véletlenszerűen kereső algoritmus alkalmazásával. Lokális kereső algoritmus demo. */ #include #include #define NObjF 1 typedef struct { int id; //azonosito long* ProcT; //muveleti idok long* StartT; //muvelet inditas long* EndT; //muvelet befejezese } T_JOB; //type of job void Simulation_FS(T_JOB* job, int NJ, int NM, int* s, long t_ref); void Print_Job_Gantt(T_JOB* job, int NJ, int NM, int* s); void Evaluation(T_JOB* job, int NJ, int NM, int* s, double* ObjF); void Print_ObjF(double* ObjF); void Johnson_alg(T_JOB* job, int NJ, int NM, int* s, int m1, int m2); int Search(T_JOB* job, int NJ, int NM, int* s, long t_ref, int LOOP, int STEP, int key ); void copy_sch(int* s, int* t, int NJ ); void Neighbour( int* s0, int* sk, int NJ ); int main(int argc, char* argv[]) { int NJ; //number of jobs, munkak szama int NM; //number of machine, gepek szama int i, m; //futoindex T_JOB* job; //munkak adatai int* sch; //schedule, utemterv long t_ref; //folyamat inditasanak idopontja double* ObjF; //objective function, celfuggveny int STEP, LOOP; //kereses parameterei int bs; ObjF = (double*) calloc(NObjF, sizeof(double) ); //vektor randomize(); printf("\n F|perm|Cmax utemezesi feladat demo!"); printf("\n Munkak szama:"); scanf("%d", &NJ); printf("\n Gepek szama:"); scanf("%d", &NM); printf("\n Inditas idopontja: (pl. 5)"); scanf("%ld", &t_ref); //Modellepeites job = (T_JOB*) calloc(NJ, sizeof(T_JOB) ); //strukturavektor for( i=0; i= 2 ) { printf("\n Johnson sorrend a 0. es 1. gepre alapozva:"); Johnson_alg(job, NJ, NM, sch, 0, 1); Simulation_FS(job, NJ, NM, sch, t_ref); //Print_Job_Gantt(job, NJ, NM, sch); Evaluation(job, NJ, NM, sch, ObjF); Print_ObjF(ObjF); } */ getch(); printf("\n Kereso algoritmus demo"); printf("\n STEP = "); scanf("%d", &STEP); printf("\n LOOP = "); scanf("%d", &LOOP); bs = Search( job, NJ, NM, sch, t_ref, LOOP, STEP, 0 ); Simulation_FS(job, NJ, NM, sch, t_ref); //Print_Job_Gantt(job, NJ, NM, sch); Evaluation(job, NJ, NM, sch, ObjF); Print_ObjF(ObjF); printf("\n Legjobb lepes: %d", bs); getch(); //memoria felszabaditas for( i=0; i min( job[ r[j] ].ProcT[m1], job[ r[j] ].ProcT[m2] ) ) { //csere temp = r[i]; r[i] = r[j]; r[j] = temp; } //utemezes first = 0; last = NJ-1; for( i=0; i ObjF_sk ) { //jobb megoldas mint a legjobb szomszed copy_sch(sk, s_ext, NJ); //megoldas megjegyzese ObjF_s_ext = ObjF_sk; //celfv megjegyzesa } } //bazismedolgas frissitese a kiterjesztes vegen copy_sch(s_ext, s0, NJ); if ( ObjF_s_best > ObjF_s_ext ) { //jobb megoldas mint az eddiggi legjobb copy_sch(s_ext, s_best, NJ); //megoldas megjegyzese ObjF_s_best = ObjF_s_ext; //celfv megjegyzesa Best_Step = step; //lepes sorszama } } //legjobb visszaadasa copy_sch( s_best, s, NJ); free( ObjF ); free( s0 ); free( sk ); free( s_ext ); free( s_best ); return Best_Step; } void copy_sch(int* s, int* t, int NJ ) { int i; for( i=0; i