摘要:动态规划算法是一种研究多阶段决策问题的算法.用动态规划方法求最短路问题,要求所求问题具有明显的阶段。该文以动态规划理论为指导,研究了动态规划算法求解最短路径的基本原理及步骤,编写了基于动态规划算法的C语言程序,辅助完成最短路径的求解。

关键词:最短路径;动态规划;C 语言编程

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)09-2191-03

1 概述

数学源于生活,又服务于生活.它是一门研究现实世界中的数量关系与空间形式的学科.当今社会,随着物质水平的不断提高,生活需求的不断扩大,自然资源的不断开发利用.像天然气管道铺设问题,厂区布局问题,旅行费用最小问题等都已成为我们平时经济生活中的普遍问题.它们其实都可以化归为最短路线问题,而最短路问题实质上是一个组合优化问题[1]。

动态规划方法主要是研究与解决多阶段决策过程的最优化问题,它将求解分成多阶段进行,不但求出了全过程的解,还能求出后部子过程的一组解,在求解一些生活实际问题时,更显其优越性。为了快速、简单的计算最短路径,节约运输时间与成本,该文利用动态规划的思想编写了C语言程序,解决物流运输过程中多地点的最短路径的选择问题。

2 最短路径问题

2.1 最短路径问题算法的基本思想

在求解网络图上节点间最短路径的方法中,目前国内外一致公认的较好算法有迪杰斯特拉(Dijkstra)及弗罗伊德(Floyd)算法。这两种算法中,网络被抽象为一个图论中定义的有向或无向图,并利用图的节点邻接矩阵记录点间的关联信息。在进行图的遍历以搜索最短路径时,以该矩阵为基础不断进行目标值的最小性判别,直到获得最后的优化路径[2]。

Dijkstra算法是图论中确定最短路的基本方法,也是其它算法的基础。为了求出赋权图中任意两结点之间的最短路径,通常采用两种方法。一种方法是每次以一个结点为源点,重复执行Dijkstra算法n次。另一种方法是由Floyd于1962年提出的Floyd算法,其时间复杂度为[On3],虽然与重复执行Dijkstra算法n次的时间复杂度相同,但其形式上略为简单,且实际运算效果要好于前者。

2.2 最短路径问题算法的基本步骤[3]

这样经过有限次迭代则可以求出[v1]到[vn]的最短路线。

(2)Floyd算法的基本步骤

(3)动态规划算法基本步骤

我们将具有明显的阶段划分和状态转移方程的规划称为动态规划[1]。在解决多个阶段决策问题时采用动态规划法是一个很有效的措施,同时易于实现。

根据动态规划的基本概念,可以得到动态规划的基本步骤:1)确定问题的决策对象。2)对决策过程划分阶段。3)对各阶段确定状态变量。4)根据状态变量确定费用函数和目标函数。5)建立各阶段状态变量的转移过程,确定状态转移方程。

根据动态规划的基本模型,确定用动态规划方法解题的基本思路,是将一个[n]阶段决策问题转化为一次求解[n]个具有递推关系的单阶段的决策问题,以此来简化计算过程.其一般步骤如下:

用于衡量所选决策优劣的函数称为指标函数.指标函数有有阶段的指标函数和过程的指标函数之分.阶段的指标函数是对应某一阶段状态和从该状态出发的一个阶段的某种效益度量,用[vkxk,uk]表示。在本文里用[dkxk,uk]来表示某一阶段的决策的最短路径。过程的指标函数是指从状态[xn(k=1,2,...,n)]出发至过程最终,当采取某种子策略时,按预定的标准得到的效益值。这个值既与[xk]本身的状态值有关,又与[xk]以后所选取的策略有关,它是两者的函数值,记作[dk,nxk,uk,xk+1,uk+1,…xn,un]。过程的指标函数又是它所包含的各阶段指标函数的函数。本文研究的过程的的指标函数是其各阶段指标函数的和的形式.当[xk]的值确定后,指标函数的值就只同k阶段起的子策略有关。对应于从状态[xk]出发的最优子策略的效益值记作[fkxk],于是在最短路问题中,有[fkxk=mindk,n]。动态规划求解最短路径程序流程图如图2所示。

