Testköra min A* algoritm - Vad tycker ni?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

Testköra min A* algoritm - Vad tycker ni?

Inlägg av DanielM »

Hej!

Jag behöver någon som kan köra min A* algoritm. Jag har läst mig på hur A* fungerar.
Om ni inte vet vad A* är så är det en sökalgoritm för koordinater. Du börjar på en position och sedan söker du den kortaste vägen till din slutdestination.
Sélection_029.png
Här är C-koden. Orsaken varför jag vänder mig till er har mycket med att det är bättre om flera testar än bara jag testar. Kom ihop att indexeringen är från 0 när man bestämmer koordinaterna. Kom också ihåg att -1 är väggar och där kan ni inte placera era koordinater.

Frågor som ni ställer:
Vad kan vi använda A* till?

Svar:
A* används mycket inom navigering. T.ex. om ni har en radiostyrd bil som ni vill att den ska köra själv. Då kan ni hitta en sökväg för er så kallade framtida robot. Jag har även utvecklat Adaptive Model Predictive Control i rent C, utan att fuskat med malloc, calloc eller recalloc. Model Predictive Control används mycket inom Telsa-bilarna för att hitta den mest optimala körstilen för framtid navigering av fordonet. Notera att Model Predictive Control är olinjär reglering då den tar hänsyn till begränsningar.

Innehåller:
  • Eliminerar duplicerade vägar t.ex. om algoritmen hoppar fram och tillbaka, och sedan går den till mål. Rätt öndigt att hoppa fram och tillbaka
  • Sick-sack. Bättre att gå en rak fin väg
  • L2-Norm för bästa sökning
  • L1-Norm för bästa sökning

Kod: Markera allt

/*
 ============================================================================
 Name        : Astar.c
 Author      : Daniel
 Version     : 1.0
 Copyright   : MIT
 Description : A* algorithm
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <time.h>

#define height_map 15
#define width_map 10

void print_int(int* A, int row, int column) {
   for (int i = 0; i < row; i++) {
      for (int j = 0; j < column; j++) {
         printf("%d\t", *(A++));
      }
      printf("\n");
   }
   printf("\n");
}

static void heuristic_map(int *map, int x_stop, int y_stop, int height, int width, int norm_mode);

/*
 * This is A* algorithm. An AI-algorithm in other words.
 * It find the optimal(at least try too) path from your source to your destination.
 * See working example how to use.
 * I wrote this C code because I don't like calloc, malloc and recalloc in embedded.
 */
