人工智能实验二基于TSP遗传算法的旅行家问题求解Word下载.docx

上传人:b****5 文档编号:21766999 上传时间:2023-02-01 格式:DOCX 页数:18 大小:20.97KB
下载 相关 举报
人工智能实验二基于TSP遗传算法的旅行家问题求解Word下载.docx_第1页
第1页 / 共18页
人工智能实验二基于TSP遗传算法的旅行家问题求解Word下载.docx_第2页
第2页 / 共18页
人工智能实验二基于TSP遗传算法的旅行家问题求解Word下载.docx_第3页
第3页 / 共18页
人工智能实验二基于TSP遗传算法的旅行家问题求解Word下载.docx_第4页
第4页 / 共18页
人工智能实验二基于TSP遗传算法的旅行家问题求解Word下载.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

人工智能实验二基于TSP遗传算法的旅行家问题求解Word下载.docx

《人工智能实验二基于TSP遗传算法的旅行家问题求解Word下载.docx》由会员分享,可在线阅读,更多相关《人工智能实验二基于TSP遗传算法的旅行家问题求解Word下载.docx(18页珍藏版)》请在冰豆网上搜索。

人工智能实验二基于TSP遗传算法的旅行家问题求解Word下载.docx

vector<

int>

//定义个体基因容器类型

  #define_CONTAINER_Pstd:

//定义适应度容器类型

  #define_P(a,x,y)*(a+(x)+(y)*_CITY_AMOUNT)

  #define_P_GENE_ABERRANCE10//变异概率1%

  #define_P_GENE_MIX(_GENERATION_AMOUNT-1)/2//杂交次数

  #define_INFINITE100000

  typedefintDISTANCE;

//距离矩阵的数据存储类型

  #endif

  ___________________________________________________________________________

  TSP.cpp

  ____________________________________________________________________________

  #include<

iostream>

vector>

algorithm>

time.h>

stdlib.h>

  #include"

def.h"

TSP.h"

  voidmain()

  {

  

  conststaticDISTANCEdistance[][_CITY_AMOUNT]

  ={

  0,1,4,6,8,1,3,7,2,9,

  1,0,7,5,3,8,3,4,2,4,

  4,7,0,3,8,3,7,9,1,2,

  6,5,3,0,3,1,5,2,9,1,

  8,3,8,3,0,2,3,1,4,6,

  1,8,3,1,2,0,3,3,9,5,

  3,3,7,5,3,3,0,7,5,9,

  7,4,9,2,1,3,7,0,1,3,

  2,2,1,9,4,9,5,1,0,1,

  9,4,2,1,6,5,9,3,1,0

  };

//城市间的距离矩阵

  //distance[i][j]代表i城市与j城市的距离

  /*

  conststaticDISTANCEdistance[][_CITY_AMOUNT]

  ={

  0,1,4,6,8,1,3,7,2,9,7,3,4,5,8,9,2,8,2,8,

  1,0,7,5,3,8,3,4,2,4,4,6,2,8,2,9,4,5,2,1,

  4,7,0,3,8,3,7,9,1,2,5,8,1,8,9,4,7,4,8,4,

  6,5,3,0,3,1,5,2,9,1,3,5,7,3,4,7,3,4,5,2,

  8,3,8,3,0,2,3,1,4,6,3,8,4,5,2,8,1,7,4,7,

  1,8,3,1,2,0,3,3,9,5,4,5,2,7,3,6,2,3,7,1,

  3,3,7,5,3,3,0,7,5,9,3,4,5,9,3,7,3,2,8,1,

  7,4,9,2,1,3,7,0,1,3,4,5,2,7,6,3,3,8,3,5,

  2,2,1,9,4,9,5,1,0,1,3,4,7,3,7,5,9,2,1,7,

  9,4,2,1,6,5,9,3,1,0,3,7,3,7,4,9,3,5,2,5,

  7,4,5,3,3,4,3,4,3,3,0,5,7,8,4,3,1,5,9,3,

  3,6,8,5,8,5,4,5,4,7,5,0,8,3,1,5,8,5,8,3,

  4,2,1,7,4,2,5,2,7,3,7,8,0,5,7,4,8,3,5,3,

  5,8,8,3,5,7,9,7,3,7,8,3,5,0,8,3,1,8,4,5,

  8,2,9,4,2,3,3,6,7,4,4,1,7,8,0,4,2,1,8,4,

  9,9,4,7,8,6,7,3,5,9,3,5,4,3,4,0,4,1,8,4,

  2,4,7,3,1,2,3,3,9,3,1,8,8,1,2,4,0,4,3,7,

  8,5,4,4,7,3,2,8,2,5,5,5,3,8,1,1,4,0,2,6,

  2,2,8,5,4,7,8,3,1,2,9,8,5,4,8,8,3,2,0,4,

  8,1,4,2,7,1,1,5,7,5,3,3,3,5,4,4,7,6,4,0

  */

  Csga<

_CONTAINER,_CONTAINER_P>

CUnit((DISTANCE*)distance);

//初始化

  //开始遗传算法

  if(!

CUnit.fnCreateRandomGene())//产生随机的基因

  {

  exit(0);

  }

  //循环基因编译,杂交,淘汰过程

  CUnit.fnEvalAll();

  for(inti=0;

i<

_TIMES;

++i)

  //CUnit.fnDispProbability();

  CUnit.fnGeneAberrance();

//基因变异

  CUnit.fnGeneMix();

//基因杂交

  //每隔_DISP_INTERVAL显示一次结果

  if((i+1)%_DISP_INTERVAL==0||i==0)

  cout<

<

"

第"

<

i+1<

代"

std:

endl;

  CUnit.fnDispProbability();

  CUnit.fnDispHistoryMin();

  }

  tsp.h

  usingnamespacestd;

  template<

