0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

哈密顿回路的应用

ss 来源:网络整理 2018-02-01 15:58 次阅读

哈密顿图定义概念

哈密顿通路(回路)与哈密顿图(Hamilton图)通过图G的每个结点一次,且仅一次的通路(回路),就是哈密顿通路(回路)。存在哈密顿回路的图就是哈密顿图。

1.哈密顿通路

设G=《V,E》为一图(无向图或有向图).G中经过每个顶点一次且仅一次的通路称作哈密顿通路

2.哈密顿回路

G中经过每个顶点一次且仅一次的回路称作哈密顿回路

3.哈密顿图

若G中存在哈密顿回路,则称它是哈密顿图

4.定义详解:

(1)存在哈密顿通路(回路)的图一定是连通图;

(2)哈密顿通路是初级通路,哈密顿回路是初级回路;

(3)若G中存在哈密顿回路,则它一定存在哈密顿通路,反之不真

(4)只有哈密顿通路,无哈密顿回路的图不交哈密顿图;

哈密顿回路的应用

二、判定定理

注意:目前没有找到哈密顿图的简单的充要条件

(1)设无向图G=《V,E》为哈密顿图,V1是V的任意真子集,则(注:n阶xx图指的是n个顶点,不要迷!)

p(G-V1)《=|V1|

其中,p(G-V1)为G中删除V1后的所得图的连通分支数目,|V1|为V1集合中包含的顶点个数。【哈密顿图存在的必要条件】

推论:有割点的图一定不是哈密顿图

设v是图中的割点,则p(G-v)》=2,由上述定理知G不是哈密顿图

(2)设G是n(n》=3)阶无向简单图,若对于G中的每一对不相邻的顶点u,v,均有

d(u)+d(v)》=n-1

则G中存在哈密顿通路。又若

d(u)+d(v)》=n

则G中存在哈密顿回路,即G为哈密顿图。【哈密顿图存在的充分条件,不是必要条件】

其中d(u),d(v)分别代表顶点u,v的度数。

推论:设G是n(n》=3)阶无向简单图,若G的最小度》=n/2,则G是哈密顿图。

由推论知,对于完全图Kn,当n》=3时,是哈密顿图,完全二部图Kr,s当r==s》=2时是哈密顿图。

(3)在n(n》=2)阶有向图D=《V,E》中,如果略去所有有向边的方向,所得无向图中含生成子图Kn,则D中存在哈密顿通路。

推论:n(n》=3)阶有向完全图是哈密顿图。

1.常用方法判断是哈密顿图:

(1)若能通过观察找出图G中的一条哈密顿回路,则G当然是哈密顿图。

(2)若一个无向图G满足上述(2)中的条件,一个有向图D满足上述(3)的推论的条件,则G、D都是哈密顿图。

2.破坏哈密顿图存在的必要条件,判定不是哈密顿图:

设n阶图G是哈密顿图,则G应该满足以下诸条件:

(1)G必须是连通图;

(2)G中的边数m必须大于等于顶点数n;

(3)若G中存在2度顶点v,即d(v)=2,则与v关联的两条边ei,ej必须在G中的任何哈密顿回路上;

(4)若G中存在每条哈密顿回路中出现的边,不能构成边数小于n的初级回路(圈);

破坏以上诸条件中的一条,都不是哈密顿图。

哈密顿回路的应用

随机生成并哈密顿回路求解:

// Graph.cpp : 定义控制台应用程序的入口点。

//

#include “stdafx.h”

#include“Graph.h”

#include《iostream》

#include《fstream》

#include《stack》

#include《queue》

#include《limits》

using namespace std;

template《class T,class E》

int sb(int start,Graph《T,E》 &myGraph,ostream & fout)//simple backtracking 算法解决图的最小哈密顿回路问题 v为回路的起点和终点

