数据结构课设_TSP贪心算法

合集下载

TSP问题的近似算法

TSP问题的近似算法

TSP问题的近似算法近似算法是解决优化问题的一种有效方法,它可以在较短时间内得到一个接近最优解的解,而不是花费大量时间去寻找最优解。

TSP问题(Traveling Salesman Problem)是一个经典的优化问题,它的目标是找到一条经过所有城市的最短路径。

这个问题是一个经典的NP难题,意味着在合理的时间内找到准确的最优解是不可能的,最多只能得到近似解。

因此,近似算法在TSP问题中具有重要的应用价值。

常见的近似算法包括贪心算法、局部搜索算法、动态规划算法等。

下面我们将介绍其中几种经典的算法。

1. 贪心算法贪心算法是一种基于贪心策略的近似算法。

它的基本思想是每次选择当前最优解,直到得到一个接近最优解的解。

在TSP问题中,贪心算法的思路是从起点出发,每次选择距离当前城市最近的城市,直到遍历所有城市。

但是这种贪心策略往往不能得到最优解,因为它可能陷入局部最优解。

2. 局部搜索算法局部搜索算法是一种基于局部优化的近似算法。

它的基本思想是从一个随机的解出发,不断地进行局部搜索,直到得到一个接近最优解的解。

在TSP问题中,局部搜索算法的思路是从一个随机的解出发,通过交换城市的顺序来不断优化当前解,直到达到一定的迭代次数或无法继续优化为止。

这种算法的优点是效率高,缺点是易陷入局部最优解。

3. 动态规划算法动态规划算法是一种基于状态转移的近似算法。

它的基本思想是将一个复杂问题分解成若干个子问题,通过按顺序解决子问题来求解原问题。

在TSP问题中,动态规划算法通过定义状态、状态转移方程和初始状态来求解最短路径。

其时间复杂度为O(n^2*2^n),因此不适用于大规模的问题。

总结以上是常见的几种近似算法,在实际运用中可以根据问题的特点选择合适的算法。

虽然这些算法不能得到准确的最优解,但它们可以在短时间内得到一个接近最优解的解,具有重要的实际应用价值。

贪心算法基本步骤

贪心算法基本步骤

贪心算法基本步骤贪心算法是一种非常常用的算法思想,广泛应用于算法设计中。

本文将介绍贪心算法的基本步骤、实现方式、应用场景以及优缺点。

一、基本步骤贪心算法的基本步骤可概括为:定义最优解的性质->利用贪心策略获得局部最优解->将局部最优解合并成一个整体最优解。

具体来说,一般包括以下几个步骤:1. 确定问题的最优解性质:要知道问题的最优解应该具有怎样的性质或特征,这些性质可以用于判断一个解是否符合规则或结果是否符合要求。

2. 构造候选解集:根据最优解的性质,不断构造可行的候选解集合,并通过一定的方法筛选出其中的解。

3. 选择最优解:从候选解集中选择一个最优解。

4. 验证最优解:通过验证最优解是否合法(满足约束条件)以及是否为问题的最优解,来验证贪心策略的正确性。

二、实现方式贪心算法的实现方式是比较灵活的,有些问题可以通过贪心策略来解决,有些则不行。

一般而言,如果问题的最优解具有贪心选择性质(即每一步的局部最优解能导致全局最优解),则采用贪心策略是可行的。

对于一些场景,我们可以通过规律来得到贪心策略。

例如:1. 集合覆盖问题:从未被覆盖的地方中选择一个覆盖点集最大的点,并删除所有覆盖的集合;2. 分数背包问题:选择性价比最高的物品,先吸纳尽量多的物品,再考虑其他物品。

三、应用场景1. 背包问题:针对背包问题和其变种,常见的贪心策略有分数背包(与完全和01背包有区别)和完全背包问题;2. 活动安排问题:在一些课程、项目或活动间选择,使得能够安排最多活动;3. 区间选择问题:在一些区间间选择相互不重叠的区间,使得能够选出最大的区间数;4. 集合覆盖问题:在一些集合中选择最少的集合,使得能够覆盖所有元素。

