Heuristic A keresés egy hatékony algoritmikus megközelítés, amellyel megoldásokat találhatunk összetett problématerekben, heurisztika vagy hüvelykujjszabályok alapján megalapozott döntések meghozatalával. Különösen akkor hasznos, ha a kimerítő keresés nem praktikus a nagy keresési terület miatt.
Hogyan működik
- Heuristic Kiértékelés: Az algoritmus egy függvény segítségével kiértékeli a problématér minden állapotát heuristic. Ez a függvény megbecsüli az egyes állapotok "ígéretességét" a célállapothoz való közelsége szempontjából.
- Keresési stratégia: Az algoritmus az értékelés alapján kiválasztja a legígéretesebb állapotot heuristic. Olyan keresési stratégiát használ, mint Best-First a Keresés, A* keresés vagy Greedy Keresés.
- Állapotkiterjesztés: A kiválasztott állapot a szomszédos állapotok generálásával bővül. Ezek potenciális jelöltek a következő lépésre.
- Ismétlés: A folyamat iteratív módon ismétlődik, kiválasztva és kibontva az állapotokat, amíg meg nem találjuk a célállapotot, vagy nem teljesül a befejezési feltétel.
Példa: Utazó értékesítői probléma(TSP)
Vegyük fontolóra az utazó értékesítő problémát, ahol az eladónak egy sor várost meg kell látogatnia, és vissza kell térnie a kiinduló városba, miközben minimálisra csökkenti a teljes megtett távolságot. Megközelítés heuristic lehet a Nearest Neighbor Algorithm:
- Kezdje egy véletlenszerű városban.
- Minden lépésnél válassza ki a legközelebbi nem látogatott várost következő úti célként.
- Ismételje addig, amíg az összes várost meg nem látogatja, majd térjen vissza a kiinduló városba.
Kódpélda C++ nyelven
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
struct City {
int x, y;
};
double distance(const City& city1, const City& city2) {
return std::sqrt(std::pow(city1.x- city2.x, 2) + std::pow(city1.y- city2.y, 2));
}
std::vector<int> nearestNeighbor(const std::vector<City>& cities) {
int numCities = cities.size();
std::vector<int> path(numCities);
std::vector<bool> visited(numCities, false);
path[0] = 0;
visited[0] = true;
for(int i = 1; i < numCities; ++i) {
int currentCity = path[i- 1];
double minDist = std::numeric_limits<double>::max();
int nextCity = -1;
for(int j = 0; j < numCities; ++j) {
if(!visited[j]) {
double dist = distance(cities[currentCity], cities[j]);
if(dist < minDist) {
minDist = dist;
nextCity = j;
}
}
}
path[i] = nextCity;
visited[nextCity] = true;
}
path.push_back(0); // Return to the starting city
return path;
}
int main() {
std::vector<City> cities = {{0, 0}, {1, 3}, {4, 2}, {3, 6}, {7, 1}};
std::vector<int> path = nearestNeighbor(cities);
std::cout << "Traveling Salesman Path: ";
for(int city: path) {
std::cout << city << ";
}
std::cout << std::endl;
return 0;
}
Ebben a példában a legközelebbi szomszéd algoritmust használjuk az utazó értékesítő probléma megoldására. Ez egy olyan heuristic megközelítés, amely minden lépésnél kiválasztja a legközelebbi meg nem látogatott várost, ami gyakran az optimálishoz közeli megoldást eredményez.