中北大学算法分析与设计实验报告五(贪心算法)
1.实验名称
实验五 贪心算法实验
2.实验目的
题目1 贪心算法解决TSP问题
(1)掌握贪心法的设计思想;
(2)掌握TSP问题的具体实现过程;
(3)熟练掌握二维数组的使用方法;
(4)在掌握的基础上编程实现TSP问题的具体实现过程。
3.训练知识点集群
(1)根据实验内容设计算法伪代码进行算法描述;
(2)利用C++/C/Java等编程语言对算法伪代码进行工程化实现;
(3)输入测试用例对算法进行验证;
(4)列出算法时间复杂度模型并与计算机运行统计时间进行对比分析。
4.实验内容
给出n个城市及任意两城市间的距离,要求旅行家在旅行者n个城市时,各个城市经历且仅经历一次然后回到出发城市,使得所走的路径最短。输出结果,输出时要求有文字说明。请任选一种语言编写程序实现上述算法,并分析其算法复杂度。
5.实验原理
最近邻点策略:从任意城市出发,每次在没有到过的城市中选择最近的一个,直到经过了所有的城市,最后回到出发城市。
设图G有n个顶点,边上的代价存储在二维数组w[n][n]中,集合V存储图的顶点,集合P存储经过的边,最近邻点策略求解 TSP 问题的算法如下:
(1).P={};
(2).V=V-{u0};u=u0;//从顶点u0出发
(3).循环直到集合P中包含n-1条边
3.1查找与顶点u邻接的最小代价边(u,v)并且v属于集合V;
3.2 P=P+{(u,v)};
3.3 V=V-{v};
3.4 u=v;//从顶点v出发继续求解
时间复杂度为O(n^2)
6.源代码实现
#include<stdio.h>
const int n = 5;
const int max = 100;
int TSP1 (int arc[n][n], int w) {
int edgeCount = 0, TSPLength = 0;
int min, u, v;
int flag[n] = {0};//顶点均未加入哈密顿回路
u = w ;
flag[w] = 1;
while (edgeCount < n-1){ //循环直到边数等于 n-1
min = 100;
for (int j = 0; j < n ; j++) { //求 arc[u]中的最小值
if ((flag[j] == 0)&&(arc[u][j] != 0)&&(arc[u][j] < min)){
v = j;
min = arc[u][j];
}
TSPLength += arc[u][v];
flag[v] = 1;
edgeCount++; //将顶点加入哈密顿回路
printf ("%d-->", u+1); //输出经过的路径
u = v;
}
printf ("%d-->%d\n", v+1, w+1); //输出最后的回边
return (TSPLength + arc[v][0]);
}
}
int main () {
int arc[n][n] = {{max, 3, 3, 2, 6}, {3, max, 7, 3, 2}, {3, 7, max, 2, 5},
{2, 3, 2, max, 3}, {6, 2, 5, 3, max} };
printf ("最短路径是:");
int minDist = TSP1(arc, 0);
printf ("最短哈密顿回路的长度是:%d\n", minDist);
return 0;
}
7.实验结论及心得体会
通过本次实验,理解了贪心法的设计思想,学会了TSP问题的具体实现过程,掌握了二维数组的使用方法。