四、优缺点优点:1. 算法简单:贪心算法通常比较简单,易于理解和实现;2. 运算速度快:其时间复杂度一般较低,运算速度很快;3. 可以作为其他算法的优化:贪心策略可以应用于其他算法的优化中。

缺点:1. 不一定能够得到最优解:贪心策略仅考虑当前的局部最优解,对于全局最优解可能产生影响;2. 单一性:贪心算法的结果是唯一的,难以应对变化条件的需要,一旦局部最优解不满足当前的情况,算法就会失去原先的效果;3. 实现困难:对于有些问题,贪心算法并不是很好实现,涉及到更多的问题分析和模型的构造。

信息技术作业设计一个高效的算法以解决实际生活中的问题

信息技术作业设计一个高效的算法以解决实际生活中的问题

信息技术作业设计一个高效的算法以解决实际生活中的问题在当代社会,信息技术已经渗透到了我们生活的方方面面。

人们越来越依赖于信息技术来解决实际生活中的问题。

然而,随着问题的复杂性和数据的增长,如何设计一个高效的算法来解决这些问题成为一个重要的挑战。

本文将介绍如何设计一个高效的算法以解决实际生活中的问题,并讨论该算法的应用。

一、问题描述我们选择一个普遍的实际生活问题作为例子:旅行销售员问题。

假设有一个旅行销售员需要拜访N个城市的客户,他想寻找一条最短的路径,从起始城市出发,经过每个城市并返回起始城市。

这可以被视为一个典型的旅行商问题。

二、算法设计为了解决旅行销售员问题,我们可以采用著名的TSP近似算法——贪心算法。

贪心算法是一种通过每一步的局部最优解来求得整体最优解的方法。

具体的算法步骤如下:1. 选择一个起始城市作为起点,并将其标记为已访问。

2. 从当前城市出发,选择下一个最近的未访问城市,并将其标记为已访问。

3. 重复步骤2,直到所有城市都被访问过。

4. 返回到起始城市的路径,并计算路径的总长度。

三、算法实现为了实现这个算法,我们需要先计算两个城市之间的距离。

这可以通过使用地理信息系统(GIS)数据来获取城市之间的经纬度,并利用距离公式来计算两个城市之间的距离。

然后,我们可以使用一个数组来存储城市之间的距离。

在实际的代码实现中,我们可以使用编程语言如Python来编写算法。

以下是一个简单的Python代码示例:```pythondef tsp_solver(locations):# calculate distances between citiesdistances = calculate_distances(locations)# start from the first citypath = [0]# mark the first city as visitedvisited = [True] + [False] * (len(locations)-1)# iterate through all citiesfor _ in range(len(locations)-1):current_city = path[-1]min_distance = float('inf')next_city = None# find the closest cityfor i in range(len(locations)):if not visited[i] and distances[current_city][i] < min_distance: min_distance = distances[current_city][i]next_city = i# update path and visited listpath.append(next_city)visited[next_city] = True# return to the first citypath.append(0)return path# example usagelocations = [(0, 0), (1, 1), (2, 2), (3, 3)]path = tsp_solver(locations)print(path)```四、算法应用该算法可以应用于实际生活中的许多场景,例如物流和交通规划、城市旅游规划、电路板设计等。

tsp问题课程设计

tsp问题课程设计

tsp问题课程设计一、教学目标本节课的教学目标是让学生掌握TSP问题(旅行商问题)的基本概念、求解方法和应用场景。

通过本节课的学习,学生应能够:1.理解TSP问题的定义和意义;2.掌握TSP问题的求解方法,如贪心算法、动态规划等;3.能够运用TSP问题解决实际应用场景,如物流配送、路径规划等;4.培养学生的逻辑思维能力和问题解决能力。

二、教学内容本节课的教学内容主要包括以下几个部分:1.TSP问题的定义和意义:介绍TSP问题的背景和定义,解释TSP问题在实际应用中的重要性;2.TSP问题的求解方法:介绍贪心算法和动态规划两种常用的TSP问题求解方法,并通过实例进行讲解;3.TSP问题的应用场景:结合实际应用场景,如物流配送、路径规划等,让学生了解TSP问题的应用价值;4.案例分析:通过分析具体案例,让学生学会如何运用TSP问题解决实际问题。