void Astar(int *map, int *path_x, int *path_y, int x_start, int y_start, int x_stop, int y_stop, int height, int width, int norm_mode, int* steps) {
   // Clear first our path
   memset(path_x, -1, height * width * sizeof(int));
   memset(path_y, -1, height * width * sizeof(int));

   // Create map with L2-norm
   heuristic_map(map, x_stop, y_stop, height, width, norm_mode);

   // Set some initial parameters
   int direction[4];
   const int x_directions[4] = { -1, 1, 0, 0 };
   const int y_directions[4] = { 0, 0, -1, 1 };
   int position = 0;
   int minValue = 0;
   int x = x_start;
   int y = y_start;

   //printf("Current start coordinate: x = %d, y = %d\n", x, y);

   for (int k = 0; k < height * width; k++) {
      // Look to the left, right, up and down
      for (int index = 0; index < 4; index++)
         direction[index] = *(map + (y + y_directions[index]) * width + x + x_directions[index]);

      // Take the decision where to go by looking at direction array
      minValue = direction[0];
      position = 0;
      for (int index = 0; index < 4; index++) {
         // If our minimal value is -1, change it
         if (minValue == -1) {
            minValue = direction[index];
            position = index;
         } else {
            // Check if we have found the smallest number now
            if (direction[index] != -1 && direction[index] < minValue) {
               minValue = direction[index];
               position = index;
            }
         }
      }
      // Prevent repeating by increasing the weights
      *(map + y * width + x) += *(map + y * width + x);

      // Save path
      *(path_x + k) = x;
      *(path_y + k) = y;

      // Where to go - position variable tells
      if (position == 0) x--; // Go one step left
      if (position == 1) x++; // Go one step right
      if (position == 2) y--; // Go one step up
      if (position == 3) y++; // Go one step down

      // Check if we are at our goal
      if (*(map + y * width + x) == 0) {
         *(path_x + k + 1) = x;
         *(path_y + k + 1) = y;
         break;
      }

   }
   //printf("Current goal coordinate: x = %d, y = %d\n", x, y);

   // Filter the path_x and path_y from duplicates
   for (int i = 0; i < height * width; i++) {
      position = 0;
      x = *(path_x + i);
      y = *(path_y + i);
      if (x != -1 && y != -1) {
         // Search for the last same x and y in path_x and path_y
         for (int j = i + 1; j < height * width; j++) {
            if (x == *(path_x + j) && y == *(path_y + j)) {
               position = j; // Remember this position
            }
         }
         // If we got duplicates - delete them
         if (position > 0) {
            memset(path_x + i, -1, (position - i) * sizeof(int));
            memset(path_y + i, -1, (position - i) * sizeof(int));
            i = position; // Jump
         }
      } else {
         //printf("Break at %i\n", i);
         position = i; // Remember that too
         break; // The rest is just -1's
      }
   }

   // Pack path_x and path_y together now
   for (int i = 0; i < position; i++) {
      // If we have a deleted coordinate
      if (*(path_x + i) == -1 && *(path_y + i) == -1) {
         // Move them up
         for (int j = i; j < height * width; j++) {
            if (*(path_x + j) != -1 && *(path_y + j) != -1) {
               *(path_x + i) = *(path_x + j);
               *(path_x + j) = -1;
               *(path_y + i) = *(path_y + j);
               *(path_y + j) = -1;
               break;
            }
         }
      }
   }

   // Filter the path_x and path_y from zigzag
   for (int i = 0; i < height * width; i++) {
      position = 0;
      x = *(path_x + i);
      y = *(path_y + i);
      if (x != -1 && y != -1) {
         // Search for a jump
         for (int index = 0; index < 4; index++) {
            for (int j = i + 1; j < height * width; j++) {
               if (x + x_directions[index] == *(path_x + j) && y + y_directions[index] == *(path_y + j)) {
                  if (j > position)
                     position = j; // We want to have the largest "gap", which is the zigzag
               }
            }
            // If we got zigzag. We need to have + 1 because we cannot accept a neighbor step as zigzag
            if (position > i + 1) {
               memset(path_x + i + 1, -1, (position - i - 1) * sizeof(int));
               memset(path_y + i + 1, -1, (position - i - 1) * sizeof(int));
               i = position; // Jump
            }
         }

      } else {
         //printf("Break at %i\n", i);
         position = i; // Remember that too
         break; // The rest is just -1's
      }
   }

   // Pack path_x and path_y together again
   for (int i = 0; i < position; i++) {
      // If we have a deleted coordinate
      if (*(path_x + i) == -1 && *(path_y + i) == -1) {
         // Move them up
         for (int j = i; j < height * width; j++) {
            if (*(path_x + j) != -1 && *(path_y + j) != -1) {
               *(path_x + i) = *(path_x + j);
               *(path_x + j) = -1;
               *(path_y + i) = *(path_y + j);
               *(path_y + j) = -1;
               break;
            }
         }
      }
   }

   // How many steps have we done
   //printf("position is = %d\n", position);
   *steps = position;

   //printf("Done\n");
}

// norm_mode = 2 -> L2 norm
// norm_mode = 1 -> L1 norm
static void heuristic_map(int *map, int x_stop, int y_stop, int height, int width, int norm_mode) {
   for (int i = 0; i < width; i++) {
      for (int j = 0; j < height; j++) {
         if (*(map + j * width + i) != -1) {
            int dx = (j + x_stop) - (j + i);    // Distance we want to go in x-axis
            int dy = (y_stop + i) - (j + i);     // Distance we want to go in y-axis
            if (norm_mode == 1)
               *(map + j * width + i) = abs(dx) + abs(dy); // L1-Norm
            if (norm_mode == 2)
               *(map + j * width + i) = dx * dx + dy * dy; // L2-Norm (without square root, not needed due to integers)
            // You can add more heuristic here!
         }
      }
   }
}

