「已注销」 2021-12-19 18:16 采纳率: 0%
浏览 82
已结题

对TSP问题,分别运用全局遍历最优策略和贪心策略,编写C语言应用程序予以实现

对TSP问题,分别运用全局遍历最优策略和贪心策略,编写C语言应用程序予以实现,要求如下。
(1) 分别设计5个城市和10个城市的数据,予以验证(2分)。
(2) 给出数据结构设计(最优化3分,贪心3分)。
(3) 最优化和贪心策略的源程序(程序设计规范,变量名见名知义,以英文单词命名,首字母大写,单词组合以下划线分割,加上程序运行的开始和结束时标,从而计算出程序运行的时间(最优化2分,贪心2分)。
(4)基于10个城市的数据,给出运行结果的屏幕截屏,并对比2种策略的时间性能(3分)。

  • 写回答

4条回答 默认 最新

  • IT_心如止水 2021-12-22 17:53
    关注
    获得6.00元问题酬金

    补充一下题主的问题:
    TSP问题(Travelling Salesman Problem)即旅行商问题。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。从图论的角度来看,该问题实质是给定一个带权完全无向图(顶点表示城市,边表示道路,权重是道路的成本或距离),找一个权值最小的 Hamilton 回路。
    数据的话,可以直接在网上下载,


    贪心算法,顾名思义就是用每一步的最优解代替整体的最优解(显然,这个不一定成立)。对于TSP问题,就是在当前节点下遍历所有能到达的下一节点,选择距离最近的节点作为下一节点。
    代码如下:

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<math.h>
    #include<stdlib.h>
    #include<time.h>
    
    // 城市数量 N
    #define N 10
    // 城市距离矩阵
    int distance[N][N];
    
    
    void init()
    {
        //城市的 x 和 y 坐标
        int x[N] = { 0 };
        int y[N] = { 0 };
        //从 data.txt 文件读取数据
        FILE* fp;
        if ((fp = fopen("..//att10.txt", "r")) == NULL)
            //if ((fp = fopen("..//kroB100.txt", "r")) == NULL)
        {
            printf("can not open the file!");
            exit(0);
        }
        while (!feof(fp))
        {
            int count;
            fscanf(fp, "%d", &count);
            fscanf(fp, "%d%d", &x[count - 1], &y[count - 1]);
        }
        fclose(fp);
        //计算城市之间距离
        for (int i = 0; i < N - 1; i++)
        {
            distance[i][i] = 0;                // 对角线为0
            for (int j = i + 1; j < N; j++)
            {
                double dis = sqrt((pow((double)x[i] - x[j], 2) / 10 + pow((double)y[i] - y[j], 2) / 10));
                int disInt = (int)dis;
                distance[i][j] = dis == disInt ? disInt : disInt + 1;
                distance[j][i] = distance[i][j];
            }
        }
        distance[N - 1][N - 1] = 0;
    }
    
    /***********************************************************************
     * Function   :TSPGreedyAlgorithm()
     * Description:贪心策略求解 TSP 问题
     * Input      :void
     * Output     :TSP 路径和对应的总距离
     * Return     :void
     ***********************************************************************/
    void TSPGreedyAlgorithm()
    {
        //总路程
        int totalDistance = 0;        
        //默认从 0 开始遍历
        int current = 0;    
        //标识城市是否被访问,访问过置为 1
        bool visit[N] = { false };
        visit[0] = 1;
        printf("TSP 路径为:%d ->", 1);
    
        //遍历 N - 1 次
        for (int i = 1; i < N; i++)
        {
            //设置较大的距离初始值用来选取最近邻
            int min_distance = 0x7fffffff;
            //保存当前最近邻城市
            int temp;
            //循环选取城市
            for (int j = 1; j < N; j++)
            {
                if (!visit[j] && distance[current][j] < min_distance)
                {
                    min_distance = distance[current][j];
                    temp = j;
                }
            }
            visit[temp] = 1;
            current = temp;
            totalDistance += min_distance;
            printf(" %d ->", temp + 1);
        }
        totalDistance += distance[current][0];
        printf(" %d\n", 1);
        printf("TSP 总距离为:%d\n", totalDistance);
    }
    
    int main()
    {
        init();
        TSPGreedyAlgorithm();
        return 0;
    }
    
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 12月27日
  • 创建了问题 12月19日