纸上谈兵 最短路径与贪婪.docx
《纸上谈兵 最短路径与贪婪.docx》由会员分享,可在线阅读,更多相关《纸上谈兵 最短路径与贪婪.docx(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、图是由节点和连接节点的边构成的。节点之间可以由路径,即边的序列。根据 路径,可以从一点到达另一点。在一个复杂的图中,图中两点可以存在许多路 径。最短路径讨论了一个非常简单的图论问题,图中从A点到B点,那条路 径耗费最短?这个问题又异常复杂,因为网络的构成状况可能很复杂。一个最简单的思路,是找出所有可能的从A到B的路径,再通过比拟,来寻找最短路径。然而,这并没有将问题简化多少。因为搜索从A到B的路径,这本 身就是很复杂的事情。而我们在搜索所有路径的过程中,有许多路径已经绕了状态距离A0C1D邻接6E邻接9P邻接4第二步状态距离A0C1D邻接6E邻接7状态距离P4第三步状态距离A0C1D6E邻接7
2、P4最后,E成为。倒退,可以知道路径为E, P, C, Ao正过来,就是从A到E 的最短路径了。上面的算法是经典的Dijkstra算法。本质上,每个邻接点记录的,是基于 点的情况下,最好的选择,也就是所谓的“贪婪算法(greedy algorithm)o 当我们贪婪时,我们的决定是临时的,并没有做出最终的决定。转换某个点成 为点后,我们增加了新的可能性,贪婪再次起作用。根据比照。随后,某 个邻接点成为新的贪无可贪”的点,即经由其它任意邻接点,到达该点都只 会造成更高的本钱;经由未知点到达该点更不可能,因为未知点还没有开放, 必然需要经过现有的邻接点到达,只会更加绕远。好吧,该点再也没有贪婪的
3、动力,就被扔到“成功人士”里,成为点。成功学不断传染,最后感染到 目标节点B ,我们就找到了 B的最短路径。实现理解了上面的原理,算法的实现是小菜一碟。我们借用图(graph)中的数据结 构,略微修改,构建加权图。我们将上面的表格做成数组records ,用于记录路径探索的信息。重新给点A,C,D,E,P命名,为A 1, 2, 3, 40代码如下:/* By Vamei */ftinclude ftinclude ftdefine NUM_V 5ttdefine INFINITY 10000typedef struct node position;typedef struct record *
4、label;/* node */struct node int element;position next;int weight;);/* table element, keep record */struct record int status;int distance;int previous;/* operations (stereotype)*/void insert_edge(position, int, int, int);void print_ graph(position, int);int new neighbors(position, label, int, int);vo
5、id shortest_path(position, label, int, int, int);/* for testing purpose */void main()(struct node graphNUM_V;struct record recordsNUM_V;int i;/ initialize the verticesfor(i=0; ielement = i;(graph+i)-next = NULL;(graph+i)-weight =-1;/ insert edgesinsert_edge(graph,0,1,1);insertedge(graph,0,2,6);inser
6、t_edge(graph, 0, 3, 9);insert edge (graph, 1, 4, 3);insert_edge(graph, 4, 3, 3);print_graph(graph, NUM_V);/ initialize the bookfor (i=0; istatus =-1;(records+i)-distance = INFINITY;(records+i)-previous =-1;shortest_path(graph, records, NUM_V, 0, 3);/)void shortest_path(position graph, label records,
7、 int nv, int start, int end) int current;(records+start)-status二 1;(records+start)-distance = 0;(records+start)-previous = 0;current = start;while(current != end) current = newneighbors(graph, records, nv, current);while (current != start) printf (,z%d一 ,current);current = (records+current)-previous
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 纸上谈兵 最短路径与贪婪 路径 贪婪
限制150内