/*------------------------------------------------------------------------------- F|perm|max(Ci) Ütemezési fedadat szimulációja. Egyutas előzésnélküli többoperációs termelésütemezési feladat. 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. F2|perm|max(Ci) Ütemezési fedadat megoldása Johnson-algoritmussal. Az algoritmus optimális megoldást eredményez. void Johnson_alg(T_JOB* job, int N, int M, int* sch, int x, int y); F3|perm|max(Ci) feladatra a Johnson-algoritmus kiterjeszthető! Bizonyos feltételek teljesülése esetén a megoldás optimális, egyébként az optimalitás nem garantálható! int Johnson_alg_3gepre(T_JOB* job, int N, int M, int* sch, int x); -------------------------------------------------------------------------------*/ #include #include #include #include typedef struct{ int id; long *ProcT, /*vektorban tarolhato az operaciok ideje*/ *StartT, *EndT; long T, /* tardiness, csuszas */ d; /* due date, hatariido */ }T_JOB; typedef struct{ long Cmax; /*Cmax Completion Time*/ }T_OBJF; void Simulation_FS(T_JOB* job, int N, int M, int* sch, long t); void Evaluation(T_JOB* job, int N, int M, T_OBJF* obj); void print_Machine_Gantt_FS(T_JOB* job, int N, int M, int* sch); void print_Job_Gantt_FS(T_JOB* job, int N, int M, int* sch); void Johnson_alg(T_JOB* job, int N, int M, int* sch, int x, int y); int Johnson_alg_3gepre(T_JOB* job, int N, int M, int* sch, int x); int main(int argc, char* argv[]) { int par; //kiterjeszthetoseg feltetelenek vizsgalata T_JOB* job; //munkak adatai int M; //gepek szama int m; //gepek indexe int* sch; T_OBJF obj; int N; //munkak szama int i; //munkak indexe printf("\n Kerem a munkak szamat:"); scanf("%d", &N); printf("\n Kerem a gepek szamat:"); scanf("%d", &M); randomize(); job = (T_JOB*) calloc( N, sizeof(T_JOB)); for (i=0; iCmax = job[0].EndT[M-1]; for (i=1; i obj->Cmax ) obj->Cmax = job[i].EndT[M-1]; } void Johnson_alg(T_JOB* job, int N, int M, int* sch, int x, int y) { int i, j; int temp; int * r; int f, l; r = (int*) calloc(N, sizeof(int)); for(i=0; i min( job[r[j]].ProcT[x], job[r[j]].ProcT[y] ) ) { temp = r[i]; r[i] = r[j]; r[j] = temp; } f = 0; /* first */ l = N-1; /* last */ for(i=0; i job[i].ProcT[x]) min_0 = job[i].ProcT[x]; if ( max_1 > job[i].ProcT[x+1]) max_1 = job[i].ProcT[x+1]; if ( min_2 > job[i].ProcT[x+2]) min_2 = job[i].ProcT[x+2]; } } if ( min_0 >= max_1 || min_2 >= max_1 ) return 1; else return 0; }