{

E minDistance=std::numeric_limits《E》::max();

stack《int》 myStack;

myStack.push(start);

int numVertices=myGraph.NumberOfVertices();

bool *visited=new bool[numVertices];

memset(visited,false,numVertices);

int v;

int w=-1;

while(!myStack.empty()) //栈不为空

{

v=myStack.top();

visited[v]=true;

if(w==-1)

{

w=myGraph.getFirstNeighbor(v);

}

else

{

w=myGraph.getNextNeighbor(v,w);

}

for(;w!=-1&&visited[w]==true;w=myGraph.getNextNeighbor(v,w))

{

}

if(w==-1) //未找到可行的下一个顶点

{

myStack.pop(); //回溯

w=v;

visited[v]=false;

}

else //找到可行的下一个顶点

{

myStack.push(w); //放入栈中

if(myStack.size()==numVertices)//走过所有的顶点

{

if(myGraph.getWeight(start,w)==std::numeric_limits《E》::max()) //判断最后一个顶点有没有回到起点的边

{

myStack.pop();

visited[w]=false;

}

else //成功找到回路

{

//输出回路 并记录下回路的长度

stack《int》 temp;

while(!myStack.empty())

{

int n=myStack.top();

temp.push(n);

myStack.pop();

}

fout《《“哈密顿回路 : ”;

E distance=0;

int n=temp.top();

myStack.push(n);

temp.pop();

int last=n;

fout《《n《《“--”;

while(!temp.empty())

{

n=temp.top();

myStack.push(n);

temp.pop();

distance+=myGraph.getWeight(last,n);

last=n;

fout《《n《《“--”;

}

fout《《start《《“--”《《endl;

distance+=myGraph.getWeight(last,start);

fout《《“总长度为:”《《distance《《endl;

//记录最短长度

if(minDistance》distance)

{

minDistance=distance;

}

//

myStack.pop();

visited[w]=false;

}

}

else

{

w=-1;

}

}

}

fout《《“最短哈密顿回路的长度为:”《《minDistance《《endl;

return 1;

}

//分支限界法求解最短哈密顿回路问题

template《class E》

struct NODE

{

int dep; //表示该结点在搜索树的第几层

int *vertices; //该节点力包含的各个顶点

E length; //从根到当前结点已经走过的路径长度

NODE(int depth)

{

dep=depth;

vertices=new int[dep];

};

void cpy(int *&des)

{

for(int i=0;i《dep;i++)

{

des[i]=vertices[i];

}

}

bool find(int v)

{

for(int i=0;i《dep;i++)

{

if(vertices[i]==v)

return true;

}

return false;

}

};

template《class T,class E》

int bb(int start,Graph《T,E》 & myGraph,ostream & fout)

{

stack《NODE《E》》 myStack; //队列

E minDistance=std::numeric_limits《E》::max();

int s=myGraph.getFirstNeighbor(start);

for(s=myGraph.getNextNeighbor(start,s);s!=-1;s=myGraph.getNextNeighbor(start,s))

{

NODE《E》 n(2);

n.vertices[0]=start;n.vertices[1]=s;

n.length=myGraph.getWeight(start,s);

myStack.push(n);

}

while(!myStack.empty()) //队列不为空

{

NODE《E》 n=myStack.top();

myStack.pop();

int v=n.vertices[n.dep-1];

if(n.dep+1==myGraph.NumberOfVertices())//到了最后一层 判断是不是哈密顿回路

{

int w;

for( w=myGraph.getFirstNeighbor(v);w!=-1;w=myGraph.getNextNeighbor(v,w))

{

if( n.find(w)==false)

break;

}

if(w!=-1)

{

if(myGraph.getWeight(w,start)《std::numeric_limits《E》::max())

{

//形成回路

fout《《“哈密顿回路为:”;

for(int i=0;i《n.dep;i++)

{

fout《《n.vertices[i]《《“ ”;

}

fout《《w《《“ ”《《start《《endl;

E tempDistance=n.length+myGraph.getWeight(v,w)+myGraph.getWeight(w,start);

fout《《“总长度为: ”《《tempDistance《《endl;

if(minDistance》tempDistance)

{

minDistance=tempDistance;

}

}

}

}

for(int w=myGraph.getFirstNeighbor(v);w!=-1;w=myGraph.getNextNeighbor(v,w))

{

if(n.find(w)==false)

{

NODE《E》 ne(n.dep+1);

ne.length=n.length+myGraph.getWeight(v,w);

if(ne.length《minDistance)

{

n.cpy(ne.vertices);

ne.vertices[ne.dep-1]=w;

myStack.push(ne);

}

}

}

}

fout《《“最短长度为 ”《《minDistance《《endl;

return minDistance;

}

int _tmain(int argc, _TCHAR* argv[])