三、教学方法为了激发学生的学习兴趣和主动性,本节课将采用多种教学方法:1.讲授法:教师通过讲解TSP问题的定义、求解方法和应用场景,为学生提供系统的知识框架;2.讨论法:学生分组讨论实际应用场景,分享各自的见解和思考,培养学生的沟通能力和团队协作精神;3.案例分析法:教师提出具体案例,学生分组讨论并给出解决方案,培养学生的问题解决能力;4.实验法:学生在实验室进行编程实践,亲自尝试求解TSP问题,增强实践操作能力。

四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:《算法导论》、《运筹学》等相关教材,为学生提供理论知识的学习参考;2.参考书:提供相关的学术论文、书籍,帮助学生深入了解TSP问题的研究现状和发展趋势;3.多媒体资料:制作PPT、教学视频等多媒体资料,为学生提供直观的学习体验;4.实验设备:提供计算机、编程环境等实验设备,让学生能够进行实际的编程实践。

五、教学评估本节课的评估方式将包括以下几个方面:1.平时表现:通过观察学生在课堂上的参与程度、提问回答等情况,评估学生的学习态度和积极性;2.作业:布置与TSP问题相关的作业,评估学生对知识点的理解和应用能力;3.考试:设计考试题目,涵盖TSP问题的定义、求解方法和应用场景等,全面评估学生的学习成果;4.案例分析报告:评估学生在案例分析中的问题解决能力和团队协作精神。

基于贪心算法求解TSP问题(JAVA)

基于贪心算法求解TSP问题(JAVA)

基于贪⼼算法求解TSP问题(JAVA)概述前段时间在搞贪⼼算法,为了举例,故拿TSP来开⼑,写了段求解算法代码以便有需之⼈,注意代码考虑可读性从最容易理解⾓度写,没有优化,有需要可以⾃⾏优化!详细代码下载:前段时间在搞贪⼼算法,为了举例,故拿TSP来开⼑,写了段求解算法代码以便有需之⼈,注意代码考虑可读性从最容易理解⾓度写,没有优化,有需要可以⾃⾏优化!⼀、TPS问题TSP问题(Travelling Salesman Problem)即旅⾏商问题,⼜译为旅⾏推销员问题、货郎担问题,是数学领域中著名问题之⼀。

假设有⼀个旅⾏商⼈要拜访n个城市,他必须选择所要⾛的路径,路径的限制是每个城市只能拜访⼀次,⽽且最后要回到原来出发的城市。

路径的选择⽬标是要求得的路径路程为所有路径之中的最⼩值。

TSP问题是⼀个组合优化问题。

该问题可以被证明具有NPC计算复杂性。

TSP问题可以分为两类,⼀类是对称TSP问题(Symmetric TSP),另⼀类是⾮对称问题(Asymmetric TSP)。

所有的TSP问题都可以⽤⼀个图(Graph)来描述:V={c1, c2, …, ci, …, cn},i = 1,2, …, n,是所有城市的集合.ci表⽰第i个城市,n为城市的数⽬;E={(r, s): r,s∈ V}是所有城市之间连接的集合;C = {crs: r,s∈ V}是所有城市之间连接的成本度量(⼀般为城市之间的距离);如果crs = csr, 那么该TSP问题为对称的,否则为⾮对称的。

⼀个TSP问题可以表达为:求解遍历图G = (V, E, C),所有的节点⼀次并且回到起始节点,使得连接这些节点的路径成本最低。

⼆、贪⼼算法贪⼼算法,⼜名贪婪算法(学校⾥⽼教授都喜欢叫贪婪算法),是⼀种常⽤的求解最优化问题的简单、迅速的算法。

贪⼼算法总是做出在当前看来最好的选择,它所做的每⼀个在当前状态下某种意义上是最好的选择即贪⼼选择,并希望通过每次所作的贪⼼选择导致最终得到问题最优解。

算法论文:旅行商问题的求解方法(动态规划法和贪心法)讲解