void show_path(int* map, int* path_x, int* path_y, int height, int width){
   for(int k = 0; k < height*width; k++){
      int x = *(path_x + k);
      int y = *(path_y + k);
      if(x != -1 && y != -1)
         *(map + y*width + x) = -100 - k;
   }
   print_int(map, height, width);
}

int main() {

   // Beginning coordinates
   int x_start = 1;
   int y_start = 8;

   // End coordinates
   int x_stop = 8;
   int y_stop = 8;

   // Path - Our goal is to find them
   int path_x[height_map * width_map];
   int path_y[height_map * width_map];

   // Norm modes
   int norm1 = 1; // L1-Norm
   int norm2 = 2; // L2-Norm

   // Steps
   int steps1 = 0;
   int steps2 = 0;

   // Map size
   int map[height_map*width_map] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
                            -1, -1,  0,  0,  0,  0,  0,  0,  0, -1,
                            -1, -1,  0, -1, -1, -1, -1, -1,  0, -1,
                            -1, -1,  0, -1,  0,  0,  0, -1,  0, -1,
                            -1, -1,  0, -1,  0, -1,  0, -1,  0, -1,
                            -1, -1,  0, -1,  0, -1,  0, -1,  0, -1,
                            -1, -1,  0, -1,  0, -1,  0, -1,  0, -1,
                            -1,  0,  0,  0,  0, -1,  0, -1,  0, -1,
                            -1, -1, -1, -1, -1, -1,  0, -1,  0, -1,
                            -1, -1,  0,  0,  0,  0,  0, -1,  0, -1,
                            -1, -1,  0,  0, -1, -1, -1, -1,  0, -1,
                            -1, -1,  0,  0,  0,  0,  0,  0,  0, -1,
                            -1, -1, -1, -1, -1,  0, -1, -1,  0, -1,
                            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};

   // Print the map
   printf("Initial map\n");
   print_int(map, height_map, width_map);

   // Compute the "shortest" path
   printf("Compute the coordinates\n");
   clock_t start, end;
   float cpu_time_used;
   start = clock();

   // First compute with L1-Norm and check the steps
   Astar(map, path_x, path_y, x_start, y_start, x_stop, y_stop, height_map, width_map, norm1, &steps1);
   // Then compute with L2-norm and check the steps
   Astar(map, path_x, path_y, x_start, y_start, x_stop, y_stop, height_map, width_map, norm2, &steps2);
   // Check the steps now - Which of the norms results less steps
   if(steps2 > steps1){
      Astar(map, path_x, path_y, x_start, y_start, x_stop, y_stop, height_map, width_map, norm1, &steps1); // Get the path again
      printf("Shortest step is = %d\n", steps1);
   }else{
      printf("Shortest step is = %d\n", steps2);
   }

   end = clock();
   cpu_time_used = ((float) (end - start)) / CLOCKS_PER_SEC;
   printf("\nTotal speed  was %f,", cpu_time_used);

   // Show the path
   printf("\nComputed map\n");
   show_path(map, path_x, path_y, height_map, width_map);

   // Show the path
   for (int i = 0; i < height_map * width_map; i++)
      printf("x = %d, y = %d\n", path_x[i], path_y[i]);


   return 0;
}
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av DanielM 27 februari 2020, 13:51:26, redigerad totalt 11 gånger.
guckrum
Inlägg: 1686
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Testköra min A* algoritm - Vad tycker ni?

Inlägg av guckrum »

Du kan ju annars jämföra med andra öppna implementationer av algoritmen och se om de gör samma sak. Och tänk på att bara för att det fungerar för ett test betyder det inte att implementationen är rätt:-)
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

Re: Testköra min A* algoritm - Vad tycker ni?

Inlägg av DanielM »

Tack för svar!

Jag har faktiskt inte hittat så "bra" A* algoritmer för inbyggda system. Det finns en här som gör exakt samma sak
https://rosettacode.org/wiki/A*_search_algorithm#C

