/*********************************************************************/ /* shc.c: Steepest Hill Climbing */ /* Retunerer antal bytninger. */ /*********************************************************************/ int shc(int schedule[]) { int badcost, bettercost, id, i, j, k, l, ct=0, stop; int swapfrom[NUMSHIFTS+1], swapto[NUMSHIFTS+1], candidate[NUMEMPLOYEES+1]; //Loop BAD_COST fra 10 til 2 for (badcost = 10; badcost >= 2; badcost--) { //permutate(schedule); //Lav en liste SWAP_FROM over alle vagter med cost BAD_COST initarray(swapfrom); for (l = 0; l < NUMSHIFTS; l++) { if (worker[schedule[l]].pref[l] == badcost) { add_element(l, swapfrom); } } //Bland elementerne i SWAP_FROM tilfldigt randomize(swapfrom); //Hvis |SWAP_FROM| > 0 int ssf = count(swapfrom); if (ssf > 0) { //Loop over SWAP_FROM for (i = 0; i < ssf; i++) { stop = 0; //Find id'et ID for medarbejderen p SWAP_FROM* id = schedule[swapfrom[i]]; //Loop BETTER_COST fra 1 til BAD_COST-1 for (bettercost = 1; (bettercost < badcost) && !(stop); bettercost++) { //Lav en liste CANDIDATE over medarbejdere der har vgt BETTER_COST p vagt SWAP_FROM* initarray(candidate); for (l = 0; l < NUMEMPLOYEES; l++) if (worker[l].pref[swapfrom[i]] == bettercost) { add_element(l, candidate); } //Hvis |CANDIDATE| > 0 if (count(candidate) > 0) { //Bland elementerne i CANDIDATE tilfldigt randomize(candidate); //Loop over CANDIDATE int sc = count(candidate); for (j = 0; (j < sc) && !(stop); j++) { //Lav en liste SWAP_TO over vagter CANDIDATE* sider p, som ID har vgt < BAD_COST p initarray(swapto); for (l = 0; l < NUMSHIFTS; l++) //for ikke at overskrive elementer i swapform tilfjes de ikke til swapto. if ((schedule[l] == candidate[j]) && (worker[id].pref[l] < badcost) && (worker[candidate[j]].pref[l] != badcost)) add_element(l, swapto); //Hvis |SWAP_TO| > 0 int sst = count(swapto); if (sst > 0) { //Sorter SWAP_TO min->max efter ID's vgtning pref_sort(id, swapto); //Loop over SWAP_TO for (k = 0; (k < sst) && !(stop); k++) { //Hvis det er lovligt at bytte SWAP_FROM* og SWAP_TO* if ((check_valid_swap(swapfrom[i], swapto[k], schedule))) { //Byt SWAP_FROM* og SWAP_TO* swap_shifts(swapfrom[i], swapto[k], schedule); ct++; //Break helt ud til Loop-SWAP_FROM stop = 1; } } } } } } } } } return ct; }