算法论文:旅行商问题的求解方法(动态规划法和贪心法)讲解

旅行商问题的求解方法摘要旅行商问题(TSP问题)时是指旅行家要旅行n个城市然后回到出发城市,要求各个城市经历且仅经历一次,并要求所走的路程最短。

该问题又称为货郎担问题、邮递员问题、售货员问题,是图问题中最广为人知的问题。

本文主要介绍用蛮力法、动态规划法、贪心法和分支限界法求解TSP问题,其中重点讨论动态规划法和贪心法,并给出相应求解程序。

关键字:旅行商问题;动态规划法;贪心法;分支限界法1引言旅行商问题(TSP)是组合优化问题中典型的NP-完全问题,是许多领域内复杂工程优化问题的抽象形式。

研究TSP的求解方法对解决复杂工程优化问题具有重要的参考价值。

关于TSP的完全有效的算法目前尚未找到,这促使人们长期以来不断地探索并积累了大量的算法。

归纳起来,目前主要算法可分成传统优化算法和现代优化算法。

在传统优化算法中又可分为:最优解算法和近似方法。

最优解算法虽然可以得到精确解,但计算时间无法忍受,因此就产生了各种近似方法,这些近似算法虽然可以较快地求得接近最优解的可行解,但其接近最优解的程度不能令人满意。

但限于所学知识和时间限制,本文重点只讨论传统优化算法中的动态规划法、贪心法和分支限界法,并对蛮力法做简单介绍,用以比较。

2正文2.1蛮力法2.1.1蛮力法的设计思想蛮力法所依赖的基本技术是扫描技术,即采用一定的策略将待求解问题的所有元素一次处理一次,从而找出问题的解。

一次处理所有元素的是蛮力法的关键,为了避免陷入重复试探,应保证处理过的元素不再被处理。

在基本的数据结构中,一次处理每个元素的方法是遍历。

2.1.2算法讨论用蛮力法解决TSP问题,可以找出所有可能的旅行路线,从中选取路径长度最短的简单回路。

如对于图1,我们求解过程如下:(1)路径:1->2->3->4->1;路径长度:18;(2)路径:1->2->4->3->1;路径长度:11;(3)路径:1->3->2->4->1;路径长度:23;(4)路径:1->3->4->2->1;路径长度:11;(5) 路径:1->4->2->3->1;路径长度:18;(6) 路径:1->4->3->2->1;路径长度:18;从中,我们可以知道,路径(2)和(4)路径长度最短。

TSP的几种求解方法及其优缺点

TSP的几种求解方法及其优缺点

TSP的几种求解方法及其优缺点旅行商问题(Traveling Salesman Problem,TSP)是一种典型的组合优化问题,在计算机科学和运筹学中具有重要的研究意义和应用价值。

TSP常用来描述一个旅行商在给定的一系列城市之间寻找最短路径的问题,即如何选择最短路径经过所有城市并回到起始城市。

针对TSP问题,有多种求解方法可供选择,下面将介绍一些常用的方法及其优缺点。

1.穷举法穷举法是一种非常简单和直观的方法,它会列举出所有可能路径并计算它们的总长度,然后从中选择最短的路径作为最优解。

穷举法的优点是能够保证找到最优解,但当城市数量较多时,计算量呈指数级增长,很难在合理的时间内得到结果。

2.贪婪算法贪婪算法是一种基于局部最优策略的求解方法。

它从一些城市出发,在每一步选择离当前城市最近的未访问过的城市作为下一步访问的城市,直到所有城市都访问过并回到起始城市。

贪婪算法的优点是简单、易于实现,计算速度较快。

然而,贪婪算法并不能保证得到最优解,可能会陷入局部最优解。

3.动态规划动态规划是一种通过将原问题分解为更小的子问题,并利用子问题的解来求解原问题的方法。

对于TSP问题,可以使用动态规划求解。

动态规划的优点是能够在较短的时间内找到最优解,但由于需要存储大量的中间结果,空间复杂度较高。

4.遗传算法遗传算法是一种模拟生物进化过程的求解方法。