{

Graph《char,int》 myGraph(10);

//ifstream fin(“input.txt”);

//myGraph.Init(fin);

myGraph.RandInit();//随机初始化图

ofstream fout(“outputsb.txt”);

//sb(0,myGraph,fout);

ofstream fout1(“outputbb.txt”);

bb(0,myGraph,fout1);

system(“pause”);

return 0;

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 哈密顿图
    +关注

    关注

    0

    文章

    3

    浏览量

    1276
收藏 人收藏

    评论

    相关推荐

    #硬声创作季 2.2.1 哈密顿算子视频

    电磁场物理量与定理
    Mr_haohao
    发布于 :2022年09月01日 20:56:14

    DNA编码的学习

    成熟,数学上很多NP-hard问题传统计算机难以有效解决,1994年,Adleman教授用脱氧核糖核苷酸分子为计算介质,以现代分子生物技术为手段,解决了7个定点的有向哈密顿路。总结来说就是以生化反应来解决数
    发表于 07-23 06:05

    电子关联对聚乙炔双激子态的影响

    在SSH哈密顿基础上,引进扩展的Hubbard关联能,对聚乙炔的双激子态进行自洽变分计算。发现:电子关联的引入使双激子吸收峰一分为二,这结果与光诱致吸收实验观察到的瞬时双
    发表于 11-20 12:45 8次下载

    LaSrAlO4中Cu2+的自旋哈密顿参量的理论分析

    根据晶体场理论,利用3d9离子在四角对称(伸长八面体)中自旋哈密顿参量g因子的四阶微扰公式以及超精细结构常数A因子的三阶微扰公式,对掺Cu2+的LaSrAlO4晶体的自旋哈密顿参量作
    发表于 05-10 12:11 24次下载

    ZigBee与哈密瓜不得不说的故事

    新疆哈密中蒙交界地区,ZigBee网络用于哈密瓜田地自动化滴灌系统,应用区域超过4万亩。看致远电子工程师如何使用Zigbee分析仪为种植保驾护航。
    发表于 03-05 17:35 730次阅读

    哈密顿结构修正的控制设计方法及其应用

    哈密顿结构修正的控制设计方法及其应用_曾云
    发表于 01-07 17:16 1次下载

    如何判断哈密顿图_哈密顿图的必要条件

    本文主要介绍了如何判断哈密顿图_哈密顿图的必要条件,哈密顿通路(回路)与哈密顿图(Hamilton图)通过图G的每个结点一次,且仅一次的通路
    的头像 发表于 02-01 15:43 5.6w次阅读
    如何判断<b class='flag-5'>哈密顿</b>图_<b class='flag-5'>哈密顿</b>图的必要条件

    哈密顿回路算法

    本文主要介绍了哈密顿回路算法以及程序设计实现。哈密顿图就是从一点出发,经过所有的必须且只能一次,最终回到起点的路径。图中有的边可以不经过,但是不会有边被经过两次。设一个无向图中有N个顶点,若所有顶点的度数大于等于N/2,则哈密顿回路
    的头像 发表于 02-01 16:11 9836次阅读

    永磁同步直线电机位置控制

    针对永磁同步直线电机( PMLSM)的位置控制问题,从能量整型控制的角度进行了研究。基于哈密顿反馈耗散控制方法,结合系统的物理能量特性,在dq旋转坐标系下建立了包含电能和动能的永磁同步直线电机闭环
    发表于 03-01 14:00 12次下载
    永磁同步直线电机位置控制

    模拟量子计算的未来前景将一片光明

    模拟量子计算(analog quantum computing),相对于通用量子计算,有更平易近人的物理实现方式,而且对于玻色采样、搜索、哈密顿量学习、化学模拟等问题上有明显的天然对应方式和加速优势,因此是目前量子信息发展的另一个不可或缺、至关重要的领域。
    发表于 10-18 15:34 1140次阅读

    模拟量子计算有着优异的表现,未来将具有广泛的应用前景

    模拟量子计算(analog quantum computing),相对于通用量子计算,有更平易近人的物理实现方式,而且对于玻色采样、搜索、哈密顿量学习、化学模拟等问题上有明显的天然对应方式和加速优势,因此是目前量子信息发展的另一个不可或缺、至关重要的领域。
    发表于 11-25 11:35 878次阅读

    模拟量子计算的实力前景不可限量

    模拟量子计算(analog quantum computing),相对于通用量子计算,有更平易近人的物理实现方式,而且对于玻色采样、搜索、哈密顿量学习、化学模拟等问题上有明显的天然对应方式和加速优势。
    发表于 12-12 15:18 754次阅读

    基于量子软件的量子绝热近似算法求解

    经典近似算法求解最大割问题时,时间复杂度与图的复杂度呈正相关。为提高求解效率,使用量子绝热近似算法求解无向图最大割问题哈密顿量的基态,其基态对应该问题的最优解。该算法的时间复杂度不依赖于图的顶点
    发表于 05-12 14:28 8次下载

    基于量子材料的素描5d体系

    及至今天,物理人是这样认识量子凝聚态对象的:电子展示了电荷、自旋、轨道三个自由度,再加上晶格的若干可变参量 (幸亏晶格自由度具有某种周期对称性),组成了一个能量基元数不多不少的多体体系,对应的哈密顿作用项也多了起来。
    的头像 发表于 11-06 18:44 654次阅读

    基于高光谱的不同成熟期哈密瓜坚实度研究

    哈密瓜是新疆的特色水果,目前,哈密瓜品种繁多,采收时,不同品种的成熟期不同,在成熟时的表现也不同,因此,简单地通过外表来分辨哈密瓜的成熟度,会造成判别不一致,影响哈密瓜的货架期,从而
    的头像 发表于 03-12 15:41 334次阅读
    基于高光谱的不同成熟期<b class='flag-5'>哈密</b>瓜坚实度研究