图论与代数实验报告

合集下载

离散数学 实验报告

离散数学 实验报告

离散数学实验报告离散数学实验报告引言:离散数学是一门研究离散结构的数学学科,它对于计算机科学、信息技术等领域具有重要的应用价值。

本实验报告旨在通过实际案例,探讨离散数学在现实生活中的应用。

一、图论在社交网络中的应用社交网络已成为人们日常生活中不可或缺的一部分。

图论作为离散数学的重要分支,对于分析和研究社交网络具有重要意义。

以微信为例,我们可以通过图论的方法,分析微信中的好友关系、群组关系等。

通过构建好友关系图,我们可以计算某个人在社交网络中的影响力,进而预测他的行为模式。

二、布尔代数在电路设计中的应用布尔代数是离散数学中的重要内容,它在电路设计中扮演着重要的角色。

通过布尔代数的运算规则和定理,我们可以简化复杂的逻辑电路,提高电路的可靠性和效率。

例如,我们可以使用布尔代数中的与、或、非等逻辑运算符,设计出满足特定功能需求的逻辑电路。

三、排列组合在密码学中的应用密码学是离散数学的一个重要应用领域。

排列组合是密码学中常用的数学工具之一。

通过排列组合的方法,我们可以设计出强大的密码算法,保障信息的安全性。

例如,RSA加密算法中的大素数的选择,就涉及了排列组合的知识。

四、概率论在数据分析中的应用概率论是离散数学中的一门重要学科,它在数据分析中具有广泛的应用。

通过概率论的方法,我们可以对数据进行统计和分析,从而得出一些有意义的结论。

例如,在市场调研中,我们可以通过抽样调查的方法,利用概率论的知识,对整个市场的情况进行推断。

五、图论在物流规划中的应用物流规划是现代物流管理中的一个重要环节。

图论作为离散数学的重要分支,可以帮助我们解决物流规划中的一些问题。

例如,我们可以通过构建物流网络图,分析货物的流动路径,优化物流的运输效率,降低物流成本。

结论:离散数学作为一门重要的数学学科,在现实生活中具有广泛的应用。

通过对离散数学的学习和应用,我们可以解决实际问题,提高工作效率,推动社会的发展。

希望通过本实验报告的介绍,能够增加对离散数学的兴趣,进一步挖掘离散数学在实际生活中的潜力。

代数的研究报告

代数的研究报告

代数的研究报告代数作为数学的一个分支,是研究数学符号和符号操作的一门学科。

代数的研究对象包括代数结构、代数方程和代数变换等,通过这些研究,能够推导出一些数学规律和定理。

在代数的发展中,人们开创了许多重要的代数理论和方法,为数学的发展做出了巨大的贡献。

代数最早起源于古希腊,当时人们主要研究数的性质和一些简单的代数方程。

然而,代数的研究在中世纪得到了极大的推进,著名的数学家费马和笛卡尔等人在其中起到了重要的作用。

他们的研究结果为代数的发展开辟了新的道路。

代数包含了许多重要的分支,其中最为重要的是线性代数、抽象代数和数论。

线性代数是研究向量空间以及向量空间上的线性变换的一门学科。

在实际应用中,线性代数有着广泛的应用,如图像处理、数据分析等。

抽象代数是研究代数结构的一门学科,它通过定义和研究代数系统的一般性质,来揭示数学的本质和内在结构。

数论是研究自然数性质、整数性质、整数解方程性质的一门学科,它是数学的一个重要分支,对密码学等领域有着重要的应用。

代数理论通常采用公式和符号的方式进行描述和推导。

通过代数的符号操作,我们可以对数学问题进行简化和集中处理,从而揭示问题的本质和内在规律。

在代数的研究中,人们通过一系列的推导和演算,得出了许多重要的定理和规律,为数学的发展提供了丰富的素材。

代数的研究不仅在纯数学领域有着广泛的应用,也在物理学、工程学和计算机科学等应用科学领域发挥着重要的作用。

例如,代数在量子力学的研究中有着重要的地位,人们通过代数的研究推导出了许多重要的物理规律。

在计算机科学中,代数的符号操作常常用于模拟和分析计算过程,为解决实际问题提供了强有力的工具。