它通过对候选解进行遗传操作(交叉、变异等),然后根据适应度函数来评估和选择较好的解进行下一轮进化,直到满足停止条件为止。

遗传算法的优点是适用于大规模问题,能够得到较优解,但其需要调整一些参数,并且收敛速度较慢。

5. Lin-Kernighan启发式算法Lin-Kernighan启发式算法是一种基于局部优化的TSP求解方法。

它采用迭代的方式,在每一步通过反转局部路径来优化当前解,直到达到停止条件。

Lin-Kernighan算法的优点是计算速度较快,对于大规模问题也有较好的效果。

TSP-贪心法

TSP-贪心法
从某一城市出发,遍历各城市一次且仅一次,最后返回 原地,求最短路径。
步骤:
5+18+5+9+22+7 =66
(1)从r出发,用Prim算法找出图g的一棵最小生成树T; (2)以r为根前序遍历树T,得到先序遍历序列;ABEFDC (3)将r加到先序遍历序列最后一个接点的后面,并按此顺序组成 回路H,作为计算结果返回; ABEFDCA
TSP问题—近似算法—方法2
算法分析:
algorithm TSP (Graph g) { (1)选择g的任一顶点r; (2)用Prim算法找出带权图g的一棵以r为根的最小 生成树T; (3)前序遍历树T得到的顶点表L; (4)将r加到表L的末尾,按表L中顶点次序组成回 路H,作为计算结果返回; }
{ search_min(v,w); //未访
tour[i]=w;
cost=cost+c[v][w]; b[w]=1;
v=w;
} tour[n]=1; cost=cost+c[tour[n-1][u]; }
tour[0]=u;
for(i=1;i<=n;i++) b[i]=0 b[v]=1;
TSP问题—近似算法—方法2
Prim算法的时间为:O(n2) Preorder算法的时间是: O(n)
TSP问题—最优解
从某一城市出发,遍历各城市一次且仅一次,最后返回 原地,求最短路径。
考查:
5+23+5+3+22+7 =65
5+5+22+3+5+30 =70 从某一城市出发,遍历各城市一次且仅一次,最后返回 原地,求最短路径。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计设计说明书起止日期:2014年11月10 日至2014 年11月17日计算机科学与工程学院2014年11月9日课程设计任务书一、设计目的熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。

二、设计要求在本课程设计过程中要求学生:(1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务;(2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。

凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩。

(3)学生在接受设计任务后,根据要求认真完成。

(4)认真编写课程设计报告。

三、设计内容TSP问题(贪心法求解)1) 问题描述所谓TSP问题是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次,并要求所走的路程最短。

该问题又称为货郎担问题、邮递员问题、售货员问题,是图问题中最广为人知的问题。

2) 基本要求(1) 上网查找TSP问题的应用实例;(2) 分析求TSP问题的全局最优解的时间复杂度;(3) 设计一个求近似解的算法;(4) 分析算法的时间复杂度。

3) 设计思想对于TSP问题,一种最容易想到的也肯定能得到最佳解的算法是穷举法,即考虑所有可能的旅行路线,从中选择最佳的一条。

但是用穷举法求解TSP问题的时间复杂度为Ο(n!),当n大到一定程度后是不可解的。

4)设计思想对于TSP问题,一种最容易想到的也肯定能得到最佳解的算法是穷举法,即考虑所有可能的旅行路线,从中选择最佳的一条。

但是用穷举法求解TSP问题的时间复杂度为Ο(n!),当n 大到一定程度后是不可解的。

本实验只要求近似解,可以采用贪心法求解:任意选择某个城市作为出发点,然后前往最近的未访问的城市,直到所有的城市都被访问并且仅被访问一次,最后返回到出发点。

为便于查找离某顶点最近的邻接点,可以采用邻接矩阵存储该图。

算法用伪代码描述如下:1. 任意选择某个顶点v作为出发点;2. 执行下述过程,直到所有顶点都被访问:2.1 v=最后一个被访问的顶点;2.2 在顶点v的邻接点中查找距离顶点v最近的未被访问的邻接点j;2.2 访问顶点j;3. 从最后一个访问的顶点直接回到出发点v;四、参考文献1. 王红梅,数据结构,清华大学出版社;2. 王红梅,数据结构学习辅导与实验指导,清华大学出版社;3. 王晓东,计算机算法设计与分析,电子工业出版社。

