Algorytm A*

0

Musze napisac Algorytm A* i w mam problem żeby wyszukać najmiejszej wartosc f

#include <iostream>
#include <fstream>  //wlacza obsluge plikow
#include <vector>
#include <math.h>
using namespace std;



class Punkt
{
	public:
		int PozycjaX;
		int PozycjaY;
		int wartosc; // okresla, czy mozna przejsc po polu, 0 - tak, 5 - nie
		double G; //długo?ć ?cieżki
		double H;
		double F;
		int RodzicX;
		int RodzicY;
};





int main(int argc, char** argv) {

	string nazwap = "grid.txt";
	int PunktPX = 0;
	int PunktPY = 0;
	int PunktKX = 19;
	int PunktKY = 19;


  
    int wym2=20; // kolumny
   
    int wym1=20; //wiersze

  
    int rows = wym2+1;

   
    // nizej deklaracja tablicy dwuwymiarowej:
    Punkt **TablicaP;

    //  tworzysz tablice o rows (wym2+1 lub jak wolisz y+1) wierszach
    TablicaP = new Punkt*[rows];

    // teraz dla każdego wiersza dodajesz kolumny (x)
    while(rows--) TablicaP[rows] = new Punkt[wym1+1];

    // wczesniej mialejs new Punkt, czyli w tabeli masz utworzone Punkty, ale nie maja one zadnych wartosci (masz gole obiekty klasy Punkt)
    std::ifstream plik(nazwap.c_str());
    for ( int i=1;i<wym2+1;i++)
    {
        for ( int j=1;j<wym1+1;j++)
        {
            // z pliku pobierasz wartosc dla danego i,j i zapisujesz ja do obiektu w tablicy ktory jest pod i,j
            // tutaj jest 0 (mozna isc) lub 5 (przeszkoda)
            plik >> TablicaP[i][j].wartosc;
            // przy okazji jak juz idziemy po petlach mozemy podac koordynanty dla danego punktu
            TablicaP[i][j].PozycjaX = i;
            TablicaP[i][j].PozycjaY = j;
            
        }
    }
    plik.close();

    // teraz masz tablice dwuwymiarowa, wypelniona punktami (obiektami) ktore maja okreslano wartosc, x, y, ale nie maja g,h,f i okreslonego rodzica, ale to wyjdzie pozniej


 	vector<Punkt*> ListaOtwarta;
 	vector<Punkt*> ListaZamknieta;
 	
 	//Dodawanie początkowego wezła
 	TablicaP[PunktPX][PunktPY].G = 0;
 	TablicaP[PunktPX][PunktPY].H = sqrt(pow((PunktPX-PunktKX),2)+pow((PunktPY-PunktKY),2));
	TablicaP[PunktPX][PunktPY].F = TablicaP[PunktPX][PunktPY].G + TablicaP[PunktPX][PunktPY].H;
	
	ListaOtwarta.push_back(&TablicaP[PunktPX][PunktPY]);
	
	while(!ListaOtwarta.empty())
	{
		//wybieranie ListyOtwartej pola o najmniejszej wartości F
		double MinWartoscF = 0;
		int index = 0;
		for(vector<Punkt*>::iterator index = ListaOtwarta.begin(); index != ListaOtwarta.end();)
		{
			//Nie mam pojecia jak wybrac to najmiejsze pole ;/
			if(MinWartoscF == (**index).F)
			{
				
			}
		}
		
	}









	//WYSWIETLANIE MAPY
	
    for(int i=1;i<wym2+1;i++)
    {
        for(int j=1;j<wym1+1;j++)
        {
            cout<<TablicaP[i][j].wartosc<<" ";
        }cout<<"\n\n";
    }



// lub bogaciej, zeby sprawdzic czy dobrze zapisalo y i x:

   // cout<<"\n\n\n\n\n";


   /* for(int i=1;i<wym2+1;i++)
    {
        for(int j=1;j<wym1+1;j++)
        {
            if (TablicaP[i][i].PozycjaY< 10)
                cout<<" "<<TablicaP[i][j].PozycjaY<<";";
            else
                cout<<TablicaP[i][j].PozycjaY<<";";

            cout<<TablicaP[i][j].PozycjaX<<" "<<TablicaP[i][j].wartosc<<"   ";
        }cout<<"\n\n";
    } */

    getchar();


	return 0;
}
1

My też nie, bo nikt z nas nie wiem czym są twoje G, H i F. Zresztą kod jest napisany tak nieczytelnie że wątpie żeby ktokolwiek sie pokusił o próbę jego zdekodowania ;]

0

G - długość (koszt) ścieżki prowadzącej z punktu startu do aktualnej, rozpatrywanej pozycji w przestrzeni (jest to rzeczywista długość ścieżki, którą już wygenerowaliśmy)
H – szacunkowa długość ścieżki prowadząca z aktualnej pozycji do punktu docelowego; wartość H jest najczęściej wyznaczana metodami heurystycznymi, gdyż z oczywistego względu nie znamy tej długości (gdyby tak było, użycie takiego algorytmu byłoby niepotrzebne)
F = G+H – wartość równa sumie długości dwóch powyższych ścieżek.

0
  1. Po co używasz wskaźników, gołych new/delete?
  2. Listę otwartych oprzyj na std::priority_queue<Punkt>
    2.1 ALBO dodaj do Punkt operator<, który będzie porównywał wartości F
    2.2 ALBO podaj do priority_queue komparator
  3. Potem pobranie "najmniejszego punktu" będzie sprowadzało się do pobrania punktu z kolejki.

Takie coś będzie efektywniejsze i prostsze w użyciu niż zwykły wektor.

P.S. A listę zamkniętych zrób z std::set

1 użytkowników online, w tym zalogowanych: 0, gości: 1