Men den innehåler malloc, calloc och recalloc, samt koden verkar vara rätt så komplex.
Jag har testat denna algoritm och den gör exakt samma sak som min algoritm gör.

Notera att A* bygger på estimat. Desto bättre estimat man har, desto mindre felaktigare blir algoritmen.
Men detta estimatet(längden från nuvarande position till destinationen) går inte räkna på, utan man helt enkelt gissar. Detta betyder att A* från RosettaCode behöver inte ge exakt samma resultat som min gör, trots att dom är lika optimala. Jag kanske tar höger, medan den andra algoritmen tar vänster, trots att dom är lika optimala.

Min gör följande seg:
1. Skapa vikterna - Estimatet med andra ord
2. Räkna ut sökvägen som har minst värde
3. Filtrera bort dåliga vägar - Sätt dom till -1
4. Packa ihop så sökvägen blir homogen för läsarens skull

Här kan vi se att min algoritm ej verkar hitta det mest optimala alla gånger. Detta är normalt, på grund utav estimatet. Jag vill inte göra algoritmen så komplex. Jag skulle kunna göra så algoritmen undviker sick-sack. Har ni några förslag?
Sélection_031.png
Här är ett exempel också. Vad tror ni om att om jag kommer från(höger) -110 och ställer mig på -111. Då ska jag titta uppåt, nedåt och vänster. Då plussar jag jag på +1 i varje riktning och kollar vart jag hamnar någonstans. Hamnar jag på -1 så gör jag inget. Hamnar jag på -112 och jag hamnar på -118 så kollar jag om -118 ligger närmre i listan mot mitt mål, jämfört med -112. Vilket det där. Då tar jag en genväg istället? Vad tror ni om detta?
Sélection_031.png
Koordinaterna är följande

Kod: Markera allt

x = 8, y = 13
x = 8, y = 12
x = 8, y = 11
x = 7, y = 11
x = 6, y = 11
x = 6, y = 10
x = 5, y = 10
x = 5, y = 11
x = 5, y = 12
x = 5, y = 13
x = 4, y = 13 <--- Här är -110
x = 3, y = 13 <--- Här är -111
x = 3, y = 12
x = 3, y = 11
x = 3, y = 10
x = 2, y = 10
x = 2, y = 11
x = 2, y = 12
x = 2, y = 13 <-- Här är -118
x = 1, y = 13
x = 1, y = 12
x = 1, y = 11
x = 1, y = 10
x = 1, y = 9
x = 1, y = 8
x = 2, y = 8
x = 3, y = 8
x = 4, y = 8
x = 5, y = 8
x = 6, y = 8
x = 7, y = 8
x = 8, y = 8
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
guckrum
Inlägg: 1686
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Testköra min A* algoritm - Vad tycker ni?

Inlägg av guckrum »

För "bra" heuristik är A* optimal, dvs den kommer att returnera den kortaste vägen. Om det finns flera vägar med samma kostnad kan det däremot bli olika svar. Fundera över vad som händer om du sätter estimatet till noll!
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

Re: Testköra min A* algoritm - Vad tycker ni?

Inlägg av DanielM »

Nu har jag ett "standardestimat" på min A*, dvs att jag skapar min mapp igenom denna C-kod. Testa kör den. Då kommer du se hur vikterna sätts. Det är enkel pythagoras sats bara.

Kod: Markera allt

// Compute weights
for (int i = 0; i < width; i++) {
	for (int j = 0; j < height; j++) {
		if (*(map + j * width + i) != -1) {
			int dot1 = (j + i); // Here we stand
			int dot2 = (j + x_stop); // Here we want to go in x-axis
			int dot3 = (y_stop + i); // Here we want to go in y-axis
			// Do pythagoras theorem c*c = a*a + b*b, but don't use square root here
			*(map + j * width + i) = (dot2 - dot1) * (dot2 - dot1) + (dot3 - dot1) * (dot3 - dot1);
		}
	}
}

Nu har jag hittat en ytterligare metod som löser problemen:
  • Duplicering - Om vägen "bollar" fram och tillbaka och sedan vandrar iväg mot mål. Rätt onödigt att ha denna "hopp" fram och tillbaka
  • Sick-Sack vägar är eliminerade nu
