/*-------------------------------------------------------------------------------- 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ó algortimus továbbfejlesztésével. A load_stet_to_cal_do_cut függvény a megadott terhelést [st, et] megszakitásokkal akár több darabban helyezi el az adott gép rendelkezésre állási időintervallumain. --------------------------------------------------------------------------------*/ #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, int cut); //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 cut); //szakaszosan rendelkezesre allo gepek terhelesere szolgalo algortimus //abban az esetben ha a munkak megszakithatok int load_stet_to_cal_do_cut(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; //----- int cut; 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"); printf("\n A munkak megszakithatok? (i/n)"); if ( getch() == 'i' || getch() == 'I') cut = 1; else cut = 0; printf("\n %d", cut); 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; } //---------------------------- //a megadott terhelest [st, et] megszakitasokkal akar tobb darabban helyezi el int load_stet_to_cal_do_cut(T_MACH* mach, int m, long *st, long *et, long last) { int found = -1; int c; long size; long act_st; long act_et; long scheduled_size; long scheduled_num = 1; long first_part_start; long last_part_stop; act_st = *st; act_et = *et; size = act_et - act_st; act_st = max( act_st, last); act_et = act_st + size; c=0; while ( c < mach[m].nc ) { //if ( mach[m].cal[c].ST <= act_st) if ( mach[m].cal[c].ET > act_st) //mod { act_st = max(act_st, mach[m].cal[c].ST); //mod if ( scheduled_num == 1 ) first_part_start = act_st; act_et = act_st + size; //mod if ( mach[m].cal[c].ET >= act_et ) { found = c; last_part_stop = act_et; break; } else { c++; if (c>=mach[m].nc) { //act_st = mach[m].cal[c-1].ST; //act_et = act_st + size; last_part_stop = act_et; found = c; break; } else { scheduled_size = mach[m].cal[c-1].ET - act_st; scheduled_num++; act_st = mach[m].cal[c].ST; size = size - scheduled_size; act_et = act_st + size; } continue; } } else c++; } *st = first_part_start; *et = last_part_stop; return found; }