TSP问题的概述.docx

上传人:b****6 文档编号:6090251 上传时间:2023-01-03 格式:DOCX 页数:9 大小:16.40KB
下载 相关 举报
TSP问题的概述.docx_第1页
第1页 / 共9页
TSP问题的概述.docx_第2页
第2页 / 共9页
TSP问题的概述.docx_第3页
第3页 / 共9页
TSP问题的概述.docx_第4页
第4页 / 共9页
TSP问题的概述.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

TSP问题的概述.docx

《TSP问题的概述.docx》由会员分享,可在线阅读,更多相关《TSP问题的概述.docx(9页珍藏版)》请在冰豆网上搜索。

TSP问题的概述.docx

TSP问题的概述

TSP问题的概述

  旅行商问题,即TSP问题(TravelingSalesmanProblem)是数学领域中著名问题之一。

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

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

  TSP问题的由来

  TSP的历史很久,最早的描述是1759年欧拉研究的骑士周游问题,即对于国际象棋棋盘中的64个方格,走访64个方格一次且仅一次,并且最终返回到起始点。

  TSP由美国RAND公司于1948年引入,该公司的声誉以及线形规划这一新方法的出现使得TSP成为一个知名且流行的问题。

  TSP在中国的研究

  同样的问题,在中国还有另一个描述方法:

一个邮递员从邮局出发,到所辖街道投邮件,最后返回邮局,如果他必须走遍所辖的每条街道至少一次,那么他应该如何选择投递路线,使所走的路程最短?

这个描述之所以称为中国邮递员问题(ChinesePostmanProblemCPP)因为是我国学者管梅古教授于1962年提出的这个问题并且给出了一个解法。

人工智能上的旅行商问题,以下给出的是算法,只是理解算法之用。

  fordetailcontactmeQQ:

413309082

  /****************算法总框架*****************************/

  inti;

  gs.search_init(adaptee.list_place.getSelectedIndex(),adaptee.list_fun.getSelectedIndex());

  do{i=gs.search_step();}while(i==0);

  /***************searchinit**************************/

  publicvoidsearch_init(intstartindex,intstrategy)

  {

  this.strategy=strategy;

  AStar.graph=G;

  G.setSize(AStar.len);

  start.index=startindex;

  Vertexs=newVertex();

  s.index=start.index;

  s.parent=-1;

  n=null;

  s.value=f(s.index);//s的估价函数值

  G.add(s);

  start.parentpos=-1;

  start.value=s.value;

  open.add(start);

  step=0;

  }

  /***************searchstep**************************/

  publicintsearch_step()

  {

  Openm;

  Vertexold_m;

  inti,j;

  intf;

  intparentpos;

  if(open.next==null)

  return-1;//查找失败

  //扩展的步骤数增加

  step++;

  //Open表非空

  //Open表中移出第一个

  n=open.removeFirst();

  //n放入CLOSE中,返回放入的位置

  parentpos=close.Add(n.index,n.parentpos);

  if(n.index==start.index&&step!

=1)//结束状态

  return1;

  //扩展n结点

  i=n.index;

  for(j=0;j

  {

  if(i!

=j&&value[j]!

=-1)//对于所有n的后继结点m(j)

  {

  if(j==start.index&&isAll(n))//所有城市已访问过,且回到出发城市

  {

  f=f(j);//计算此时的f值

  old_m=G.getVertex(j);

  if(old_m!

=null)

  if(old_m.value>f||old_m.value==0)

  G.add(j,i,f);//j(m)i(n),G中添加j(m),父节点为i(n),估价函数值为f

  G.addSub(i,j);//i(n)的后继中添加j(m)

  m=newOpen(j,parentpos,f);//Open表中添加m(j)

  open.add(m);

  continue;

  }

  if(!

isExist(n,j))//m(j)不在n(i)的祖先中(不扩张n的祖先结点)

  {

  f=f(j);//计算f值

  //取得旧的m(j)中value最小的,G中的节电保存了从出发城市到此地最小估价函数

  old_m=G.getVertex(j);

  //m(j)不再G中,m(j)也就不在Close中

  if(old_m==null)

  {

  //j(m)i(n),G中添加j(m),父节点为i(n),估价函数值为f

  G.add(j,i,f);

  //n(i)添加后继m(j)

  G.addSub(i,j);

  //加入Open表

  m=newOpen(j,parentpos,f);

  open.add(m);//m添加入Open表中

  }

  else//m(j)在G中,表示Close表中有m(j)结点

  {

  if(old_m.value>f)//新值比较小,采用新值

  {

  //更新G中的估价函数值,以及相关指针

  old_m.value=f;

  old_m.parent=i;

  //添加相关从Close中删除的代码,不删除亦可

  }

  G.addSub(i,j);//n(i)添加后继m(j)

  //从Close中删除,移入Open表中,实际上Close表中仍然保留

  m=newOpen(j,parentpos,f);

  open.add(m);

  }

  }

  }

  }

  //本次没查找到解,请继续

  return0;

  }

 

A*算法实现的旅行商问题

人工智能上的旅行商问题,以下给出的是算法,只是理解算法之用。

/****************算法总框架*****************************/

inti;       

gs.search_init(adaptee.list_place.getSelectedIndex(),adaptee.list_fun.getSelectedIndex());

     do

     {

       i=gs.search_step();     

     }while(i==0);

  /***************searchinit**************************/

     publicvoidsearch_init(intstartindex,intstrategy)

  {

     this.strategy=strategy;

     AStar.graph=G;

     G.setSize(AStar.len);   

     

     start.index=startindex;

     Vertexs=newVertex();    

     s.index=start.index;

     s.parent=-1;

     n=null;

     s.value=f(s.index);//s的估价函数值

     G.add(s);

     

     start.parentpos=-1;

     start.value=s.value;

     open.add(start);

     step=0;

  }

  /***************searchstep**************************/

publicintsearch_step()

  {    

     Openm;

     Vertexold_m;

     

     inti,j;  

     intf;    

     intparentpos;

     if(open.next==null)

       return-1;//查找失败

     

     

     //扩展的步骤数增加

     step++;

     

     //Open表非空       

     

     //Open表中移出第一个

     n=open.removeFirst();

     

     //n放入CLOSE中,返回放入的位置

     parentpos=close.Add(n.index,n.parentpos);

     if(n.index==start.index&&step!

=1)//结束状态

       return1;

       

     //扩展n结点

     i=n.index;

     for(j=0;j

     {

       if(i!

=j&&value[i][j]!

=-1)//对于所有n的后继结点m(j)

       {

          if(j==start.index&&isAll(n))  //所有城市已访问过,且回到出发城市

          {

             f=f(j);      //计算此时的f值

             old_m=G.getVertex(j);

             if(old_m!

=null)            

                if(old_m.value>f||old_m.value==0)

                   G.add(j,i,f);//j(m)i(n),G中添加j(m),父节点为i(n),估价函数值为f

             

             G.addSub(i,j);  //i(n)的后继中添加j(m)

             m=newOpen(j,parentpos,f);//Open表中添加m(j)

             open.add(m);

             continue;

          }

             

          if(!

isExist(n,j))  //m(j)不在n(i)的祖先中(不扩张n的祖先结点)

          {

             f=f(j);   //计算f值

             

             //取得旧的m(j)中value最小的,G中的节电保存了从出发城市到此地最小估价函数

             old_m=G.getVertex(j);

             

             //m(j)不再G中,m(j)也就不在Close中

             if(old_m==null)

             {

                //j(m)i(n),G中添加j(m),父节点为i(n),估价函数值为f

                G.add(j,i,f);

                //n(i)添加后继m(j)

                G.addSub(i,j);

                //加入Open表

                m=newOpen(j,parentpos,f);

                open.add(m);//m添加入Open表中

             }

             else//m(j)在G中,表示Close表中有m(j)结点

             {

                

                if(old_m.value>f)//新值比较小,采用新值

                {

                  //更新G中的估价函数值,以及相关指针

                   old_m.value=f;

                   old_m.parent=i;

                   

                   //添加相关从Close中删除的代码,不删除亦可

                   

                }

                G.addSub(i,j);  //n(i)添加后继m(j)

                

                //从Close中删除,移入Open表中,实际上Close表中仍然保留

                m=newOpen(j,parentpos,f);

                open.add(m);

             }

          }

             

       }

     }

       //本次没查找到解,请继续

       return0;

     

  }

 

(注:

可编辑下载,若有不当之处,请指正,谢谢!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1