Om jag kör min main() nu

Kod: Markera allt

int main() {

	// Beginning coordinates
	int x_start = 8;
	int y_start = 13;

	// End coordinates
	int x_stop = 8;
	int y_stop = 8;

	// Path - Our goal is to find them
	int path_x[height_map*width_map];
	int path_y[height_map*width_map];
	memset(path_x, -1, height_map*width_map*sizeof(int));
	memset(path_y, -1, height_map*width_map*sizeof(int));

	// Map size
	int map[height_map*width_map] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
					 -1,  0,  0,  0,  0,  0,  0,  0,  0, -1,
					 -1,  0,  0,  0,  0,  0,  0,  0,  0, -1,
					 -1,  0,  0,  0, -1, -1, -1,  0,  0, -1,
					 -1,  0,  0,  0,  0,  0, -1,  0,  0, -1,
					 -1,  -1,  0, -1,  0,  0, -1,-1, -1, -1,
					 -1,  -1,  0, -1,  0,  0, 0,  0,  0, -1,
					 -1,  0,  0, -1, -1, -1, -1,  0,  0, -1,
					 -1,  0,  0,  0,  0,  0,  0,  0,  0, -1,
					 -1,  0, -1, -1, -1, -1, -1, -1, -1, -1,
					 -1,  0,  0,  0, -1,  0,  0, -1,  0, -1,
					 -1,  0,  0,  0, -1,  0,  0,  0,  0, -1,
					 -1,  0,  0,  0, -1,  0,  0,  0,  0, -1,
					 -1,  0,  0,  0,  0,  0, -1, -1,  0, -1,
					 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};


	// Print the map
	printf("Initial map\n");
	print(map, height_map, width_map);

	// Compute the "shortest" path
	printf("Compute the coordinates\n");
	Astar(map, path_x, path_y, x_start, y_start, x_stop, y_stop, height_map, width_map);

	// Show the path
	printf("\nComputed map\n");
	show_path(map, path_x, path_y, height_map, width_map);

	// Show the path
	for(int i = 0; i < height_map*width_map; i++)
		printf("x = %d, y = %d\n", path_x[i] , path_y[i]);

	return EXIT_SUCCESS;
}
Då kan vi se denna bild
Sélection_031.png
Även jämför jag med den gamla bilden ovan
Sélection_034.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av DanielM 23 februari 2020, 22:31:15, redigerad totalt 1 gång.
Användarvisningsbild
adent
Inlägg: 4100
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Testköra min A* algoritm - Vad tycker ni?

Inlägg av adent »

Jag provimplementerade A* utifrån beskrivningen på wikipedia. Fick den att funka fint. Körde heurestik med fågelvägen (pythagoras sats). Skrev koden i C.
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

Re: Testköra min A* algoritm - Vad tycker ni?

Inlägg av DanielM »

Kan du visa den :) Det vore kul att se hur du har löst problemet. Jag kanske kan lära mig något av det.
guckrum
Inlägg: 1686
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Testköra min A* algoritm - Vad tycker ni?

Inlägg av guckrum »

A* hittar den optimala lösningen, när den existerar. (Det kan finnas flera lösningar med samma kostnad som alla är lika optimala.)
Får din lösning och din referens samma kostnad på den optimala vägen? Om inte är någonting fel.
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

Re: Testköra min A* algoritm - Vad tycker ni?

Inlägg av DanielM »

Allt beror på.

Min algoritm hittar oftast den optimala vägen, men ibland kan det hända att den inte gör det. Allt detta bygger på ekvationen
\(g(x) + h(x)\)
Där \(g(x)\) bygger på hur långt ifrån vi är från våran startpunkt och \(h(x)\) bygger på hur långt ifrån vi är vårat mål.