综上所述,代数作为数学的一个分支,在数学的发展中发挥着重要的作用。

代数的研究不仅揭示了数学的本质和内在规律,也在应用科学领域发挥着重要的作用。

随着数学的不断深入和发展,代数的研究也将继续前行,为解决实际问题和推动科学进步做出新的贡献。

研究生课程《代数图论》教学大纲

研究生课程《代数图论》教学大纲

研究生课程《代数图论》教学大纲课程编号:Math 2086课程名称:代数图论英文名称:Algebraic Graph Theory开课单位:数学科学学院开课学期:第三学期课内学时:36教学方式:讲授适用专业及层次:数学科学学院专业硕士考核方式:考查预修课程:图论,组合数学,矩阵分析一、教学目标与要求本课程主要研究如何用代数方法(群,表示论,矩阵等)研究图论问题,是现代图论的重要分支.代数图论的诸多问题仍是当今图论的研究热点.本课程较全面、系统地介绍代数图论的基本概念,基本理论和基本方法。

主要内容分为两个方面。

一方面,介绍图的各种矩阵表示及其谱性质,内容包括图的邻接矩阵、Laplace矩阵,无符号Laplace矩阵,同谱图,谱半径及其界,代数连通度与连通性,商图方法,谱的多项式方法,谱的特征向量组合方法等。

另一方面,介绍群与图,主要介绍图的群表示、图的自同构、非对称图、本原性与连通性、Cayley 图及其性质、点可迁图、边可迁图、弧可迁图、距离可迁图、Moore 图等。

通过本课程的学习,要求学生会从代数的观念看一个图,了解代数图论的基本研究问题在,掌握代数图论的常用方法,培养学生抽象思维和慎密概括的能力,使学生具有良好的开拓专业理论的素质和分析解决实际问题的能力,为开展相关科学研究打好基础。

二、课程内容与学时分配第一章图的谱(6学时)1.1 图的矩阵表示1.2 特殊图类的谱1.3 连通性1.4 自同构性1.5 代数连通度1.6 同谱图1.7 图的同态1.8 线图与平面图第二章谱理论的线性代数方法(6学时)2.1 Perron-Frobenius定理2.2 等部划分与商图方法2.3 交错定理2.4 Schur不等式2.5 Courant-weyl不等式第三章图的谱性质(6学时)3.1 最大的特征值3.2 最大特征值至多为2的图3.3 正则图的谱3.4 二部图的谱3.5 Laplace特征值与度序列第四章代数图论中的群方法(6学时) 4.1 置换群4.2 计数理论4.3 不对称图4.4 对上的轨道4.5 本原性与连通性第五章可迁图 (6学时)5.1 点可迁图5.2 边可迁图5.3 点连通性与边连通性5.4 匹配5.5 Cayley图第六章弧可迁图(3学时)6.1 弧可迁图6.2 弧图6.3 三正则弧可迁图6.4 Petersen图6.5 距离可迁图第七章 Moore图(3学时)、7.1 射影平面7.2 广义多边形7.3 Moore图三、教材1. C. Godsil, G.Royle, Algebraic Graph Theory,Springer, 2001.2. A. E. Brouwer, W. H. Haemers, Spectra of graphs, Springer, 2011.四、主要参考书1.D. Cvetkovic, P. Rowlison, S. Simic, An Introduction to the theory of graph Spectra, London Mathematical society, 19972.R. B. Bapat, Graph and matrix, Springer, 2010.3.N. Biggs, Algebraic graph theory, Cambridge University Press, 1974.。

离散数学实验报告(两篇)

离散数学实验报告(两篇)

引言:离散数学是一门基础性的数学学科,广泛应用于计算机科学、电子信息等领域。

本文是《离散数学实验报告(二)》,通过对离散数学实验的深入研究和实践,总结了相关的理论知识和应用技巧,希望能够对读者对离散数学有更加深入的理解。

概述:本实验主要涉及离散数学中的集合、关系、图论等基本概念及其应用。

通过对离散数学的实验学习,深入掌握了这些概念和应用,对于在实际问题中的应用和拓展具有重要的意义。

