/*-------------------------------------------------------------------------------- F|prmut|Cmax Utemezesi fedadat megoldasa CDS-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 megadott terhelést [st, et] az adott gép azon rendelkezésre állási intervallumára helyezi, amelyiken megszakitás nelkul elfér. Ha egyik intervallumra sem fér rá, akkor az utolsó intervallum befejezési időpontjához igazítottan helyezi el. --------------------------------------------------------------------------------*/ #include #include #include typedef struct{ int jobid; //azonosito long * pt; //muveleti ido, processing time long * st; //kezdesi idopont, start time long * et; //befejezesi idopont, end time } T_JOB; typedef struct{ long ST; long ET; } T_CAL; typedef struct{ int id; int nc; //intervallumok szamat T_CAL* cal; }T_MACH; //elozes nelkuli egyutas modell (permutacios flow shop) //NJ jobok szama, NM gepek szama, s utemterv=jobok sorrendje, job idoadatok int FS_simulation(int NJ, int NM, int* s, T_JOB* job, T_MACH* mach); //Johnson algoritmus 2 gepre A-->B sorrendben //x az "A" gep, y a "B" gep sorszama, NJ jobok szama, NM gepek szama, s utemterv=jobok sorrendje, job idoadatok void Johnson_algorithm( int x, int y, int NJ, int NM, int *s, T_JOB* job ); //szakaszosan rendelkezesre allo gepek terhelesere szolgalo algortimus int load_stet_to_cal(T_MACH* mach, int m, long *st, long *et, long last); int main(int argc, char* argv[]) { T_JOB * job; int NJ = 4; int NM = 5; int* s; //utemterv int* s_best; //lejobb utemterv int i,m,k; long Cmax, Cbest; //----- T_MACH* mach; long st; long et; long last; int found; //----- clrscr(); printf("\n Demo program a CDS Campbell-Dudek-Scmith algoritmus bemutattasara"); printf("\n amely jo kozelito megoldas ad az egyutas elozes nelkuli utemezesi feladatra"); randomize(); //intervallumok generalasa mach = (T_MACH*) calloc(NM, sizeof(T_MACH)); for (m=0; m Cmax ) { Cbest = Cmax; for (i=0; i min( job[r[j]].pt[x], job[r[j]].pt[y]) ) { temp = r[i]; r[i] = r[j]; r[j] = temp; } } e = 0; v = NJ-1; for(i=0; i act_st) //mod { act_st = max(act_st, mach[m].cal[c].ST); //mod act_et = act_st + size; //mod if ( mach[m].cal[c].ET >= act_et ) { found = c; break; } else { c++; if (c>=mach[m].nc) { act_st = mach[m].cal[c-1].ET; act_et = act_st + size; found = c; break; } else { act_st = mach[m].cal[c].ST; act_et = act_st + size; } continue; } } else c++; } *st = act_st; *et = act_et; return found; }