中北大学算法分析与设计实验报告五(贪心算法)

中北大学算法分析与设计实验报告五(贪心算法)

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问题的具体实现过程,掌握了二维数组的使用方法。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘埃的塵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值