正文内容:一、集合相关概念及应用1.定义:集合是由元素组成的无序的整体。

介绍了集合的基本概念、集合的表示法以及集合的运算。

2.集合的应用:介绍了集合在数学、计算机科学中的应用,如数据库的查询、关系代数等。

二、关系相关概念及应用1.定义:关系是一个元素与另一个元素之间的对应关系。

介绍了关系的基本概念、关系的表示方法及其运算。

2.关系的应用:介绍了关系在图像处理、社交网络分析等领域的应用,如图像中的像素点之间的关系、社交网络中用户之间的关系等。

三、图论基础知识及应用1.定义:图是由顶点和边组成的抽象的数学模型。

介绍了图的基本概念、图的表示方法和图的运算。

2.图论的应用:介绍了图论在路由算法、电子商务等领域的应用,如路由器的路由选择、电子商务中的商品推荐等。

四、布尔代数的概念及应用1.定义:布尔代数是一种基于集合论和逻辑学的代数系统。

介绍了布尔代数的基本概念、布尔表达式及其化简方法。

2.布尔代数的应用:介绍了布尔代数在电路设计、开关控制等方面的应用,如逻辑门电路的设计、开关控制系统的建模等。

五、递归的概念及应用1.定义:递归是一种通过调用自身来解决问题的方法。

介绍了递归的基本原理、递归的应用技巧。

2.递归的应用:介绍了递归在算法设计、树的遍历等方面的应用,如快速排序算法、树结构的遍历等。

总结:通过本次离散数学的实验学习,我深入掌握了集合、关系、图论等基本概念与应用。

集合的应用在数据库查询、关系代数等方面起到了重要的作用。

关系的应用在图像处理、社交网络分析等领域有广泛的应用。

数学竞赛中图论问题的应用的开题报告

数学竞赛中图论问题的应用的开题报告

数学竞赛中图论问题的应用的开题报告目录1. 研究目的2. 研究背景3. 研究内容4. 研究方法5. 预期成果6. 参考文献1. 研究目的本研究的目的是探究数学竞赛中图论问题的应用,研究图论问题的解法及其相关算法,以提高竞赛选手在图论问题上的解题能力。

2. 研究背景图论作为一门数学分支,已被广泛应用于计算机科学、物理学、生物学等领域。

在数学竞赛中,图论问题也是一个重要的话题,其解题思路和算法数据结构的设计都具有较高的学习难度和挑战性。

因此,深入研究图论问题的应用,对于提高竞赛选手的综合能力,增强其解题能力具有重要意义。

3. 研究内容本研究的重点是图论问题的应用,主要包括以下几个方面:3.1 图的基本概念和数学模型包括图的定义、图的表示方法、图的基本性质、图的类型和特征、度数序列、路径和回路的定义及其性质等。

3.2 图的遍历算法包括深度优先搜索(DFS)和广度优先搜索(BFS)的原理和实现思路,以及相关的应用和优化方法。

3.3 最短路径问题包括单源最短路径问题的 Dijkstra 算法和 Bellman-Ford 算法的原理和实现思路,多源最短路径问题的 Floyd-Warshall 算法等。

3.4 最小生成树问题包括 Kruskal 算法和 Prim 算法的原理和实现思路,以及相关的应用和优化方法。

3.5 图的染色问题包括图的可染色性及其求解算法、二分图检测算法和基于染色的其他图算法等。

4. 研究方法本研究采用的是实证研究方法,主要包括文献调研和实践教学。

4.1 文献调研主要查阅有关图论问题的经典教材、学术论文、竞赛教材及其相关实践报告,归纳总结图论问题的学习和应用方法。

4.2 实践教学基于图论问题的实际应用,扩展竞赛选手的知识面和解题思路,提高其数学分析和逻辑推理能力。

通过不断地解题实践,检验算法的正确性和优越性,在实际应用中不断积累经验。

5. 预期成果本研究的预期成果主要包括以下几个方面:5.1 系统地总结和介绍图论问题的基本概念、算法和应用等方面的知识。

几何与代数实验报告

几何与代数实验报告

