• 动态规划之双调欧几里得旅行商问题


    解题思路首先把横坐标x排序,大约用时O(nlgn),用堆排序或者归并排序都能达到此效果。

    提示既然是从左到右扫描,那么x坐标从左到右是依照递增顺序扫描。

                      ②子结构:在依照①已排好序的基础上,才干进行这步操作,注意排序过程这里已省略。以下定义b[i][j]=从左边第1个点到第i个点的距离+从左边第1个点到第j个点的距离。而且两条路径上必须经过各不同样的全部1到i到j之间全部点。用distance(T,i,j)=|pipj|表示从第i个点到第j个点的直线距离。

                      ③归纳的递归公式例如以下:

    代码例如以下

    #include <iostream>
    #include <math.h>
    using namespace std;
    #define n 7
    struct Coordinate
    {
    	double x;double y;
    }T[n];
    //计算点i和点j之间的直线距离  
    double distance(Coordinate T[],int i,int j)  
    {  
        return sqrt((T[i].x - T[j].x) * (T[i].x - T[j].x) +  (T[i].y - T[j].y) * (T[i].y - T[j].y));  
    } 
    double Bitonic_euclidean_traveling_salesman_problem(struct Coordinate T[])
    {//双调欧几里得旅行商问题
    	double b[n+1][n+1]={0};//记录最短路径的长度 
    	//计算全部情况下的b[i][j],1 <= i <= j  
    	b[1][2] = distance(T,1,2);//初始化  
        for ( int j=3;j<=n;j++)
        {
    	   //i < j-1  
           for (int i=1;i<=j-2;i++)
           {
    		   b[i][j]=b[i][j-1]+distance(T,j-1,j);
           }
    	   //i = j - 1,b[i][j] = min(b[k][j - 1] + distance(k,j)); 
    	   b[j-1][j]=0x7fffffff;
    	   for (int k=1;k<=j-2;k++)
    	   {
    		   double q=b[k][j-1]+distance(T,k,j);
    		   if (q<b[j-1][j])
    		   {
    			   b[j-1][j]=q;
    		   }
    	   }
        }
    	b[n][n]=b[n-1][n]+distance(T,n-1,n);
    	return b[n][n];
    }
    void main()
    {  
    	struct Coordinate T[n+1]={0};
        for( int i = 1; i <=n; i++) 
            cin>>T[i].x>>T[i].y; 
    	cout<<Bitonic_euclidean_traveling_salesman_problem(T)<<endl;
    }

    例子输出:

    总结:此程序执行时间为O(n²),这里的难点主要在归纳递推公式上(i<j-1与i=j-1两种情况须要重复思考才可能得出结论)。其次才是详细实现。

                                                               

    
  • 相关阅读:
    pytorch 之cuda语义
    pytorch 的自动求导机制-----requiers_grad 和volatile
    pytorch 之 Variable
    pytorch的安装
    【路径规划】OSQP曲线平滑 公式及代码
    【Ubuntu 1】ubuntu的软件包及便携系列 记录
    【路径规划】 The Dynamic Window Approach to Collision Avoidance (附python代码实例)
    【论文阅读】Learning to drive from a world on rails
    Motion Planning 是什么
    【路径规划】 Optimal Trajectory Generation for Dynamic Street Scenarios in a Frenet Frame (附python代码实例)
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7020268.html
Copyright © 2020-2023  润新知