Heuristic Kërkimi është një qasje e fuqishme algoritmike e përdorur për të gjetur zgjidhje në hapësira komplekse problemore duke marrë vendime të informuara bazuar në heuristikë ose rregulla të gishtit. Është veçanërisht i dobishëm kur një kërkim shterues është jopraktik për shkak të hapësirës së madhe të kërkimit.
Si punon
- Heuristic Vlerësimi: Algoritmi vlerëson çdo gjendje në hapësirën e problemit duke përdorur një heuristic funksion. Ky funksion vlerëson "premtueshmërinë" e çdo shteti për sa i përket afërsisë së tij me gjendjen e qëllimit.
- Strategjia e Kërkimit: Algoritmi zgjedh gjendjen më premtuese bazuar në heuristic vlerësimin. Ai përdor një strategji kërkimi si Best-First Search, A* Search ose Greedy Search.
- Zgjerimi i Shtetit: Shteti i zgjedhur zgjerohet duke gjeneruar shtetet fqinje. Këta janë kandidatë potencialë për hapin tjetër.
- Përsëriteni: Procesi përsëritet në mënyrë të përsëritur, duke zgjedhur dhe zgjeruar gjendjet derisa të gjendet gjendja e qëllimit ose të plotësohet një kusht përfundimi.
Shembull: Problemi i shitësit udhëtues(TSP)
Merrni parasysh problemin e shitësit udhëtues, ku një shitës duhet të vizitojë një grup qytetesh dhe të kthehet në qytetin fillestar duke minimizuar distancën totale të përshkuar. Një heuristic qasje mund të jetë Algoritmi i fqinjit më të afërt:
- Filloni në një qytet të rastësishëm.
- Në çdo hap, zgjidhni qytetin më të afërt të pavizituar si destinacion tjetër.
- Përsëriteni derisa të vizitohen të gjitha qytetet, pastaj kthehuni në qytetin fillestar.
Shembull kodi në 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;
}
Në këtë shembull, Algoritmi i fqinjit më të afërt përdoret për të zgjidhur problemin e shitësit udhëtues. Është një heuristic qasje që zgjedh qytetin më të afërt të pavizituar në çdo hap, duke rezultuar në një zgjidhje që shpesh është afër optimales.