几何与代数实验报告几何与代数实验报告实验人员:院(系) 学号 姓名_ __成绩___________实验05平面图形的几何变换(矩阵乘法与线性变换应用)一、 实验题目绘制由平面上六个点所围图形的MATLAB 程序如下,右边为所绘图形:clear all , clc,t=[1 3 5 11 13 15]*pi/8; x=sin(t); y=cos(t); fill(x,y,'r'); grid on ;axis([-2.4, 2.4, -2, 2])(1)请写出该图形每个顶点的齐次坐标;(2)编写MATLAB 程序,先将上面图形放大0.9倍;再逆时针旋转;最后进行横坐标加0.8、纵坐标减1的图形平移。

请分别绘制上述变换后的图形。

二、实验目的和意义利用MATLAB 进行矩阵乘法与线性变换三、计算公式该图形每个顶点的齐次坐标:⎪⎭⎫ ⎝⎛1,8cos ,8sin ππ,⎪⎭⎫ ⎝⎛1,83cos ,83sinππ,⎪⎭⎫ ⎝⎛1,85cos ,85sin ππ,⎪⎭⎫ ⎝⎛1,811cos ,811sin ππ,⎪⎭⎫ ⎝⎛1,813cos ,813sin ππ,⎪⎭⎫ ⎝⎛1,815cos ,815sin ππ 四、程序设计(1)作出原图>> t=[1 3 5 11 13 15]*pi/8 >> x=sin(t) >> y=cos(t) >> fill(x,y,'r') >> grid on>> axis([-2.4, 2.4, -2, 2])几何与代数实验报告(2) 将上面图形放大0.9倍>>A=[0.3827,0.9239,0.9239,-0.9239,-0.9239,-0.3827;0.9239,0.3827,-0.3827,-0.3827,0.3827,0.92 39;1,1,1,1,1,1]>> T1=[0.9,0,0;0,0.9,0;0,0,1]>> B=T1*A>> fill(B(1,:), B(2,:),'r')(3) 逆时针旋转>> T2=[cos(pi/3),-sin(pi/3),0;sin(pi/3),cos(pi/3),0;0,0,1]>> C=T2*B>> fill(C(1,:), C(2,:),'r')(4) 进行横坐标加0.8、纵坐标减1的图形平移>> T3=[1,0,0.8;0,1,-1;0,0,1]>> D=T3*C>> fill(D(1,:), D(2,:),'r')(5)将刚刚做的四幅图放在一张图上>> subplot(2, 2, 1),fill(x,y,'r'),subplot(2, 2, 2),fill(B(1,:), B(2,:),'r'),subplot(2, 2, 3),fill(C(1,:), C(2,:),'r'),subplot(2, 2, 4),fill(D(1,:), D(2,:),'r')五、程序运行结果(1)作出原图t =0.3927 1.1781 1.9635 4.3197 5.1051 5.8905x =0.3827 0.9239 0.9239 -0.9239 -0.9239 -0.3827y =0.9239 0.3827 -0.3827 -0.3827 0.3827 0.9239几何与代数实验报告(2) 将上面图形放大0.9倍A =0.3827 0.9239 0.9239 -0.9239 -0.9239 -0.38270.9239 0.3827 -0.3827 -0.3827 0.3827 0.92391.0000 1.0000 1.0000 1.0000 1.0000 1.0000 T1 =0.9000 0 00 0.9000 00 0 1.0000B =0.3444 0.8315 0.8315 -0.8315 -0.8315 -0.34440.8315 0.3444 -0.3444 -0.3444 0.3444 0.83151.0000 1.0000 1.0000 1.0000 1.0000 1.0000(3) 逆时针旋转T2 =0.5000 -0.8660 00.8660 0.5000 00 0 1.0000C =-0.5479 0.1175 0.7140 -0.1175 -0.7140 -0.89230.7140 0.8923 0.5479 -0.8923 -0.5479 0.11751.0000 1.0000 1.0000 1.0000 1.0000 1.0000几何与代数实验报告(4) 进行横坐标加0.8、纵坐标减1的图形平移T3 =1.0000 0 0.80000 1.0000 -1.00000 0 1.0000D =0.2521 0.9175 1.5140 0.6825 0.0860 -0.0923-0.2860 -0.1077 -0.4521 -1.8923 -1.5479 -0.88251.0000 1.0000 1.0000 1.0000 1.0000 1.0000(5)将刚刚做的四幅图放在一张图上几何与代数实验报告-1-0.500.51-1-0.500.51实验02平板的稳态温度分布问题(线性方程组应用)一、 实验题目已知平板内部有30个节点,每个节点的温度近似等于与它相邻的四个节点温度的平均值,例如4292530rd T T T T T +++=;设4条边界上的温度分别等于每位同学学号的后四位的5倍,例如学号为16308209的同学计算时,选择40=l T 、10=u T 、0=r T 、45=d T 。