Sätter jag ut \(g(x) + h(x)\) själv, så hittar min algoritm alltid rätt. Låter jag datorn sätta ut \(g(x) + h(x)\) så blir det ibland fel. Men den hittar alltid till mål :tumupp:
Det egentliga som är viktiga här är att den hittar i mål snabbt! A* brukar vara en rätt trög algoritm som jag har hört. Kör min på ca 0.02 millisekunder om det är en klurig karta att beräkna. Nu sitter jag på en gammal billig dator från 2008 också. Så skulle jag sitta på en modern dator, så hade det säkert gått snabbare.
guckrum
Inlägg: 1686
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Testköra min A* algoritm - Vad tycker ni?

Inlägg av guckrum »

Min algoritm hittar oftast den optimala vägen, men ibland kan det hända att den inte gör det.
Din implementation av en algoritm som garanterat hittar den optimala vägen hittar den optimala vägen "oftast". Tror du att det är rätt?

Du fick en ledtråd innan, att sätta heuristiken till noll. Gör du det får du Dijkstras klassiska algoritm som också hittar den optimala vägen.

Fundera på om du inte skall testa lite mera.
Användarvisningsbild
PeterH
Inlägg: 8614
Blev medlem: 15 mars 2006, 15:57:10
Ort: Gävle/Valbo

Re: Testköra min A* algoritm - Vad tycker ni?

Inlägg av PeterH »

AlBundy som är tillbaka? :humm:
DanielM
Inlägg: 2189
Blev medlem: 5 september 2019, 14:19:58

Re: Testköra min A* algoritm - Vad tycker ni?

Inlägg av DanielM »

guckrum skrev:
Min algoritm hittar oftast den optimala vägen, men ibland kan det hända att den inte gör det.
Din implementation av en algoritm som garanterat hittar den optimala vägen hittar den optimala vägen "oftast". Tror du att det är rätt?

Du fick en ledtråd innan, att sätta heuristiken till noll. Gör du det får du Dijkstras klassiska algoritm som också hittar den optimala vägen.

Fundera på om du inte skall testa lite mera.
Om du har en karta med väggar -1. Du har en begynnelsekoordinat och en slutdestinationskoordinat.

Hur skulle du förändra denna karta igenom att sätta ut viktvärden? För det är så A* fungerar. Den söker lägsta värdet.

Kör denna kod med min map som ovan. Då kommer du se hur vikterna sätts ut. Denna tar INTE hänsyn till väggarna -1. Vilket är problemet. Denna tänker bara fågelvägen.

Kod: Markera allt

//Compute weights
// width = Bredden på map 
// height = Höljen på map 
// x_stop = Destination i x 
// y_stop = Destination i y 
for (int i = 0; i < width; i++) {
   for (int j = 0; j < height; j++) {
      if (*(map + j * width + i) != -1) {
         int dot1 = (j + i); // Here we stand
         int dot2 = (j + x_stop); // Here we want to go in x-axis
         int dot3 = (y_stop + i); // Here we want to go in y-axis
         // Do pythagoras theorem c*c = a*a + b*b, but don't use square root here
         *(map + j * width + i) = (dot2 - dot1) * (dot2 - dot1) + (dot3 - dot1) * (dot3 - dot1);
      }
   }
}
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1339
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Re: Testköra min A* algoritm - Vad tycker ni?

Inlägg av baron3d »

PeterH skrev:AlBundy som är tillbaka? :humm:
:rofl
Användarvisningsbild
säter
Inlägg: 32545
Blev medlem: 22 februari 2009, 21:16:35
Ort: Säter

Re: Testköra min A* algoritm - Vad tycker ni?

Inlägg av säter »

PeterH skrev:AlBundy som är tillbaka? :humm:
Ja, det är utklarat tidigare.
guckrum
Inlägg: 1686
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Testköra min A* algoritm - Vad tycker ni?

Inlägg av guckrum »

A* hittar vägen med lägst kostnad. Varje förflyttning är associerad med en kostnad, tänk en karta med städer och avstånden dememellan.
Jag har en hypotes: Du kanske sätter alla kostnader till noll, förutom "väggarna"? Om det är gratis att röra sig kan man ju göra valfritt antal piruetter utan kostnad, dvs alla vägar som leder fram till målet oavsett längd eller loopar blir optimala!
Fundera på om det kan vara så och prova i så fall att sätta en kostnad för varje båge/nod i grafen.
Skriv svar