Maison >développement back-end >C++ >Le chemin le plus long optimisé est NP-complet
Le problème « Mettre à niveau le chemin le plus long » est une tâche difficile en termes de calcul qui doit être NP-complète. Dans ce numéro, étant donné un graphique avec des arêtes pondérées, l'objectif est de trouver le chemin le plus long d'un hub de départ prédéterminé à un hub de fermeture tout en élargissant le chargement des bords. Étant donné que les méthodes de recherche possibles ont considérablement évolué, aucun calcul en temps polynomial connu ne peut résoudre ce problème de manière efficace dans tous les cas. Tout bien considéré, les scientifiques s’appuient sur des calculs spéculatifs et des heuristiques pour trouver l’arrangement idéal le plus proche. Les problèmes liés à ce problème ont eu un impact dans différents domaines tels que les transports, la planification des opérations et les réservations.
Problème de chemin hamiltonien simplifié
Utilisez des problèmes NP-complets connus
Une façon de résoudre le problème du « chemin le plus long de mise à niveau » qui est NP-complet est de montrer une réduction par rapport au fameux problème NP-complet (appelé problème de la route hamiltonienne). Le problème de la route hamiltonienne détermine si un graphique donné contient un chemin qui visite chaque sommet exactement une fois.
Prenons comme exemple le problème de la route hamiltonienne, qui est un graphe G.
Créez un autre graphe G', impossible à distinguer de G, avec des sommets et des arêtes similaires.
Attribuez le poids 1 à toutes les arêtes de G'.
Définissez les pivots de début et de fin du problème du « chemin le plus long augmenté » sur deux pivots instables quelconques dans G'.
Si G a un chemin hamiltonien, le "chemin le plus long amélioré" dans G' sera un chemin hamiltonien similaire avec une charge de bord égale au nombre d'arêtes égale au nombre de sommets un plus court.
Si G n'a pas de route hamiltonienne, alors le « chemin le plus long simplifié » dans G' à ce moment sera un chemin direct du moyeu de départ au moyeu de fermeture, où la quantité de chargement de bord est égale au nombre de arêtes, ce qui n'est pas complet est le nombre de sommets courts.
Cette baisse montre que résoudre le « chemin le plus long amélioré » est tout aussi difficile que résoudre le problème de la route hamiltonienne, ce qui en fait un problème NP-complet.
#include <iostream> #include <vector> #include <functional> using namespace std; bool hasHamiltonianPath(const vector<vector<int>>& graph, int start, int finish) { int n = graph.size(); vector<int> path; vector<bool> visited(n, false); function<bool(int)> dfs; dfs = [&](int u) { visited[u] = true; path.push_back(u); if (u == finish && path.size() == n) return true; for (int v = 0; v < n; ++v) { if (!visited[v] && graph[u][v]) { if (dfs(v)) return true; } } visited[u] = false; path.pop_back(); return false; }; return dfs(start); } int main() { int n = 5; vector<vector<int>> graph(n, vector<int>(n, 0)); graph[0][1] = graph[1][0] = 1; graph[1][2] = graph[2][1] = 1; graph[2][3] = graph[3][2] = 1; graph[3][4] = graph[4][3] = 1; vector<vector<int>> graph_prime = graph; int start = 0, finish = 3; if (hasHamiltonianPath(graph, start, finish)) cout << "G has a Hamiltonian Path.\n"; else cout << "G does not have a Hamiltonian Path.\n"; return 0; }
G does not have a Hamiltonian Path.
Une autre approche consiste à prouver que le « chemin le plus long réduit » est NP-complet en le réduisant d'un problème NP-complet connu tel que le problème du chemin le plus long ou le problème du représentant commercial en mouvement (directement TSP).
Étant donné que le problème du chemin le plus long se pose, qui est un graphique G et un entier k qui résout la longueur idéale du chemin.
Créez un autre graphe G', pas différent de G, avec des sommets et des arêtes similaires.
Attribuez le poids 1 à toutes les arêtes de G'.
Définissez les pivots de début et de fin du problème du « chemin le plus long augmenté » sur deux pivots instables quelconques dans G'.
Si G a un chemin le plus long de longueur k, alors le « chemin le plus long amélioré » dans G' sera un chemin le plus long similaire avec une charge de bord égale à k.
Si G n'a pas le chemin le plus long de longueur k, alors il n'y aura pas de chemin dans G' avec une charge de bord égale à k à ce moment.
Puisque le problème du chemin le plus long est connu pour être NP-complet, cette réduction établit le summum NP du « chemin le plus long simplifié ».
Les deux méthodes soulignent que le « chemin le plus long de haut niveau » est NP-complet et que, par conséquent, il n'existe aucun calcul efficace connu capable de le gérer dans tous les cas, ce qui montre sa complexité informatique.
#include <iostream> #include <vector> class Graph { public: int V; // Number of vertices std::vector<std::vector<int>> adj; Graph(int V) : V(V) { adj.resize(V, std::vector<int>(V, 0)); } void addEdge(int u, int v) { adj[u][v] = 1; adj[v][u] = 1; } bool hasEnhancedLongestWay(int k, int start, int end) { return false; } }; int main() { int V = 5; // Number of vertices Graph G(V); G.addEdge(0, 1); G.addEdge(1, 2); G.addEdge(2, 3); G.addEdge(3, 4); int k = 3; int start = 0; int end = 4; bool hasEnhancedLongestWay = G.hasEnhancedLongestWay(k, start, end); std::cout << std::boolalpha << hasEnhancedLongestWay << std::endl; return 0; }
false
Passer à la première approche implique de réduire le fameux problème de la méthode hamiltonienne. En transformant le cas du problème de la route hamiltonienne en cas de la « route la plus longue avancée », nous montrons que résoudre le dernier problème est en quelque sorte aussi difficile que résoudre le problème précédent et développons sa mise en œuvre NP.
La méthode 2 explique directement comment réduire le problème d'un autre problème NP-complet connu, le problème du chemin le plus long ou le problème du représentant commercial en mouvement (TSP). En démontrant la manière dont le « chemin le plus long amélioré » peut être transformé en ces problèmes NP-complets, nous montrons qu'il a une complexité de calcul similaire et qu'il est NP-complet de cette manière.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!