typenameT,typenameP>

  classCsga

  public:

  Csga();

  Csga(DISTANCE*lpDistance);

//构造函数

  ~Csga();

//析构函数

  boolfnCreateRandomGene();

//产生随机基因

  boolfnGeneAberrance();

  boolfnGeneMix();

//基因交叉产生新的个体测试并淘汰适应度低的个体

  boolfnEvalAll();

//测试所有基因的适应度

  intfnEvalOne(T&

Gene);

//测试某一个基因的适应度

  voidfnDispProbability();

//显示每个个体的权值

  voidfnDispHistoryMin();

  private:

  boolfnGeneAberranceOne(constint&

i,constint&

j);

//变异某个基因

  Tm_GenerationGene[_GENERATION_AMOUNT];

//定义每个群体的基因

  Pm_vProbability;

//定义每个群体的适应度

  DISTANCE*lpCityDistance;

  intHistoryMin;

  THistoryMinWay;

  Tm_GenerationGeneBk[_GENERATION_AMOUNT];

  };

  //构造函数

  Csga<

T,P>

Csga()

Csga(DISTANCE*lpDistance)

  lpCityDistance=lpDistance;

  m_vProbability.reserve(_CITY_AMOUNT);

  HistoryMin=_INFINITE;

  //cout<

_P(lpCityDistance,3,2);

//调试用

  //析构函数

~Csga()

  //产生随机基因

  boolCsga<

fnCreateRandomGene()

  srand(time(0));

//初始化随机数

\t基因序列"

  //生成随机基因

  for(intj,temp,i=0;

_GENERATION_AMOUNT;

++i)

  m_GenerationGene[i].reserve(_CITY_AMOUNT);

  for(j=0;

j<

_CITY_AMOUNT;

++j)

  do

  temp=rand()%_CITY_AMOUNT;

  }while(find(m_GenerationGene[i].begin(),m_GenerationGene[i].end(),temp)

  !

=m_GenerationGene[i].end());

  m_GenerationGene[i].push_back(temp);

  }//endfor

  /*copy(m_GenerationGene[i].begin(),m_GenerationGene[i].end(),

  std:

ostream_iterator<

(cout,"

));

*///调试用

  returntrue;

  //基因变异

fnGeneAberrance()

  inti,j;

  inttemp;

  srand(time(0));

  //抽选一代中的某个基因进行变异

  for(i=0;

  temp=rand()%10000;

  if(temp>

0&

&

temp<

=_P_GENE_ABERRANCE)

  //随机抽选到的基因进行变异

fnGeneAberranceOne(i,j)){exit(0);

}

  }//endif

  }//endforj

  }//endfori

  //变异第i个基因的第j位染色体

fnGeneAberranceOne(constint&

j)

//基因变异结果

  T:

iteratorpos;

  //找到变异位与另外一位交换

  pos=std:

find(m_GenerationGene[i].begin(),m_GenerationGene[i].end(),temp);

  if(pos!

=m_GenerationGene[i].end())

  *pos=m_GenerationGene[i][j];

  m_GenerationGene[i][j]=temp;

  returnfalse;

  inlineintfnRndBoundary(intiBegin,intiEnd)

  {

  returnrand()%(iEnd-iBegin)+iBegin;

  //基因交叉产生新的个体并淘汰适应度低的个体

fnGeneMix()

temp;

//选择池

  PvProbabilityBk;

//临时保存适应度

  vProbabilityBk=m_vProbability;

  temp.reserve(((_GENERATION_AMOUNT+1)*_GENERATION_AMOUNT)/2);

  P:

  for(inti=_GENERATION_AMOUNT;

i>

0;

--i)

min_element(vProbabilityBk.begin(),vProbabilityBk.end());

  temp.insert(temp.end(),i,(int)(pos-vProbabilityBk.begin()));

  *pos=_INFINITE;

  /**************************************************************************

  fnDispProbability();

\ttemp\n"

  copy(temp.begin(),temp.end(),std:

  **************************************************************************/

  #define_MIN_ELEMENTstd:

min_element(m_vProbability.begin(),m_vProbability.end())

  m_GenerationGeneBk[_GENERATION_AMOUNT-1]=m_GenerationGene[_MIN_ELEMENT-m_vProbability.begin()];

  intiFather;

//父亲的代号

  intiMother;

//母亲的代号

  TChild1,Child2;

//父亲与母亲杂交出的子女的基因

iteratortempIter;

  intLowBoundary;

  intHighBoundary;

  //intiChild1Probability,iChild2Probability;

  TfatherBk,motherBk;

iteratorV_iter;

iteratorP_iter;

  intiDistance;

  #ifndef_ITEMP

  #define_ITEMPrand()%(((_GENERATION_AMOUNT+1)*_GENERATION_AMOUNT)/2)

_P_GENE_MIX;

++i)//杂交_P_GENE_MIX/10次

  iFather=temp[_ITEMP];

  iMother=temp[_ITEMP];

  }while(iMother==iFather);

  Child1.reserve(_CITY_AMOUNT);

//初始化子女的碱基数

  Child2.reserve(_CITY_AMOUNT);

  Child1.clear();

  Child2.clear();

  LowBoundary=fnRndBoundary(0,_CITY_AMOUNT-2);

  HighBoundary=fnRndBoundary(LowBoundary+1,_CITY_AMOUNT-1);

  /**********************************************************************

iMother:

"

iMother<

iFather:

iFather<

LowBoundary:

LowBoundary<

HighBoundary:

HighBoundary

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

当前位置:首页 > 表格模板 > 调查报告

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

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