Heuristic La ricerca è un potente approccio algoritmico utilizzato per trovare soluzioni in spazi problematici complessi prendendo decisioni informate basate su euristiche o regole empiriche. È particolarmente utile quando una ricerca esaustiva non è pratica a causa dell'ampio spazio di ricerca.
Come funziona
- Heuristic Valutazione: l'algoritmo valuta ogni stato nello spazio del problema utilizzando una heuristic funzione. Questa funzione stima la "promettenza" di ogni stato in termini di vicinanza allo stato obiettivo.
- Strategia di ricerca: l'algoritmo seleziona lo stato più promettente in base alla heuristic valutazione. Utilizza una strategia di ricerca come Best-First Ricerca, Ricerca A* o Greedy Ricerca.
- Espansione dello stato: lo stato selezionato viene espanso generando gli stati vicini. Questi sono potenziali candidati per il passaggio successivo.
- Ripeti: il processo viene ripetuto in modo iterativo, selezionando ed espandendo gli stati finché non viene trovato lo stato obiettivo o viene soddisfatta una condizione di terminazione.
Esempio: Problema del commesso viaggiatore(TSP)
Considera il problema del venditore ambulante, in cui un venditore deve visitare un insieme di città e tornare alla città di partenza riducendo al minimo la distanza totale percorsa. Un heuristic approccio potrebbe essere l'algoritmo del vicino più vicino:
- Inizia in una città a caso.
- Ad ogni passaggio, scegli la città non visitata più vicina come destinazione successiva.
- Ripeti finché tutte le città non sono state visitate, quindi torna alla città di partenza.
Esempio di codice in 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;
}
In questo esempio, l'algoritmo del vicino più vicino viene utilizzato per risolvere il problema del commesso viaggiatore. È un heuristic approccio che sceglie ad ogni passo la città non visitata più vicina, ottenendo una soluzione spesso vicina all'ottimale.