图论与代数实验报告

图论与代数实验报告

图论与代数实验报告旅行售货员问题(TSP)某售货员要到若干城市去推销商品,一直各城市之间的路程,他要选定一条从驻地出发,经过每个城市一遍,最后回到住地的路线,使总的路程最短。

我用分支限界法解决问题。

1、分支限界法基本思想分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。

在分支限界法中,每一个活结点只有一次机会成为扩展结点。

活结点一旦成为扩展结点,就一次性产生其所有儿子结点。

在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。

此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。

这个过程一直持续到找到所需的解或活结点表为空时为止。

2、常见的两种分支限界法(1)队列式(FIFO)分支限界法按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。

(2)优先队列式分支限界法按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。

最大优先队列:使用最大堆,体现最大效益优先。

最小优先队列:使用最小堆,体现最小费用优先。

该问题是一个NP完全问题,有(n-1)!条可选路线。

路线是一个带权图。

图中各边的费用(权)为正数。

图的一条周游路线是包括V中的每个顶点在内的一条回路。

周游路线的费用是这条路线上所有边的费用之和。

旅行售货员问题的解空间可以组织成一棵树,从树的根结点到任一叶结点的路径定义了图的一条周游路线。

旅行售货员问题要在图G 中找出费用最小的周游路线。

即:设G(V,E)是一带权有向图,V={1,2,…n },其耗费矩阵C=(ci,j),当时, 记ci,j=无穷大且ci,j=无穷大.问如何选择周游路线使耗费最小?算法思路:设周游路线从结点1开始,解为等长数组X=(1,x2,...xn)则解空间树为排列树,在树中做广度优先搜索。

约束条件: xi 不等于xj ,i 不等于j;目标函数:解向量对应的边权之和∑Cij目标函数限界初值:U=无穷大C=算法描述:①算法开始时创建一个最小堆,用于表示活结点优先队列②堆中每个结点的子树费用的下界lcost 值是优先队列的优先级。

图论与代数结构

图论与代数结构
设c是二分图g的任一回路不妨设定义213设g是无向图若g的任意两结点之间都存在道路就称g是连通图否则称为非连通图若g是有向图不考虑边的方向即视之为无向图若它是连通的则称g是连通图
第二章 道路和回路
LOGO
2.1 道路和回路
定义 2.1.1 有向图 G = (V, E) 中,若边序列 P = (ei1, ei2, …, eiq), 其中 eik=(vl, vj) 满足 vl 是 eik-1 的终点, vj 是 eik+1 的始点,则称 P 是 G 的 一条有向道路。如果 eiq 的终点也是 ei1 的始 点,则称 P 是 G 的一条有向回路。 P 中的边没有重复出现:简单有向道路,简 单有向回路。 P 中结点也不重复出现:初级有向道路,初 级有向回路。分别简称路,回路。
定义 2.1.2
无向图 G = (V, E) 中,若点边交替序 列 P = (vi1, ei1, vi2, ei2, …, eiq-1, viq), 满足 vik, vik+1 是 eik 的两个端点,则称 P 是 G 中 的一条链,或道路。如果 viq = vi1 。则称 P 是 G 中的一个圈,或回路。
定义 2.1.3
设 G 是无向图,若 G 的任意两结点之间都 存在道路,就称 G 是连通图,否则称为非连通图 。 若 G 是有向图,不考虑边的方向,即视 之为无向图,若它是连通的,则称 G 是连通图。 若连通子图 H 不是 G 的任何连通子图的 真子图,则称 H 是 G 的极大连通子图,或称连 通支。 显然, G 的每个连通支都是它的导出子图。
定义 2.4.2
设 vi 和 vj 是简单图 G 的不相邻结点,且满 足 d(vi)+d(vj) ≥n, 则 令 G’ = G+(vi, vj), 对 G’ 重复上 述 过 程 , 直 至不再有这样的结点 对为 止 。最终得到的图称为 G 的 闭合 图, 记做 C(G). 例 2.4.3 图 2.16(a) 的 闭合 图是 (b). (a) (b)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

