本文主要是介绍【算法设计与分析】基于Go语言实现贪心法解决TSP问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、前言
本文以上文动态规划法为基础按照相似的输入来完成编程。
二、代码思路
因为是贪心法,直接去找离目前正在遍历的点最近的点,因此输入了一个二维矩阵,咱们还需要设置一个一维数组来存/检验是否遍历过点,遍历过就不要再算了。并再设置一个一维数组,存这个点的前驱,方便最后输出结果。
由于贪心法比较符合人类正常思维方式,比较简单,不再赘述,直接上代码。
package mainimport "fmt"func main() {var N intfmt.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 := 0for i := 0; i < N; i++ {flag[i] = falsefin[i] = -1}// 从控制台读取二维数组的值fmt.Println("请输入二维数组的元素,每行输入完毕后空格按回车键:")for i := 0; i < N; i++ {for j := 0; j < N; j++ {var putin intfmt.Scanf("%d", &putin)if putin == 0 {putin = 2004}arc[i][j] = putin}fmt.Scanln() // 跳过每行输入后的换行符}//fmt.Println(arc)var start intfmt.Print("请输入起点城市id(从1开始): ")fmt.Scanln(&start)fin[0] = startflag[start-1] = truedot := start - 1 //正在查找的基准点for i := 0; i < N; i++ {min := 100flagPoint := -1for 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 += minflag[flagPoint] = true //证明检查过了fin[i+1] = flagPoint + 1 //加入最终答案路径dot = flagPointfmt.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*/
这篇关于【算法设计与分析】基于Go语言实现贪心法解决TSP问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!