Heuristic Paieška yra galingas algoritminis metodas, naudojamas ieškant sprendimų sudėtingose problemų erdvėse, priimant pagrįstus sprendimus, pagrįstus euristika arba nykščio taisyklėmis. Tai ypač naudinga, kai išsami paieška yra nepraktiška dėl didelės paieškos erdvės.
Kaip tai veikia
- Heuristic Įvertinimas: algoritmas įvertina kiekvieną probleminės erdvės būseną naudodamas funkciją heuristic. Ši funkcija įvertina kiekvienos būsenos „perspektyvumą“ pagal jos artumą tikslo būsenai.
- Paieškos strategija: algoritmas, remdamasis įvertinimu, parenka perspektyviausią būseną heuristic. Ji naudoja paieškos strategiją, pvz. Best-First, Paieška, A* paieška arba Greedy paieška.
- Būsenos išplėtimas: pasirinkta būsena išplečiama generuojant kaimynines būsenas. Tai galimi kandidatai kitam žingsniui.
- Kartojimas: procesas kartojamas iteratyviai, pasirenkant ir plečiant būsenas, kol randama tikslo būsena arba įvykdoma užbaigimo sąlyga.
Pavyzdys: keliaujančio pardavėjo problema(TSP)
Apsvarstykite keliaujančio pardavėjo problemą, kai pardavėjas turi aplankyti tam tikrus miestus ir grįžti į pradinį miestą, sumažindamas bendrą nuvažiuotą atstumą. Tai heuristic gali būti artimiausio kaimyno algoritmas:
- Pradėkite nuo atsitiktinio miesto.
- Kiekviename žingsnyje kaip kitą kelionės tikslą pasirinkite artimiausią nelankytą miestą.
- Kartokite, kol aplankysite visus miestus, tada grįžkite į pradinį miestą.
Kodo pavyzdys C++
#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;
}
Šiame pavyzdyje artimiausio kaimyno algoritmas naudojamas keliaujančio pardavėjo problemai išspręsti. Tai heuristic metodas, kai kiekviename žingsnyje pasirenkamas artimiausias neaplankytas miestas, todėl sprendimas dažnai yra artimas optimaliam.