3 最短路径态规划实际应用举例

设某物流配送网络图由12个配送点组成,点1为配送中心起点,12为终点,试求自终点到图中任何配送点的最短距离。图中相邻两点的连线上标有两点间的距离[4]。

首先用动态规划法来讨论图3的最短路径,由图可知:

1)集合[ξ4]中有点9、10、11,它们在一步之内可到达点12;

2)集合[ξ3]中有点6,7,8,它们不超过两步就可达到点12;

3)集合[ξ2]中包括点 2、3、4、5,不超过三步就可到达点12;

4)集合[ξ1]中包括点1,不超过四步可到达点12;

按照动态规划法类推,得到最优路径长为16,径路通过点为1,2,7,10,12和1,3,6,10,12。

根据动态规划算法编写C语言计算程序[5] [6],计算得到实验结果如下图4所示:

由图4可以看出程序得到的结果与本文推出的结果一样。证明了本文编写的C语言程序是正确的。

4 结束语

综上所述,用动态规划解决多阶段决策问题效率高,而且思路清晰简便,同时易于实现.我们可以看到,动态规划方法的应用很广泛,已成功解决了许多实际问题,具有一定的实用性。此种算法我们用动态规划思想来编程,并解决相应的问题,其在 VC 环境下实现,能方便快速的计算出到达目的地的最短距离及路径,节省更多的运输时间与成本。不过,该文只考虑了动态规划算法在生活中的简单运用,在实际生活中可能存在多个目的地或者更复杂的情况.因此我们可以考虑将其进行改进或者结合启发式算法,使之更好的运用在实际生活中,这有待于以后的继续研究。

参考文献:

[1] 杜彦娟.利用动态规划数学模型求解最短路径[J].煤炭技术,2005(1):94-95.

[2] 蒋琦玮,陈治亚.物流配送最短径路的动态规划方法研究[J].系统工程,2007(25):27-29.

[3] 朱建民.运筹学——典型例题与解法[EB/OL].http:///,2003.

