ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:20.97KB ,
资源ID:8630794      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8630794.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(人工智能实验二基于TSP遗传算法的旅行家问题求解.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、人工智能实验二基于TSP遗传算法的旅行家问题求解遗传算法求TSP问题遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法,它最初由美国Michigan大学J.Holland教授于1975年首先提出来的,并出版了颇有影响的专著Adaptation in Natural and Artificial Systems,GA这个名称才逐渐为人所知,J.Holland教授所提出的GA通常为简单遗传算法(SGA)。遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,而一个种群则

2、由经过基因(gene)编码的一定数目的个体(individual)组成。每个个体实际上是染色体(chromosome)带有特征的实体。染色体作为遗传物质的主要载体,即多个基因的集合,其内部表现(即基因型)是某种基因组合,它决定了个体的形状的外部表现,如黑头发的特征是由染色体中控制这一特征的某种基因组合决定的。因此,在一开始需要实现从表现型到基因型的映射即编码工作。由于仿照基因编码的工作很复杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度(fitness)大小选择(sel

3、ection)个体,并借助于自然遗传学的遗传算子(genetic operators)进行组合交叉(crossover)和变异(mutation),产生出代表新的解集的种群。这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码(decoding),可以作为问题近似最优解。遗传算法特点遗传算法是一类可用于复杂系统优化的具有鲁棒性的搜索算法,与传统的优化算法相比,主要有以下特点:1、 遗传算法以决策变量的编码作为运算对象。传统的优化算法往往直接决策变量的实际值本身,而遗传算法处理决策变量的某种编码形式,使得我们可以借鉴生物学中的染色体和基因的概念,可以模仿

4、自然界生物的遗传和进化机理,也使得我们能够方便的应用遗传操作算子。2、 遗传算法直接以适应度作为搜索信息,无需导数等其它辅助信息。3、 遗传算法使用多个点的搜索信息,具有隐含并行性。4、 遗传算法使用概率搜索技术,而非确定性规则。/*遗传算法解决TSP问题 *code by 小白 at July.30 */def.h#ifndef _GENERATION_AMOUNT#define _GENERATION_AMOUNT 201 /每一代的生存数#define _CITY_AMOUNT 10 /城市数,等于基因数/#define _XCHG_GENE_AMOUNT_WHEN_MIX 2 /每次杂

5、交所交换的碱基数量 #define _TIMES 50 /定义进化次数#define _DISP_INTERVAL 5 /每隔多少次显示基因中的最高适应度#define _CONTAINER std:vector /定义个体基因容器类型#define _CONTAINER_P std:vector /定义适应度容器类型#define _P(a,x,y) *(a+(x)+(y)*_CITY_AMOUNT) #define _P_GENE_ABERRANCE 10 /变异概率1%#define _P_GENE_MIX (_GENERATION_AMOUNT-1)/2 /杂交次数#define _I

6、NFINITE 100000typedef int DISTANCE; /距离矩阵的数据存储类型#endif_TSP.cpp_#include #include #include #include #include #include def.h#include TSP.hvoid main() const static DISTANCE distance_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,

7、 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 ; /城市间的距离矩阵 /distanceij代表i城市与j城市的距离 /* const static DISTANCE distance_CITY_AMOUNT = 0, 1, 4, 6, 8, 1, 3, 7,

8、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、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,

10、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,

11、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 CUnit(DISTANCE *

12、)distance); /初始化 /开始遗传算法 if(!CUnit.fnCreateRandomGene() /产生随机的基因 exit(0); /循环基因编译,杂交,淘汰过程 CUnit.fnEvalAll(); for ( int i = 0; i _TIMES; +i ) /CUnit.fnDispProbability(); CUnit.fnGeneAberrance(); /基因变异 /CUnit.fnDispProbability(); CUnit.fnGeneMix(); /基因杂交 CUnit.fnEvalAll(); /每隔_DISP_INTERVAL显示一次结果 if (

13、 (i+1)%_DISP_INTERVAL = 0 | i = 0) cout 第 i+1 代 std:endl; CUnit.fnDispProbability(); CUnit.fnDispHistoryMin(); CUnit.fnDispHistoryMin(); _tsp.h_#include def.husing namespace std;template class Csga public: Csga(); Csga(DISTANCE *lpDistance); /构造函数 Csga(); /析构函数 bool fnCreateRandomGene(); /产生随机基因 boo

14、l fnGeneAberrance(); /基因变异 bool fnGeneMix(); /基因交叉产生新的个体测试并淘汰适应度低的个体 bool fnEvalAll(); /测试所有基因的适应度 int fnEvalOne(T &Gene); /测试某一个基因的适应度 void fnDispProbability(); /显示每个个体的权值 void fnDispHistoryMin(); private: bool fnGeneAberranceOne(const int &i, const int &j);/变异某个基因 T m_GenerationGene_GENERATION_AMO

15、UNT; /定义每个群体的基因 P m_vProbability; /定义每个群体的适应度 DISTANCE *lpCityDistance; int HistoryMin; T HistoryMinWay; T m_GenerationGeneBk_GENERATION_AMOUNT; ;/构造函数template Csga:Csga()template Csga:Csga(DISTANCE *lpDistance) lpCityDistance = lpDistance; m_vProbability.reserve(_CITY_AMOUNT); HistoryMin = _INFINIT

16、E; /cout _P(lpCityDistance, 3, 2); /调试用/析构函数template Csga:Csga()/产生随机基因template bool Csga:fnCreateRandomGene() srand( time(0) ); /初始化随机数 /cout t基因序列 std:endl; /调试用 /生成随机基因 for(int j, temp, i = 0; i _GENERATION_AMOUNT; +i) m_GenerationGenei.reserve(_CITY_AMOUNT); for (j = 0; j _CITY_AMOUNT; +j) do te

17、mp = rand()%_CITY_AMOUNT; while (find(m_GenerationGenei.begin(), m_GenerationGenei.end(), temp) != m_GenerationGenei.end(); m_GenerationGenei.push_back(temp); /end for /*copy( m_GenerationGenei.begin(), m_GenerationGenei.end(), std:ostream_iterator(cout, ) ); cout std:endl; */ /调试用 return true;/基因变异

18、template bool Csga:fnGeneAberrance() int i, j; int temp; srand(time(0); /抽选一代中的某个基因进行变异 for (i = 0; i _GENERATION_AMOUNT; +i) for (j = 0; j 0 & temp = _P_GENE_ABERRANCE) /随机抽选到的基因进行变异 if(!fnGeneAberranceOne(i, j) exit(0); /end if /end for j /end for i return true;/变异第i个基因的第j位染色体template bool Csga:fn

19、GeneAberranceOne(const int &i, const int &j) int temp; /基因变异结果 srand(time(0); T:iterator pos; /找到变异位与另外一位交换 pos = std:find(m_GenerationGenei.begin(), m_GenerationGenei.end(), temp); if (pos != m_GenerationGenei.end() *pos = m_GenerationGeneij; m_GenerationGeneij = temp; return true; return false;inl

20、ine int fnRndBoundary(int iBegin, int iEnd) return rand()%(iEnd-iBegin) + iBegin;/基因交叉产生新的个体并淘汰适应度低的个体template bool Csga:fnGeneMix() srand(time(0); std:vector temp; /选择池 P vProbabilityBk; /临时保存适应度 vProbabilityBk = m_vProbability; temp.reserve( (_GENERATION_AMOUNT+1)*_GENERATION_AMOUNT)/2 ); P:iterat

21、or pos; for (int i = _GENERATION_AMOUNT; i 0; -i) pos = std:min_element(vProbabilityBk.begin(), vProbabilityBk.end(); temp.insert( temp.end(), i, (int)(pos-vProbabilityBk.begin() ); *pos = _INFINITE; /* fnDispProbability(); cout ttempn std:endl; /调试用 copy( temp.begin(), temp.end(), std:ostream_itera

22、tor(cout, ) ); cout std:endl; /调试用 */ #define _MIN_ELEMENT std:min_element(m_vProbability.begin(), m_vProbability.end() m_GenerationGeneBk_GENERATION_AMOUNT-1 = m_GenerationGene_MIN_ELEMENT - m_vProbability.begin(); int iFather; /父亲的代号 int iMother; /母亲的代号 T Child1, Child2; /父亲与母亲杂交出的子女的基因 T:iterator

23、 tempIter; int LowBoundary; int HighBoundary; /int iChild1Probability,iChild2Probability; T fatherBk,motherBk; T:iterator V_iter; P:iterator P_iter; int iDistance; srand(time(0);#ifndef _ITEMP#define _ITEMP rand()%(_GENERATION_AMOUNT+1)*_GENERATION_AMOUNT)/2)#endif for (i = 0; i _P_GENE_MIX; +i) /杂交

24、_P_GENE_MIX/10次 iFather = temp_ITEMP; do 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); /* cout iMother: iMother std:endl; cout iFather: iFather std:endl; cout LowBoundary: LowBoundary std:endl; cout HighBoundary: HighBoundary

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

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