Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม

ปัญหาการเดินทางของพนักงานขาย


พนักงานขายคนหนึ่งอยู่ในเมืองหนึ่ง เขาต้องไปเยี่ยมชมเมืองอื่นๆ ทั้งหมดที่อยู่ในรายการ รวมทั้งมีค่าใช้จ่ายในการเดินทางจากเมืองหนึ่งไปยังอีกเมืองหนึ่งด้วย ค้นหาเส้นทางที่มีค่าใช้จ่ายต่ำสุดในการเยี่ยมชมเมืองทั้งหมดเพียงครั้งเดียวและกลับไปยังเมืองเริ่มต้น

กราฟจะต้องสมบูรณ์สำหรับกรณีนี้ ดังนั้นพนักงานขายจึงสามารถเดินทางจากเมืองใดก็ได้ไปยังเมืองใดก็ได้โดยตรง

ที่นี่เราต้องหาค่า Hamiltonian Cycle ที่ถ่วงน้ำหนักขั้นต่ำ

อินพุตและเอาต์พุต

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)

มีตาราง dp และค่า VISIT_ALL เพื่อทำเครื่องหมายว่าโหนดทั้งหมดมีการเยี่ยมชม

อินพุต - ค่า mask สำหรับปิดบังบางเมือง ตำแหน่ง

ผลลัพธ์ลบ; ค้นหาเส้นทางที่สั้นที่สุดในการเยี่ยมชมเมืองทั้งหมด

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