c语言起点到目的地方法数,最短路径动态规划问题及C语言实现探讨相关推荐

  1. 简单最短路径问题编程c语言,最短路径动态规划问题及C语言_实现.pdf

    第33卷 第2期 内 蒙 古 农 业 大 学 学 报 V01.33 No.2 2012年 3月 Mar.2012 Journalof Inner Mongolia AgriculturalUniver ...

  2. Algorithm:C++语言实现之队列相关算法(最短路径条数问题、拓扑排序)

    Algorithm:C++语言实现之队列相关算法(最短路径条数问题.拓扑排序) 目录 队列 1.最短路径条数问题 2.拓扑排序 队列 1.最短路径条数问题

  3. 【动态规划】引例--多起点,多终点的最短路径问题

    多起点,多终点的最短路径问题 问题背景 蛮力算法 动态规划 求解过程 总结归纳及时间复杂度分析O(mn)O(mn)O(mn) 问题背景 在实例中经常会遇到路径选择问题,n个起点S1,S2,...,SN ...

  4. 初始C语言——梦启程的地方

    目录 前言 正文 数据类型 变量 命名规则 分类 注意 ​常量 分类 字符串 转义字符 ​注释 C语言的注释风格 C++的注释风格 选择语句 if语句 循环语句 while 循环 函数 数组 ​操作符 ...

  5. 【C语言从青铜到王者】第零篇·与C语言来个约会

    系列介绍 本系列博客是博主自己的C语言学习笔记,分享出来即是为了整理学过的知识也希望帮助每一位零基础小白上手C语言.系列更新速度即为博主学习速度,如有错误疏漏,请务必及时指出!博主也会不定期的重新编辑 ...

  6. 10万字C语言入门手册,历时三个月,详细的C语言教程终于出炉了,给你全新C语言入门体验

    C语言是一种非常流行的编程语言,它是许多现代编程语言的基础. 什么是计算机? 计算机是一种用于存储.处理.和输出数据的电子设备.它通过程序控制和数学算法来实现数据处理.计算机通过输入设备(如键盘.鼠标 ...

  7. java和c语言的区别_C语言为何不会过时?你需要掌握多少种语言?

    关注.星标公众号,不错过精彩内容 整理/排版:付斌 转自:嵌入式ARM 01 为什么C语言不会过时 评价任何一门编程语言,都是招人骂的.永远是这样.就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过 ...

  8. C语言为何不会过时?你需要掌握多少种语言?

    01为什么C语言不会过时 评价任何一门编程语言,都是招人骂的.永远是这样.就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:"傻逼!"这个在心 ...

  9. c语言职专试题及答案,中等职业学校计算机应用专业c语言编程基础科试卷及答案.doc...

    中等职业学校计算机应用专业c语言编程基础科试卷及答案.doc 中等职业学校计算机应用专业C语言编程基础科试卷及答案一.填空(共35分)1.Unix系统诞生于 年,是由 实验室的K和用汇编语言开发成功的 ...

  10. C语言不好应该转专业吗,转专业后对于C语言补修的一些体会(1)

    在转入软件工程后,原来的C语言程序设计只有三学分,而信息学院的C语言程序设计有四学分.迫于无奈的我只能再补修一遍C语言,自我认为大一对于C语言的学习已经基本足够,但我发现信息学院用的是不一样的书后,对 ...

最新文章

  1. java service注入失败,使用spring向service里面注入dao不成功。
  2. linux 下oracle 的kernel.shmmax,Linux 下kernel.shmmax 的设置问题
  3. containers文件夹可以删除吗_电脑进行C盘清理,appdata文件夹可以删除吗?
  4. aspose java_Aspose.Cells for Java
  5. 音频处理基本概念及音频重采样
  6. Reflux系列01:异步操作经验小结
  7. mysql002创建表
  8. java类可选,java – 是否有类可选,但非可选的类?
  9. 小动画制作 图片盒子配合定时器 winform 114869633
  10. java json解码器_Jackson:我是最牛掰的 Java JSON 解析器(有点虚)
  11. c语言累积乘,C语言编程累积2
  12. 开课吧9.9元学python靠谱吗-quot;我,90 后,月薪 5k,副业 2w ”年轻人搞副业到底有多野?...
  13. Linux不重启Tomcat清空catalina.out日志的几种方法
  14. cadnaa噪声分析测试软件,Cadna/A软件介绍
  15. 输入法编程之 光标跟随
  16. 计算机端口错误678,Win8宽带连接出现错误678的解决方法
  17. 一款可以帮助你处理文字、编写内容等办公软件-Word 2013 提供下载
  18. 【深度学习】SSD网络原理
  19. Linux 性能测试工具 sysbench 的安装与简单使用 1
  20. 【狗狗分类项目】(3)扩展数据集:斯坦福kaggle数据库

热门文章

  1. java配置环境变量无效
  2. 网络工程师linux题,历年软考网络工程师Linux真题详解
  3. 人民币转换美金的c语言代码大全,C语言 人民币转换代码
  4. JDBC:java数据库连接对象
  5. 股票历史数据-A股所有股票历史数据下载
  6. win10如何禁用\删除讨厌的ff新鲜事(ff新推荐)(flash弹窗广告)
  7. 总结一下r包手动安装R包 r包安装r语言从网页下载东西内容 r安装特定版本的r包 r从网页下载 安装包 指定安装位置r
  8. 多智能体通信:MAGNet用于深度多智能体强化学习的多智能体图网络
  9. delphi2010 窗体使用技能总结
  10. 网页爬虫工具BeautifulSoup使用总结