Heuristic Paieškos algoritmas C++ – paaiškinimas, pavyzdys ir kodas

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

  1. 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.
  2. 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.
  3. Būsenos išplėtimas: pasirinkta būsena išplečiama generuojant kaimynines būsenas. Tai galimi kandidatai kitam žingsniui.
  4. 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:

  1. Pradėkite nuo atsitiktinio miesto.
  2. Kiekviename žingsnyje kaip kitą kelionės tikslą pasirinkite artimiausią nelankytą miestą.
  3. 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.