一、TSP问题TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。

假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。

路径的选择目标是要求得的路径路程为所有路径之中的最小值。

TSP问题是一个组合优化问题。

该问题可以被证明具有NPC计算复杂性。

TSP问题可以分为两类,一类是对称TSP问题(Symmetric TSP),另一类是非对称问题(Asymmetric TSP)。

所有的TSP问题都可以用一个图(Graph)来描述:V={c1, c2, …, ci, …, cn},i = 1,2, …, n,是所有城市的集合.ci表示第i个城市,n为城市的数目;E={(r, s): r,s∈ V}是所有城市之间连接的集合;C = {crs: r,s∈ V}是所有城市之间连接的成本度量(一般为城市之间的距离);如果crs = csr, 那么该TSP问题为对称的,否则为非对称的。

一个TSP问题可以表达为:求解遍历图G = (V, E, C),所有的节点一次并且回到起始节点,使得连接这些节点的路径成本最低。

二、贪心算法贪心算法,又名贪婪算法,是一种常用的求解最优化问题的简单、迅速的算法。

贪心算法总是做出在当前看来最好的选择,它所做的每一个在当前状态下某种意义上是最好的选择即贪心选择,并希望通过每次所作的贪心选择导致最终得到问题最优解。

必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。

1、贪心算法的基本思路从问题的某一个初始解触发逐步逼近给定的目标,以尽可能快地求得更好的解。

当达到某算法中的某一步不能再继续前进时,算法停止。

大致步骤如下:1)建立数学模型来描述问题;2)把求解的问题分成若干个子问题3)对每一个子问题求解,得到子问题的局部最优解4)把子问题的局部最优解合成原问题的一个解2、贪心算法的实现框架贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择,而贪心策略适用的前提是:局部最优策略能导致产生全局最优解。

从问题的某一初始解出发;while (能朝给定总目标前进一步){利用可行的决策,求出可行解的一个解元素;}由所有解元素组合成问题的一个可行解;3、贪心算法存在的问题1)不能保证求得的最后解是最佳的;2)不能用来求最大最小解问题;3)只能在某些特定条件约束的情况下使用,例如贪心策略必须具备无后效性等。

4、典型的贪心算法使用领域马踏棋盘、背包、装箱等。

三、问题求解:TSP问题,要求先画一个旅行的线路图的图示,然后假设有个人,遍历所有的旅行的城市,考虑所有可能的旅行路线,从中选择最佳的一条。

突出其中用到的中间数据是:数组形式,初始数据是各个城市间的距离。

假设我们进行我们的旅游计划,共五个城市,然后前往最近的未访问的城市,直到所有的城市都被访问并且仅被访问一次,最后返回到出发点。

要求这时遍历各城市的距离为最短距离。

当我们要求整体的最优解时,可以从它的局部最优解求的,抱着这样的思想我们从起始城市1出发比较与之最近的城市的距离是2(2号城市),由于不能返回,所以从2号城市继续寻找与之最近的城市(1号城市除外)的距离是4(3号城市),以此类推,最终在返回起始城1。

补充:上面的最短距离要记录下来,求和,则得到最短路径。

