/*-------------------------------------------------------------------------------- F|permut|max(Ci) Utemezesi fedadat megoldasa véletlenszerűen kereső algoritmus alkalmazásával. Az előző gyakorlaton megírt program bővítése szakaszosan rendelkezésre álló gépek terhelésére szolgáló algortimussal. A Load_STET_to_Cal függvény a cut paraméter értékétől függően a megadott terhelést [st, et] but==0 érték esetén: az adott gép azon rendelkezésre állási intervallumára helyezi, amelyiken megszakitás nelkul elfér. cut==1 érték esetén: megszakitásokkal akár több darabban helyezi el az adott gép rendelkezésre állási időintervallumain. --------------------------------------------------------------------------------*/ #include #include #include typedef struct{ long id, * SetT, * ProcT, * OptT, * StartT, * EndT; }T_JOB; typedef struct{ long ST; //start long ET; //end }T_TW; //time window typedef struct{ int id; int NCal; T_TW* Cal; }T_M; //machine long simulation(int* S, T_JOB* job, int n, int m, long ref_T, T_M* M, int cut); void job_print(int* Sch, T_JOB* job, int n, int m); void sim_data_print(int* Sch, T_JOB* job, int n, int m); void Johnson_ald(int* Sch, T_JOB* job, int n, int x, int y ); void copy(int* s, int* d, int n); void neigbour( int* S_inic, int* S, int n); void random_search(int* S, T_JOB* job, int n, int m, int STEP, int LOOP, T_M* M, int cut); void mach_print(int m, T_M* M); int Load_STET_to_Cal(long *st, long *et, long last, int j, T_M* M, int cut); int Load_STET_to_Cal_do_cut(long *st, long *et, long last, int j, T_M* M, int cut); int main(int argc, char* argv[]) { T_JOB* job; int n; //jobok darabszama int m; //gepek szama int i; //job futoindex int j; //gepek futoindex int * Sch; //utemterv int *r; //rendezes Johnson alg. elott int x, y; //elso masodik Johnson long Cmax; //maximalis befejezesi ido long Cbest; //kereses soran legjobb celfv ertek int *Sch_best; //kereses soran talalt legjobb megoldas T_M* M; //gepek halmaza int c; //szamlalo int cut; //felhasznalo dontese //virtualis adatbazis lekerdeze randomize(); printf("\n Kerem a jobok szamat:"); scanf("%d", &n); //n erteket kap bill-rol printf("\n Kerem a gepek szamat:"); scanf("%d", &m); //m erteket kap bill-rol printf("\n Munkak a gepeken megszakithato (i/n)?:"); if (getch() == 'i' ) cut = 1; else cut = 0; randomize(); M = (T_M*) calloc( m, sizeof(T_M)); for (j=0; j Cmax ) { Cbest = Cmax; for(i=0; i g ) { g_n_best = g; copy(S, S_n_best, n); } }//loop copy( S_n_best, S_inic, n); if (g_best > g_n_best) { g_best = g_n_best; copy( S_n_best, S_best, n); } } //step copy(S_best, S, n); free( S_best); free( S_n_best); free( S_inic); } void neigbour( int* S_inic, int* S, int n) { int d; int temp; copy(S_inic, S, n); d = random(n); if ( d==0 ) { temp = S[n-1]; S[n-1] = S[d]; S[d] = temp; } else { temp = S[d-1]; S[d-1] = S[d]; S[d] = temp; } } void copy(int* s, int* d, int n) { int i; for (i=0; i tj) { temp = r[i]; r[i] = r[j]; r[j] = temp; } } b=0; l=n-1; //korrekcio!!!! for(i=0; i= n) { break; } newst = M[j].Cal[c].ST; newet = newst + size; continue; } } c++; } *st = newst; *et = newet; return found; } int Load_STET_to_Cal_do_cut(long *st, long *et, long last, int j, T_M* M, int cut) { //nem szakithato meg a munka long size; long newst, newet; long fps = -1; //first part start int n, c, found; size = *et-*st; //hossz newst = max ( last, *st); newet = newst + size; found = -1; n = M[j].NCal; c = 0; while( c < n ) { if ( newst < M[j].Cal[c].ET ) { newst = max( newst, M[j].Cal[c].ST ); newet = newst + size; if ( newet <= M[j].Cal[c].ET) { found = c; if ( fps == -1) fps = newst; break; } else { c++; if ( c >= n) { break; } size -= newet-M[j].Cal[c-1].ET; newst = M[j].Cal[c].ST; newet = newst + size; continue; } } c++; } *st = fps; *et = newet; return found; }