13c. Robotvoorbeeld

2021-03-22
slides.com/jod/pt_13c

Docent: Jo Devriendt

Assistent: Ann Philips

Coördinator: Joost Vennekens

voornaam.achternaam@kuleuven.be

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Gegeven een N x N rooster, bereken een pad voor een robot van het vakje linksboven naar rechtsonder dat niet door muurtjes # gaat, en dat een minimale afstand heeft (gedefinieerd als de som van de getallen op de vakjes op het pad) ten opzichte van alle andere paden

1 1 1 1 1
5 # # # 1
1 2 1 1 1
1 3 10 # #
1 15 1 1 1
  • Kandidaten: sequenties van vakjes, beginnend linksboven en eindigend rechtsonder
    • mogen voorbij de randen of muren gaan
    • mogen in cirkels lopen
    • maximale lengte N^2
  • Oplossingen: opeenvolgingen van vakjes die niet door randen of muren gaan
  • Optimaliteit: oplossing met de kortste totale afstand

Robot

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

typedef struct {
  int x;
  int y;
  int waarde;
} Vakje;

int main() {
  int a[N][N] = {
      {1, 1, 1, 1, 1},        
      {5, MUUR, MUUR, MUUR, 1}, 
      {1, 2, 1, 1, 1},
      {1, 3, 10, MUUR, MUUR}, 
      {1, 15, 1, 1, 1},
  };

  int lengte = 1;
  Vakje pad[N*N];
  pad[0].x = 0;
  pad[0].y = 0;
  pad[0].waarde = a[0][0];

  zoek(a, pad, lengte);
  printPad(bestePad, besteLengte);
}

Kandidaat

Vormen samen de kandidaat

Initialisatie met beginvakje

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

void zoek(int a[N][N], Vakje pad[MAX], int lengte) {
  if (!test(a, pad, lengte)) {
    return;
  }
  if (isCompleet(pad, lengte)) {
    printPad(pad, lengte);
    registreer(pad, lengte);
    return;
  }
  for(int i=0; i<aantalUitbreidingen(pad, &lengte); ++i){
    maakVolgendeUitbreiding(a, pad, &lengte, i);
    zoek(a, pad, lengte);
    backtrack(pad, &lengte);
  }
}

zoek

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

int isCompleet(Vakje pad[MAX], int lengte) {
  return pad[lengte - 1].x == N - 1 && 
         pad[lengte - 1].y == N - 1;
}

int aantalUitbreidingen(Vakje pad[MAX], int* lengte){
  return 4; 
}

void backtrack(Vakje pad[MAX], int* lengte) {
  *lengte = *lengte - 1;
}

isCompleet,
aantalUitbreidingen,
backtrack

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

void maakVolgendeUitbreiding(int a[N][N], 
     Vakje pad[MAX], int* lengte, int buur) {
  int n = *lengte;
  *lengte = n + 1;
  pad[n] = pad[n - 1];
  if (buur == 0) {
    pad[n].x -= 1; // links
  } else if (buur == 1) {
    pad[n].y -= 1; // boven
  } else if (buur == 2) {
    pad[n].x += 1; // rechts
  } else if (buur == 3) {
    pad[n].y += 1; // onder
  }
  if(pad[n].x>=0 && pad[n].x<N && 
     pad[n].y>=0 && pad[n].y<N){
    pad[n].waarde = a[pad[n].x][pad[n].y];
  }
}

maakVolgendeUitbreiding

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

// globale variabelen die beste oplossing bijhouden
int besteAfstand = MAXAFSTAND;
int besteLengte = 0;
Vakje bestePad[N*N];

void registreer(Vakje pad[MAX], int lengte) {
  besteAfstand = totaleAfstand(pad, lengte);
  besteLengte = lengte;
  for (int i = 0; i < lengte; ++i) {
    bestePad[i] = pad[i];
  }
}

registreer

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

int test(int a[N][N], Vakje pad[MAX], int lengte) {
  if (lengte >= N*N) {
    return 0;
  }
  for (int i = 0; i < lengte; ++i) {
    Vakje p = pad[i];
    if (p.x < 0 || p.x >= N || p.y < 0 || p.y >= N || 
        a[p.x][p.y] == MUUR) {
      return 0;
    }
  }
  if (totaleAfstand(pad, lengte) >= besteAfstand) {
    return 0;
  }
  return 1;
}

test

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Demo

Volledige code op pastebin.com/bh5HWEGj

  1   1   1   1   1 
  5   #   #   #   1 
  1   2   1   1   1 
  1   3  10   #   # 
  1  15   1   1   1 
lengte: 23
afstand: 69
  +                 
  +                 
  +                 
  +                 
  +   +   +   +   + 

...
...

lengte: 9
afstand: 23
  +                 
  +                 
  +   +   +         
          +         
          +   +   + 
lengte: 13
afstand: 22
  +   +   +   +   + 
                  + 
          +   +   + 
          +         
          +   +   +

Output:

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

  • Implementeer NQueens volgens de aanpak voorgesteld in deze presentaties
  • Vergelijk met oplossing uit hst 13.2. Wat zijn de gelijkenissen? Verschillen?
  • Oefeningen uit hst 13.3

Oefeningen

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Samenvatting

  • Backtrackalgoritme toegepast in complexere Robot setting
  • Rekening gehouden met optimalisatiecriterium

13c. Robotvoorbeeld

By Jo Devriendt

13c. Robotvoorbeeld

  • 690