【算法设计与分析】基于Go语言实现贪心法解决TSP问题

一、前言

        本文以上文动态规划法为基础按照相似的输入来完成编程。

二、代码思路

        因为是贪心法,直接去找离目前正在遍历的点最近的点,因此输入了一个二维矩阵,咱们还需要设置一个一维数组来存/检验是否遍历过点,遍历过就不要再算了。并再设置一个一维数组,存这个点的前驱,方便最后输出结果。

        由于贪心法比较符合人类正常思维方式,比较简单,不再赘述,直接上代码。

package main

import "fmt"

func main() {
	var N int
	fmt.Print("请输入(城市)点数: ")
	fmt.Scanln(&N)
	arc := make([][]int, N) //那个矩阵
	for i := 0; i < N; i++ {
		arc[i] = make([]int, N)
	}

	flag := make([]bool, N) //是否遍历了的矩阵
	fin := make([]int, N+1) //存最终结果
	finSum := 0
	for i := 0; i < N; i++ {
		flag[i] = false
		fin[i] = -1
	}

	// 从控制台读取二维数组的值
	fmt.Println("请输入二维数组的元素,每行输入完毕后空格按回车键:")
	for i := 0; i < N; i++ {
		for j := 0; j < N; j++ {
			var putin int
			fmt.Scanf("%d", &putin)
			if putin == 0 {
				putin = 2004
			}
			arc[i][j] = putin
		}
		fmt.Scanln() // 跳过每行输入后的换行符
	}
	//fmt.Println(arc)

	var start int
	fmt.Print("请输入起点城市id(从1开始): ")
	fmt.Scanln(&start)

	fin[0] = start
	flag[start-1] = true
	dot := start - 1 //正在查找的基准点
	for i := 0; i < N; i++ {
		min := 100
		flagPoint := -1
		for j := 0; j < N; j++ {
			if flag[j] == true {
				continue
			}
			if arc[dot][j] < min {
				min = arc[dot][j] //寻找和i最近的点
				flagPoint = j
			}
		}
		if flagPoint == -1 {
			break
		}
		finSum += min
		flag[flagPoint] = true   //证明检查过了
		fin[i+1] = flagPoint + 1 //加入最终答案路径
		dot = flagPoint
		fmt.Println(fin[i], "->", fin[i+1])
	}


	fin[N] = start //补充回到起点
	fmt.Println(fin[N-1], "->", fin[N])

	finSum += arc[fin[N]-1][fin[N-1]-1]

	fmt.Println(finSum)
	fmt.Println(fin)

}

/*

5
0 3 3 2 6
3 0 7 3 2
3 7 0 2 5
2 3 2 0 3
6 2 5 3 0

*/

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值