图论与代数实验报告旅行售货员问题(TSP)某售货员要到若干城市去推销商品,一直各城市之间的路程,他要选定一条从驻地出发,经过每个城市一遍,最后回到住地的路线,使总的路程最短。

我用分支限界法解决问题。

1、分支限界法基本思想分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。

在分支限界法中,每一个活结点只有一次机会成为扩展结点。

活结点一旦成为扩展结点,就一次性产生其所有儿子结点。

在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。

此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。

这个过程一直持续到找到所需的解或活结点表为空时为止。

2、常见的两种分支限界法(1)队列式(FIFO)分支限界法按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。

(2)优先队列式分支限界法按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。

最大优先队列:使用最大堆,体现最大效益优先。

最小优先队列:使用最小堆,体现最小费用优先。

该问题是一个NP完全问题,有(n-1)!条可选路线。

路线是一个带权图。

图中各边的费用(权)为正数。

图的一条周游路线是包括V中的每个顶点在内的一条回路。

周游路线的费用是这条路线上所有边的费用之和。

旅行售货员问题的解空间可以组织成一棵树,从树的根结点到任一叶结点的路径定义了图的一条周游路线。

旅行售货员问题要在图G 中找出费用最小的周游路线。

即:设G(V,E)是一带权有向图,V={1,2,…n },其耗费矩阵C=(ci,j),当时, 记ci,j=无穷大且ci,j=无穷大.问如何选择周游路线使耗费最小?算法思路:设周游路线从结点1开始,解为等长数组X=(1,x2,...xn)则解空间树为排列树,在树中做广度优先搜索。

约束条件: xi 不等于xj ,i 不等于j;目标函数:解向量对应的边权之和∑Cij目标函数限界初值:U=无穷大C=算法描述:①算法开始时创建一个最小堆,用于表示活结点优先队列②堆中每个结点的子树费用的下界lcost 值是优先队列的优先级。

③接着算法计算出图中每个顶点的最小费用出边并用minout 记录。

④如果所给的有向图中某个顶点没有出边,则该图不可能有回路,算法即告结束。

⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡∞∞∞∞201042056105304630⑤如果每个顶点都有出边,则根据计算出的minout作算法初始化。

