精华内容
下载资源
问答
  • MATLAB软件实现,蚁群算法解决最短路线问题
  • 学习解决数学最短方面的问题,还可以再数学建模方面应用,希望你们好好学习
  • Algorithm:C++语言实现之动态规划算法相关(矩阵连乘状态转移方程、字符串的交替连接、分析格网棋盘的特点、最短路线问题、生产计划问题、动态规划解下列非线性规划) 目录 动态规划算法 1.1、矩阵连乘状态...

    Algorithm:C++语言实现之动态规划算法相关(矩阵连乘状态转移方程、字符串的交替连接、分析格网棋盘的特点、最短路线问题、生产计划问题、动态规划解下列非线性规划)

     

     

     

    目录

    动态规划算法

    1.1、矩阵连乘状态转移方程

    1.2、字符串的交替连接

    1.3、分析格网棋盘的特点

    2.1、最短路线问题

    2.2 生产计划问题

    3、用动态规划解下列非线性规划

    典型问题的动态规划模型

    1、最短路线问题

    2、生产计划问题

    3、资源分配问题


     

     

     

     

     

    动态规划算法

    1.1、矩阵连乘状态转移方程

    1.2、字符串的交替连接

    1.3、分析格网棋盘的特点

    2.1、最短路线问题

    图1 是一个线路网,连线上的数字表示两点之间的距离(或费用)。试寻求一条由A到G 距离最短(或费用最省)的路线。

    2.2 生产计划问题

          工厂生产某种产品,每单位(千件)的成本为1(千元),每次开工的固定成本为3(千元),工厂每季度的最大生产能力为6(千件)。经调查,市场对该产品的需求量第一、二、三、四季度分别为2,3,2,4(千件)。如果工厂在第一、二季度将全年的需求都生产出来,自然可以降低成本(少付固定成本费),但是对于第三、四季度才能上市的产品需付存储费,每季每千件的存储费为0.5(千元)。还规定年初和年末这种产品均无库存。试制定一个生产计划,即安排每个季度的产量,使一年的总费用(生产成本和存储费)最少。

    3、用动态规划解下列非线性规划


    解:动态规划求解下列非线性规划

     

    典型问题的动态规划模型

    1、最短路线问题

    2、生产计划问题

     

    3、资源分配问题

    解:

     

     

     

    展开全文
  • </pre><pre> #include<.../*有8个城市,编号分别为0~7,求从0号城市到7号城市的最短路线*/ int jz[8][8]= { {0,1,1,1,0,1,0,0}, {1,0,0,0,0,1,0,0}, {1,0,0,1,1,0,0,0}, ...
    </pre><pre>

     

    #include<stdio.h>
    
    /*有8个城市,编号分别为0~7,求从0号城市到7号城市的最短路线*/
    int jz[8][8]= { {0,1,1,1,0,1,0,0},
                    {1,0,0,0,0,1,0,0},
                    {1,0,0,1,1,0,0,0},
                    {1,0,1,0,0,0,1,0},
                    {0,0,1,0,0,0,1,1},
                    {1,1,0,0,0,0,0,1},
                    {0,0,0,1,1,0,0,1},
                    {0,0,0,0,1,1,1,0}};//0表示不能走,1表示可行
    
    
    struct
    {
      int city,pre;
    } sq[100];
    
    int qh,qe,i,visited[100];
    
    void out()
    {
        printf("%d",sq[qe].city);
        while(sq[qe].pre!=0)
        {
            qe=sq[qe].pre;
            printf("--%d",sq[qe].city);
        }
    }
    
    void search(int n)
    {
        qh=0;
        qe=1;
        sq[1].city=0;
        sq[1].pre=0;
        visited[1]=1;
        while(qh!=qe)   //当队不为空
        {
            qh=qh+1;    //结点出队
            for(i=0;i<n;i++)
                if(jz[sq[qh].city][i]==1&&visited[i]==0)  //如果从城市sq[qh].city可以直接到达城市i,且城市i没有访问过
                 {
                     qe=qe+1;//结点入队
                     sq[qe].city=i;
                     sq[qe].pre=qh;
                     visited[i]=1;
                     if(sq[qe].city==7)
                     {
                         out();
                         return ;
                     }
                 }
    
        }
        printf("No Solution!\n");
    }
    
    int main()
    {
        int i,n;
        n=8;
        for(i=0;i<n;i++)
            visited[i]=0;
        search(n);
    
        return 0;
    }

     

     

     

     

     

     

     

     

    运行效果图:

    /*迷宫如下,1表示墙,0表示路
    0 0 0 0 0 0 0 0
    0 1 1 1 1 0 1 0
    0 0 0 0 1 0 1 0
    0 1 0 0 0 0 1 0
    0 1 0 1 1 0 1 0
    0 1 0 0 0 0 1 1
    0 1 0 0 1 0 0 0
    0 1 1 1 1 1 1 0
    */
    
    
    #include<stdio.h>
    /*储存迷宫矩阵*/
    int maze[8][8]={{0,0,0,0,0,0,0,0},
                    {0,1,1,1,1,0,1,0},
                    {0,0,0,0,1,0,1,0},
                    {0,1,0,0,0,0,1,0},
                    {0,1,0,1,1,0,1,0},
                    {0,1,0,0,0,0,1,1},
                    {0,1,0,0,1,0,0,0},
                    {0,1,1,1,1,1,1,0}};
    
    /*定义方向数组,如:i+fx[0],j+fy[0],表示向下移动*/
    
    int fx[4]={1,-1,0,0};
    int fy[4]={0,0,-1,1};
    
    struct {
      int x,y,pre;
    }sq[100];
    
    
    int qh,qe,i,j,k;
    
    void out()
    {
        printf("(%d,%d)",sq[qe].x,sq[qe].y);
        while(sq[qe].pre!=0)
        {
            qe=sq[qe].pre;
            printf("--(%d,%d)",sq[qe].x,sq[qe].y);
        }
    }
    int check(int i,int j)
    {
        int flag=1;
        if(i<0||i>7||j<0||j>7)//是否在迷宫内
            flag=0;
        if(maze[i][j]==1||maze[i][j]==-1) //是否可行
           flag=0;
        return flag;
    }
    
    void search()
    {
        qh=0;
        qe=1;
        maze[0][0]=-1;//表示访问过
        sq[1].pre=0;
        sq[1].x=0;
        sq[1].y=0;
        while(qh!=qe)//当队不为空
        {
            qh=qh+1; //出队
            for(k=0;k<4;k++)//搜索可达到的方块
            {
                i=sq[qh].x+fx[k];
                j=sq[qh].y+fy[k];
                if(check(i,j)==1)
                {
                    qe=qe+1;//入队
                    sq[qe].x=i;
                    sq[qe].y=j;
                    sq[qe].pre=qh;
                    maze[i][j]=-1;//表示访问过
                    if(sq[qe].x==7&&sq[qe].y==7)
                    {
                        out();
                        return ;
                    }
    
                }
            }
        }
        printf("No Solution!\n");
    }
    int main()
    {
        search();
        return 0;
    }
    
    

    运行效果图:

    PS:每天学到一点点,就很开心

    展开全文
  • Description ...现在的任务是找出从一点到另一点之间的最短路径。 Input 共有n+m+3行,其中: 第一行为一个整数n。 第2行到第n+1行(共n行),每行的两个整数x和y,描述一个点的坐标(以一个...

    Description
    平面上有n个点(N<=100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点直线的距离。现在的任务是找出从一点到另一点之间的最短路径。

    Input
    共有n+m+3行,其中:
    第一行为一个整数n。
    第2行到第n+1行(共n行),每行的两个整数x和y,描述一个点的坐标(以一个空格隔开)。
    第n+2行为一个整数m,表示图中的连线个数。
    此后的m行,每行描述一条连线,由两个整数I,j组成,表示第i个点和第j个点之间有连线。
    最后一行:两个整数s和t,分别表示源点和目标点。

    Output
    仅一行,一个实数(保留两位小数),表示从S到T的最短路径的长度。

    Sample Input
    5
    0 0
    2 0
    2 2
    0 2
    3 1
    5
    1 2
    1 3
    1 4
    2 5
    3 5
    1 5

    Sample Output
    3.41

    floyed方法一(floyed)

    时间复杂度:OO(N3N^3)

    思路:

    求两点之间(x,y)的距离是: sqrt(double((1x2x)×(1x2x))+double((1y2y)×(1y2y)))sqrt(double((1x−2x)×(1x−2x))+double((1y−2y)×(1y−2y)))(勾股定理)然后枚举每个点到其他点的距离,再比较一下。虽然是图论可我硬打成了DP

    代码:

    #include<cstdio>
    #include<iostream>
    #include<cmath>//因为用到sqrt&&pow所以要开cmath这个头文件
    #include<cstring>//应为用到memset。
    using namespace std;
    int n,m,x,y,s,t;
    int a[101][5];
    double f[101][101];//要用浮点类型。
    int main()
    {
    	scanf("%d",&n);//输入。
    	for(int i=1;i<=n;i++)
    	scanf("%d%d",&a[i][1],&a[i][2]);//输入。
    	scanf("%d",&m);//输入。
    	memset(f,0x7f,sizeof(f));//给f赋个大值
    	for(int i=1;i<=m;i++)//预处理xy的距离。
    	{
        	scanf("%d%d",&x,&y);//输入。
    		f[x][y]=f[y][x]=sqrt(pow(double(a[x][1]-a[y][1]),2)+pow(double(a[x][2]-a[y][2]),2));//求距离。
    	}
    	scanf("%d%d",&s,&t);//输入。
    	for(int k=1;k<=n;k++) //floyed 最短路算法
    	 for(int i=1;i<=n;i++)
          for(int j=1;j<=n;j++)
          {
    	   if (i!=k&&i!=j&&j!=k&&f[i][j]>f[i][k]+f[k][j])
    	    f[i][j]=f[i][k]+f[k][j];
         }
    	printf("%.2lf",f[s][t]);//保留两位小数。
    	return 0;
    }
    

    dijkstra方法二(dijkstra)

    时间复杂度:OO(N2N^2)

    思路:

    这题我们还可以用dijkstra算法,dijkstra算法的时间复杂度为O(N2N^2),TA比floyed要

    从起点到一个点的最短路径一定会经过至少一个“中转点”(例如下图1到5的最短路径,中转点是2。特殊地,我们认为起点1也是一个“中转点”)。显而易见,如果我们想求出起点到一个点的最短路径,那我们必然要先求出中转点的最短路径(例如我们必须先求出点2 的最短路径后,才能求出从起点到5的最短路径)。

    代码:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<cmath>
    using namespace std;
    int a[101][101];
    double c[101];
    double f[101][101];
    bool b[101];
    int n,x,y,s,t,m,k;
    double minn;
    double maxx=1e30;//设一个大值,方便后面计算用。
    int main() 
    {
    	 memset(f,0x7f,sizeof(f));//也给f设个大值。
        scanf("%d",&n);//输入。
        for(int i=1;i<=n;i++)
        scanf("%d%d",&a[i][1],&a[i][2]);  //输入。
         scanf("%d",&m);//输入。
         for(int i=1;i<=m;i++)
       {
       	scanf("%d%d",&x,&y);//输入。
       f[x][y]=f[y][x]=sqrt(pow(double(a[x][1]-a[y][1]),2)+pow(double(a[x][2]-a[y][2]),2)); //pow(x,y)表示x^y,其中x,y必须为double类型,要用cmath库
       } 
       scanf("%d%d",&s,&t);//输入。
           for (int i=1;i<=n;i++) 
          c[i]=f[s][i];//预处理。
      	b[s]=true;c[s]=0;
     for(int i=1;i<n;i++)
    	{
    		minn=maxx; //把值给maxx
            k=0;
    		for(int j=1;j<=n;j++)
    		if(b[j]==false&&c[j]<minn)
    	  {
    	  minn=c[j];
    	 k=j;
          } 
          if(k==0)break;//优化(更快)
       	   b[k]=true;
              for (int j=1;j<=n;j++)
              if (c[k]+f[k][j]<c[j]&&!b[j]) 
                c[j]=c[k]+f[k][j];//更新路径长度。
        }    
       printf("%.2lf",c[t]);//输出,注意保留两位小数。
       return 0;  
    }
    

    BellmanFord方法三(Bellman-Ford)

    时间复杂度:OO(NE)(NE)

    思路:

    我们还可以用Bellman-Ford算法来做,找出最优策略,再用松弛操作即可。

    代码:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    using namespace std;
    int n,m,x,y,f[1001][2],a[1001][2];
    double c[1001],b[1001];
    int main()
    {
    	memset(c,0x7f,sizeof(c));
    	                       
    	scanf("%d",&n);
    	for (int i=1;i<=n;i++)
    	scanf("%d%d",&a[i][1],&a[i][2]);
    	scanf("%d",&m);
    	for (int i=1;i<=m;i++)
    	{
    		scanf("%d%d",&x,&y);//输入。
    		f[i][1]=x;f[i][2]=y;//表联通。
    		b[i]=sqrt(double((a[x][1]-a[y][1])*(a[x][1]-a[y][1]))+double((a[x][2]-a[y][2])*(a[x][2]-a[y][2])));//勾股定理
    		
    	}
    	scanf("%d%d",&x,&y);
    	c[x]=0;
    	for (int i=1;i<=n;i++)//松弛操作。
    	for (int j=1;j<=m;j++)
    	{
    		if (c[f[j][1]]+b[j]<c[f[j][2]]) c[f[j][2]]=c[f[j][1]]+b[j];
    		if (c[f[j][2]]+b[j]<c[f[j][1]]) c[f[j][1]]=c[f[j][2]]+b[j];
    	}
    	printf("%.2lf",c[y]); 
    	return 0;
    }
    

    SPFA方法四(SPFA)

    时间复杂度:OO(KE)(KE)k是点,e是常数

    思路:和Ford差不多,但Ford做了许多无用功,因此跑的很慢,所以用SPFA来做,SPFA要用到队列来做,并且这个队列是出来还可以再进去的。我这次并没有用dfs的方法,而用一种以前没用过的方法——STL。

    代码:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    #include<queue>//STL
    using namespace std;
    int n,m,t;
    bool le[2005];
    int a[2005][3],h[2005];
    double dis[2005],f[2005][2005];//dis表示最短路径
    struct emm//为下面邻接表做铺垫。
    {
    	int w,p;
    }e[105];
    int main()
    {
    	for (int i = 1; i <= 2000; i++)
    		dis[i] = 44444444;//先给dis一个大值。
    	scanf("%d",&n);//输入。
    	for (int i=1; i<=n; ++i) {
    	  scanf("%d%d",&a[i][1],&a[i][2]);
    	}
    	scanf("%d",&m);
    	for (int i=1; i<=m; ++i)
    	{
    	    int x,y;
    		scanf("%d%d",&x,&y);
    	
    		double l=(double)a[x][1]-a[y][1];//勾股
    		double r=(double)a[x][2]-a[y][2];
    		f[x][y]=f[y][x]=sqrt(l*l+r*r);
    		e[++t]=(emm){y,h[x]};h[x]=t;//邻接表
    		e[++t]=(emm){x,h[y]};h[y]=t;
    	}
       	int s,t;
    	scanf("%d%d",&s,&t);
    	dis[s]=0;//清0
    	queue<int>z;//STL
    	z.push(s);//入队
    	le[s] = 1;//标记已经入队。
       while (!z.empty())//判断不为空,以下为SPFA
    	{
    		int sum=z.front();//首元素。
    		z.pop();//出队。
    		for (int i=h[sum];i;i=e[i].p)//松弛操作(更新最短路)。
    		{
    			if (dis[e[i].w]>dis[sum]+f[sum][e[i].w])
    			{
    				 dis[e[i].w]=dis[sum]+f[sum][e[i].w];
    			     if (!le[e[i].w])
    			     {
    			     	z.push(e[i].w);
    			     	le[e[i].w]=1;//标记再次入队
    			     }
    			}
    		}
    		le[sum]=0;
    	} 
        printf("%.2lf",dis[t]);//输出。
        return 0;
    }
    
    展开全文
  • 用动态规划算法求解最短路线问题

    千次阅读 2009-10-03 08:41:44
     问题如下:设有一个旅行者从A点出发,途中要经过B,C,D等处,最后到达E,从A到E有很多条路线可走,各个点的距离如下,问旅行者应该选择哪一条,是使A到E路线最短。  求解算法: public class Dp{ private ...



         问题如下:设有一个旅行者从A点出发,途中要经过B,C,D等处,最后到达E,从A到E有很多条路线可走,各个点的距离如下,问旅行者应该选择哪一条,是使A到E路线最短。

      求解算法:

    public class Dp{
    	private int[][] matrix;
    	private int[] distance;//记录到终点的距离
    	
    	public  int[][] getMatrix(){
    		return matrix;
    		
    	}
    	public void  setMatrix(int[][] matrix){
    		this.matrix = matrix;
    
    	}
    	/**任意两点之间的距离,前提是pointA<pointB
    	  * @param PointA 起点
        	  * @param PointB 终点
    	  */	
    	public void  getMinDistanceBetweenPionts(int pointA,int pointB)
    	{
    		//初始化
    		distance = new int[pointB+1];
    		for(int i = 0 ;i<distance.length;i++) distance[i]=10000;
    		distance[pointB] = 0;//该初始化保证(pointB,pointB)的距离为0
    
    ;		for(int i =pointB ;i>= pointA ;i--){//从最后pointB行开始,递减直到pointA
    		
    			for(int j = i+1;j <= pointB;j++){//历遍(i,i)->(i,pointB),找到(i,pointB)的最小距离
    				if( matrix[i][j] != 10000){
    						int value  =0;
    						if( j+1<= pointB) value = distance[j]; 
    						int minDistance = matrix[i][j] +value;//最小路径为(i,j)的距离加(j,point)的距离
    						if(minDistance <distance[i]) distance[i] = minDistance;//
    				}
    			}
    		}		
    	
    		for(int i: distance)
    		{
    			System.out.print(" "+i);
    		}
    		System.out.println();
    	}
    	
    	public static void main(String args[]){
    		int m = 10000;
    		int[][] matrix = {
    						  {m,2,5,3,m,m,m,m,m,m},
    						  {0,m,m,m,7,5,6,m,m,m},
    						  {0,0,m,m,3,4,2,m,m,m},
    						  {0,0,0,m,5,1,5,m,m,m},
    						  {0,0,0,0,m,m,m,1,4,m},
    						  {0,0,0,0,0,m,m,6,3,m},
    						  {0,0,0,0,0,0,m,3,3,m},
    						  {0,0,0,0,0,0,0,m,m,3},
    						  {0,0,0,0,0,0,0,0,m,4},
    						  {0,0,0,0,0,0,0,0,0,m}
    						};
    		Dp dp = new Dp();
    		dp.setMatrix(matrix);
    		dp.getMinDistanceBetweenPionts(0,9);
    	}
    
    }
    		

     

     分析:

     

     1、找出状态转移公式;i 到 j 的最短距离等 (i,i+1)的距离 加上 (i+1,j)的最短距离

     2、保存每个点到 j 的最短距离的变量 distance[]

     

     这是我的想法,不知道大家有没有更好的算法,能缩短时间,欢迎大家讨论!

    展开全文
  • 数学模型-自己收藏的数学建模资料,用于数学建模,线性规划、单纯形法、最短路径、运输问题、整数规划、储存论、多目标规划
  • 1、最短路线: 5x5矩阵,0为可通过,1为障碍,从(0,0)出发,到达(4,4),寻找最短路线并输出。 如: 输入: 输出: 此题主要用队列来解决(使用到的库:queue):当从某一点(x,y)出发时,考虑这四个点:...
  • 最笨的方法就是穷举,把所有可以走的路线都走一次,找出所有路线中最终成功到达终点的最短路径。每次走会有四种走法:上、左、下、右,所以可以肯定的是要对走这个行为进行递归,先把这个递归函数写出来。 /* * @...
  • 送快递的最短路线

    千次阅读 2018-07-20 18:11:14
    题目描述:某物流派送员p,需要给a、b、c、d4个快递点派送包裹,请问派送员需要选择什么的路线,才能完成最短路程的派送。假设如图派送员的起点坐标(0,0),派送路线只能沿着图中的方格边行驶,每个小格都是正方形,...
  • 数据结构与算法\数据结构及算法经典\问题算法\动态计算网络最长最短路线.c
  • VJudge:,迷宫问题,0表示可以通过,1表示墙,BFS找最短路径。
  • 知识点最短路线问题 1如图小明到小丽家有四条路其中路程最短的是( ) A B C D;精品资料; 你怎么称呼老师 如果老师最后没有总结一节课的重点的难点你是否会认为老师的教学方法需要改进 你所经历的课堂是讲座式还是讨论...
  • 使用Qt做的演示程序~ 时间是大二下学期的算法分析实践环节。采用Floyd方法求解最短行驶路线问题
  • 求棋盘的最短路径问题,BFS遍历,这题就是马跳日的为题,不难,倒是我把x,y轴搞反了浪费了良久的时间查看为什么数组越界 import org.junit.Test; import java.util.LinkedList; class Point { int x; int y; ...
  • 如何在二维数组中寻找最短路线 腾讯笔试题 题目描述: 寻找一条从左上角arr[0][0]到右下角arr[m-1][n-1]的路线,使得沿途经过的数组中的整数的和最小。 分析与解答: 对于这道题,可以从右下角开始倒着来分析这个问题:...
  • 迷宫问题Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 31050 Accepted: 17826Description定义一个二维数组:int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1...
  • 问题 D: 最短路径问题 题目描述 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。 输入 输入n,m,点的...
  • 所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? 输入说明 : 输入第一行为T,表示T组数据 每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的...
  • 数学建摸 最了解最短路的算法及其应用 图 论 的 基 本 概 念 建模案例:最优截断切割问题

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,957
精华内容 782
关键字:

最短路线问题