如果城市数目四、程序流程图:五、核心源程序清单和执行结果package twl;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;public class TxTsp {private int cityNum; // 城市数量private int[][] distance; // 距离矩阵private int[] col;//代表列,也表示是否走过,走过置0private int[] row;//代表行,选过置0public TxTsp(int n) {cityNum = n;}private void init(String filename) throws IOException {// 读取数据int[] x;int[] y;String strbuff;BufferedReader data = new BufferedReader(new InputStreamReader(new FileInputStream(filename)));distance = new int[cityNum][cityNum];x = new int[cityNum];y = new int[cityNum];for (int i = 0; i < cityNum; i++) {// 读取一行数据,数据格式1 6734 1453strbuff = data.readLine();// 字符分割String[] str = strbuff.split(" ");x[i] = Integer.valueOf(str[1]);// x坐标y[i] = Integer.valueOf(str[2]);// y坐标}data.close();// 计算距离矩阵// ,针对具体问题,距离计算方法也不一样,此处用的是TSPlib上的att48作为案例,它有48个城市,距离计算方法为伪欧氏距离(最优值为10628)for (int i = 0; i < cityNum - 1; i++) {distance[i][i] = 0; // 对角线为0for (int j = i + 1; j < cityNum; j++) {double rij = Math.sqrt(((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j])* (y[i] - y[j])) / 10.0);// 四舍五入,取整// int tij = (int) Math.round(rij);// if (tij < rij) {// distance[i][j] = tij + 1;// distance[j][i] = distance[i][j];// } else {// distance[i][j] = tij;// distance[j][i] = distance[i][j];// }distance[i][j] = (int)rij + 1;distance[j][i] = distance[i][j];//矩阵对称}}distance[cityNum - 1][cityNum - 1] = 0;//矩阵右下角col = new int[cityNum];col[0] = 0;for (int i = 1; i < cityNum; i++) {col[i] = 1;}row = new int[cityNum];for (int i = 0; i < cityNum; i++) {row[i] = 1;}}public void solve(){int[] temp = new int[cityNum];String path="0";int s=0;//计算距离int i=0;//当前节点int j=0;//下一个节点//默认从0开始while(row[i]==1){//复制距离矩阵一行for (int k = 0; k < cityNum; k++) {temp[k] = distance[i][k];//System.out.print(temp[k]+" ");}//System.out.println();//选择下一个节点,要求不是已经走过,并且与i不同j = selectmin(temp);//找出下一节点row[i] = 0;//行置0,表示已经选过col[j] = 0;//列0,表示已经走过path += "-->" + j;//System.out.println(i + "-->" + j);//System.out.println(distance[i][j]);s = s + distance[i][j];i = j;//当前节点指向下一节点}System.out.println("路径:" + path);System.out.println("总距离为:" + s);}public int selectmin(int[] p){int j = 0, m = p[0], k = 0;//寻找第一个可用节点,注意最后一次寻找,没有可用节点while (col[j] == 0) {j++;//System.out.print(j+" ");if(j>=cityNum){//没有可用节点,说明已结束,最后一次为*-->0m = p[0];break;//或者直接return 0;}else{m = p[j];}}//从可用节点J开始往后扫描,找出距离最小节点for (; j < cityNum; j++) {if (col[j] == 1) {if (m >= p[j]) {m = p[j];k = j;}}}return k;}public void printinit() {System.out.println("print begin....");for (int i = 0; i < cityNum; i++) {for (int j = 0; j < cityNum; j++) {System.out.print(distance[i][j] + " ");}System.out.println();}System.out.println("print end....");}public static void main(String[] args) throws IOException { System.out.println("Start....");TxTsp ts = new TxTsp(48);ts.init("." + File.separotor + "data.txt");//ts.printinit();ts.solve();}}运行结果:Start....路径:0-->8-->37-->30-->43-->17-->6-->27-->35-->29-->5-->36-->18-->26--> 42-->16-->45-->32-->14-->11-->10-->22-->13-->24-->12-->20-->46-->1 9-->39-->2-->21-->15-->40-->33-->28-->4-->47-->38-->31-->23-->9--> 41-->25-->3-->34-->44-->1-->7-->0总距离为:12842五、总结单从求解结果来看,我个人其实还是能接受这个解,但仔细想想,实际上这个求解结果有太多运气成分在里面,贪心算法毕竟是贪心算法,只能缓一时,而不是长久之计,问题的模型、参数对贪心算法求解结果具有决定性作用,这在某种程度上是不能接受的,于是聪明的人类就发明了各种智能算法(也叫启发式算法),但在我看来所谓的智能算法本质上就是贪心算法和随机化算法结合,例如传统遗传算法用的选择策略就是典型的贪心选择,正是这些贪心算法和随机算法的结合,我们才看到今天各种各样的智能算法。

相关文档
最新文档