1、float row_min(NODE *node,int row,float &second)功能:返回由指针node所指向节点费用矩阵中第row行最小值,并把次小值回送与引用变量second中2、float col_min(NODE *node,int col,float &second)功能:返回由指针node所指向节点费用矩阵中第col列最小值,并把次小值回送与引用变量second中3、float array_red(NODE *node)功能:归约指针node指向的节点的费用矩阵返回值为归约常数4、float edge_sel (NODE *node,int &vk,int &vl)功能:计算d并且搜索分支的边返回dkl的值kl5、void del_rowcol(NODE *node,int vk,int vl)功能:删除费用矩阵当前V行第l V列的所有元素k6、void edge_byp(NODE *node,int vk, int vl)功能:把vk vl表示的边登记到顶点邻接表并旁路矩阵中有关的边7、NODE *initial(float c[20][20],int n)功能:初始化函数8、void insert(HEAP *&heap,int &n_heap,HEAP z)功能:向最小堆栈插入结点函数9、HEAP delete_min(HEAP *&heap,int &n_heap)功能:删除堆栈头结点函数分支限界法求解TSP问题的程序#include <iostream>#include <fstream>#include <string>#include <cmath>using namespace std;//定义相关结构体typedef struct node_data //结点数据结构{float c[20][20]; /*费用矩阵*/int row_init[20]; /*费用矩阵的当前行映射为原始行*/ int col_init[20]; /*费用矩阵的当前列映射为原始列*/int row_cur[20]; /*费用矩阵的原始行映射为当前行*/ int col_cur[20]; /*费用矩阵的原始列映射为当前列*/ int ad[20]; /*回路顶点邻接表*/int k; /*当前费用矩阵的阶*/float w; /*结点的下界*/}NODE;typedef struct /*堆结构数据*/{NODE *p; /*指向结点元素的指针*/float w; /*所指向结点的下界,堆元素的关键字*/}HEAP;//主要函数申明部分float row_min(NODE *node,int row,float &second);float col_min(NODE *node,int col,float &second);float array_red(NODE *node);float edge_sel (NODE *node,int &vk,int &vl);void del_rowcol(NODE *node,int vk,int vl);void edge_byp(NODE *node,int vk, int vl);NODE *initial(float c[20][20],int n);void insert(HEAP *&heap,int &n_heap,HEAP z);HEAP delete_min(HEAP *&heap,int &n_heap);//主函数开始int main(){int n=20;int ad[20],path[20];float c[20][20];float max_distance, min_distance;string filename="distance.txt";ifstream sensor;sensor.open(filename.c_str()); //打开文件读取距离数据信息if(sensor.fail()){cout<<"Error opening input file\n";}else{sensor>>max_distance>>min_distance; //没有到达文件末尾时循环读取数据while(!sensor.eof()){for(int i=0;i<20;i++){for(int j=0;j<20;j++){sensor>>c[i][j];}c[i][i]=max_distance+1;}}} //读取距离信息结束int i,j,vk,vl;float d,w=0;NODE *xnode;NODE *ynode;NODE *znode;int n_heap=0;HEAP *heap=new HEAP[50*30]; HEAP x,y,z;xnode=initial(c,n);xnode->w=array_red(xnode);while(xnode->k!=0){d=edge_sel(xnode,vk,vl);znode=new NODE;*znode =*xnode;znode->c[vk][vl]=max_distance+1;array_red(znode);znode->w=xnode->w+d;z.w=znode->w;z.p=znode;insert(heap,n_heap,z);ynode=new NODE;*ynode=*xnode;edge_byp(ynode,vk,vl);del_rowcol(ynode,vk,vl);ynode->w=array_red(ynode);ynode->w+=xnode->w;y.w=ynode->w;y.p=ynode;if(ynode->k==2){if(ynode->c[0][0]==0){ynode->ad[ynode->row_init[0]]=ynode->col_init[1];ynode->ad[ynode->row_init[1]]=ynode->col_init[0];}else{ynode->ad[ynode->row_init[0]]=ynode->col_init[0];ynode->ad[ynode->row_init[1]]=ynode->col_init[1];}ynode->k=0;}insert (heap,n_heap,y);delete xnode;x=delete_min(heap,n_heap);xnode=x.p;}w=xnode->w;for(i=0;i<n;i++) //保存邻接表ad[i]=xnode->ad[i];delete xnode;for (i=0;i<n_heap;i++) //释放结点数据空间{delete heap->p;heap--;}heap++;delete []heap; //释放堆空间int t=0,k=1; //将邻接表转化为遍历城市的顺序列表,保存在path[]中path[0]=0;while(k<n){j=t;t=ad[j];path[k]=t;k++;}cout<<"the result of the path:"<<endl; //输出最优遍历城市顺序的结果,转化为A、B的形式for(j=0;j<20;j++){cout<<char(path[j]+65)<<' ';}cout<<endl<<"the total length is: "<<w<<endl; //输出最短路程的值return 0;} //主函数结束/**********************************函数定义部分***********************************///返回由指针node所指向节点费用矩阵中第r ow行最小值,并把次小值回送与引用变量second中float row_min(NODE *node,int row,float &second){float temp;int i;if (node->c[row][0],node->c[row][1]){temp =node->c[row][0]; second=node->c[row][1];}else{temp=node->c[row][1]; second=node->c[row][0];}for (i=2;i<node->k;i++){if(node->c[row][i]<temp){second=temp;temp=node->c[row][i];}else if(node->c[row][i]<second)second=node->c[row][i];}return temp;}//返回由指针node所指向节点费用矩阵中第col列最小值,并把次小值回送与引用变量second中float col_min(NODE *node,int col, float &second){float temp;int i;if (node->c[0][col],node->c[1][col]){temp =node->c[0][col]; second=node->c[1][col];}else{temp=node->c[1][col]; second=node->c[0][col];}for (i=2;i<node->k;i++){if (node->c[i][col]<temp ){second =temp; temp =node->c[i][col];}else if (node->c[i][col]<second)second=node->c[i][col];}return temp;}//归约指针node指向的节点的费用矩阵返回值为归约常数float array_red(NODE *node){int i,j;float temp,temp1,sum=0;for(i=0;i<node->k;i++){temp=row_min(node,i,temp1);for (j=0;j<node->k;j++)node->c[i][j] -=temp;sum +=temp;}for(j=0;j<node->k;j++){temp=col_min(node,j,temp1);for (i=0;i<node->k;i++)node->c[i][j] -=temp;sum +=temp;}return sum;}//计算dkl 并且搜索分支的边返回dkl的值float edge_sel(NODE *node,int &vk,int &vl) {int i,j;float temp,d=0;float *row_value=new float[node->k]; float *col_value=new float[node->k];for (i=0;i<node->k;i++)row_min(node,i,row_value[i]);for (i=0;i<node->k;i++)col_min(node,i,col_value[i]);for (i=0;i<node->k;i++){for(j=0;j<node->k;j++){if (node->c[i][j]==0){temp=row_value[i]+col_value[j];if(temp>d){d=temp; vk=i;vl=j;}}}}delete row_value;delete col_value;return d;}//del_rowcol(NODE *node,int vk,int vl)删除费用矩阵当前vk行第vl列的所有元素void del_rowcol(NODE *node,int vk,int vl) {int i,j,vk1,vl1;for (i=vk;i<node->k-1;i++)for (j=0;j<vl;j++)node->c[i][j]=node->c[i+1][j];for (j=vl;j<node->k-1;j++)for (i=0;i<vk;i++)node->c[i][j]=node->c[i][j+1];for (i=vk;i<node->k-1;i++)for (j=vl;j<node->k-1;j++)node->c[i][j]=node->c[i+1][j+1];vk1=node->row_init[vk];node->row_cur[vk1]=-1;for (i=vk1+1;i<20;i++)node->row_cur[i]--;//vl1=node->col_init[vl];node->col_cur[vl1]=-1;for (i=vl1+1;i<20;i++)node->col_cur[i]--;for (i=vk;i<node->k-1;i++)node->row_init[i]=node->row_init[i+1];for(i=vl;i<node->k-1;i++)node->col_init[i]=node->col_init[i+1];node->k--;}//把vk vl表示的边登记到顶点邻接表并旁路矩阵中有关的边void edge_byp(NODE *node,int vk, int vl){int i,j,k,l;vk=node->row_init[vk];vl=node->col_init[vl];node->ad[vk]=vl;for (i=0;i<20;i++){j=i;while (node->ad[j]!=-1)j=node->ad[j];if(i!=j){l=node->row_cur[j];k=node->col_cur[i];if((k>0)&&(l>0))node->c[l][k]=100; //以后要改进的地方100是个特殊值}}}//初始化函数NODE *initial(float c[20][20],int n){int i,j;NODE *node=new NODE;for (i=0;i<n;i++)for (j=0;j<n;j++)node->c[i][j]=c[i][j];for (i=0;i<n;i++){node->row_init[i]=i;node->col_init[i]=i;node->row_cur[i]=i;node->col_cur[i]=i;}for (i=0;i<n;i++)node->ad[i]=-1;return node;}//向最小堆栈插入结点函数void insert(HEAP *&heap,int &n_heap,HEAP z) {HEAP *temp;int k=n_heap;if(k==0){*heap=z;}else{temp=heap;while(heap->w<z.w&&k>0){*(heap+1)=*heap;k--;if(k>0) heap--;}if(k>0) heap++;heap=temp+1;}n_heap++;}//删除堆栈头结点函数HEAP delete_min(HEAP *&heap,int &n_heap) {HEAP temp;temp=(*heap);heap--;n_heap--;return temp;}。

相关文档
最新文档