Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> प्रोग्रामिंग

यात्रा विक्रेता समस्या


एक विक्रेता एक शहर में है, उसे अन्य सभी शहरों का दौरा करना है जो सूचीबद्ध हैं, एक शहर से दूसरे शहर की यात्रा की लागत भी प्रदान की जाती है। एक बार सभी शहरों की यात्रा करने और अपने शुरुआती शहर में वापस जाने के लिए उस मार्ग का पता लगाएं जहां लागत न्यूनतम है।

इस मामले के लिए ग्राफ पूरा होना चाहिए, ताकि विक्रेता किसी भी शहर से सीधे किसी भी शहर में जा सके।

यहां हमें न्यूनतम भारित हैमिल्टनियन साइकिल का पता लगाना है।

इनपुट और आउटपुट

Input:
Cost matrix of the matrix.
0  20 42 25 30
20  0 30 34 15
42 30  0 10 10
25 34 10  0 25
30 15 10 25  0

Output:
Distance of Travelling Salesman: 80

एल्गोरिदम

travellingSalesman (mask, pos)

एक टेबल डीपी है, और सभी नोड्स को चिह्नित करने के लिए VISIT_ALL मान देखे गए हैं

इनपुट - कुछ शहरों, स्थिति को छिपाने के लिए मुखौटा मूल्य।

आउटपुट घटा; सभी शहरों में जाने के लिए सबसे छोटा रास्ता खोजें।

Begin
   if mask = VISIT_ALL, then //when all cities are visited
      return cost[pos, 0]
   if dp[mask, pos] ≠ -1, then
      return dp[mask, pos]
   finalCost := ∞

   for all cities i, do
      tempMask := (shift 1 left side i times)
      if mask AND tempMask = 0, then
         tempCpst := cost[pos, i] +
         travellingSalesman(mask OR tempMask, i)
         finalCost := minimum of finalCost and tempCost
   done

   dp[mask, pos] = finalCost
   return finalCost
End

उदाहरण

#include<iostream>
#define CITY 5
#define INF 9999
using namespace std;

int cost[CITY][CITY] = {
   {0, 20, 42, 25, 30},
   {20, 0, 30, 34, 15},
   {42, 30, 0, 10, 10},
   {25, 34, 10, 0, 25},
   {30, 15, 10, 25, 0}
};
                         
int VISIT_ALL = (1 << CITY) - 1;

int dp[16][4];    //make array of size (2^n, n)

int travellingSalesman(int mask, int pos) {
   if(mask == VISIT_ALL)    //when all cities are marked as visited
      return cost[pos][0];    //from current city to origin
         
   if(dp[mask][pos] != -1)    //when it is considered
      return dp[mask][pos];
         
   int finalCost = INF;
         
   for(int i = 0; i<CITY; i++) {
      if((mask & (1 << i)) == 0) {    //if the ith bit of the result is 0, then it is unvisited
         int tempCost = cost[pos][i] + travellingSalesman(mask | (1 << i), i);    //as ith city is visited
         finalCost = min(finalCost, tempCost);
      }
   }
   return dp[mask][pos] = finalCost;
}

int main() {    
   int row = (1 << CITY), col = CITY;
   for(int i = 0; i<row; i++)
      for(int j = 0; j<col; j++)
         dp[i][j] = -1;    //initialize dp array to -1
    cout << "Distance of Travelling Salesman: ";  
    cout <<travellingSalesman(1, 0);    //initially mask is 0001, as 0th city already visited
}

आउटपुट

Distance of Travelling Salesman: 80

  1. सांप और सीढ़ी की समस्या

    हम प्रसिद्ध खेल सांप और सीढ़ी के बारे में जानते हैं। इस गेम में कुछ कमरे बोर्ड पर मौजूद होते हैं, जिसमें रूम नंबर होता है। कुछ कमरे सीढ़ी या सांप से जुड़े हुए हैं। जब हमें सीढ़ी मिल जाती है, तो हम कुछ कमरों तक चढ़ सकते हैं और बिना क्रम में आगे बढ़े गंतव्य के करीब पहुंच सकते हैं। इसी तरह, जब हमें कोई

  1. सबसे बड़ी स्वतंत्र सेट समस्या

    स्वतंत्र सेट सभी बाइनरी ट्री नोड्स का सबसेट है जब उस सबसेट में किन्हीं दो नोड्स के बीच कोई किनारा नहीं होता है। अब तत्वों के समुच्चय से हम सबसे लंबा स्वतंत्र समुच्चय प्राप्त करेंगे। यानी यदि तत्वों का उपयोग बाइनरी ट्री बनाने के लिए किया जाता है, तो सभी सबसे बड़े उपसमुच्चय, जहां उस उपसमुच्चय में को

  1. वर्टेक्स कवर समस्या

    अप्रत्यक्ष ग्राफ़ के लिए, शीर्ष आवरण शीर्षों का एक उपसमुच्चय होता है, जहां ग्राफ़ के प्रत्येक किनारे (u, v) के लिए या तो u या v सेट में होता है। बाइनरी ट्री का उपयोग करके, हम आसानी से वर्टेक्स कवर की समस्या को हल कर सकते हैं। इस समस्या को दो उप-समस्याओं में विभाजित किया जा सकता है। जब जड़ शीर्ष आव