All pastes #1426355 Raw Edit

Stuff

public text v1 · immutable
#1426355 ·published 2009-05-18 12:26 UTC
rendered paste body
/*********************************************************************/
/* 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;
}