写了半天,效率还是有点低的,以后有空再优化下:

//用次序表示法来表示个体编码
#include<iostream>
#include<fstream>
#include<stdlib.h>
#include<time.h>
using namespace std; struct individual{
int DNA[];
int p; //1-p为可以进行杂交的概率
}; int n; //城市的数量
int dist[][]; //城市之间的距离
individual group[]; //总群,保持总群数量在10以内
individual nextGroup[]; //总群备份
int size; //总群大小
int varyP=; //变异概率(总概率为10)
int season;
#define MAX 9999 void show(int season)
{
//打印总群
cout<<"time"<<season<<":"<<endl;
for(int i=;i<=size;i++)
{
for(int j=;j<=n;j++)
{
cout<<group[i].DNA[j]<<" ";
}
cout<<MAX-group[i].p<<endl;
}
cout<<endl;
} //获取相关数据
void getInfo()
{
ifstream input("input.txt");
input>>n;
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
input>>dist[i][j];
}
}
} //产生初始总群
void original()
{
//用次序表示法来表示个体编码
srand(unsigned(time()));
for(int i=;i<=size;i++)
{
group[i].DNA[]=;
for(int j=;j<=n;j++)
{
group[i].DNA[j]=rand()%(n-j+)+; //根据定义,编码的第i位为1~n-j+1的数
}
}
} //计算个体的适应度
int adaption(individual individual)
{
//城市集合的顺序排列
int *t=new int[n];
for(int i=;i<=n;i++)
{
t[i]=i;
} //根据个体的编码计算巡游城市的顺序
int *order=new int[n];
for(int i=;i<=n;i++)
{
//得到下一个要巡游的城市
order[i]=t[individual.DNA[i]];
//在t中将该城市删除
for(int j=individual.DNA[i]+;j<=n;j++)
{
t[j-]=t[j];
}
} //根据巡游的顺序计算所需要的代价
int cost=; //代价总数
cost+=dist[][order[]];
for(int i=;i<n;i++)
{
cost+=dist[order[i]][order[i+]];
}
cost+=dist[order[n]][]; return MAX-cost;
} //杂交
void hybrid(int individual1,int individual2)
{
//随机选择基因交换位置
srand(unsigned(time()));
int p=rand()%n+;//只能在长度范围内进行交换
int t;
for(int i=p;i<=n;i++)
{
t=group[individual1].DNA[i];
group[individual1].DNA[i]=group[individual2].DNA[i];
group[individual2].DNA[i]=t;
}
} //变异
void vary(int individual)
{
//随机选择一个基因变异位置
srand(unsigned(time()));
int p=rand()%(n-)+;//只能在长度范围内变异
group[individual].DNA[p]=rand()%(n-p+)+;
} //选择接下来进行杂交的个体
void choose()
{
int total=; //代价总和
for(int i=;i<=n;i++)
{
total+=group[i].p;
} //根据概率选择n个个体
srand(unsigned(time()));
for(int i=;i<=n;i++)
{
for(int j=,p=,pointer=rand()%total+;j<=n;j++)
{
p+=group[j].p;
if(p>=pointer)
{
nextGroup[i]=group[j];
break;
}
}
} //将下一代总群作为当前总群
for(int i=;i<=n;i++)
{
group[i]=nextGroup[i];
}
} //美丽的大自然
void nature()
{
srand(unsigned(time())); //输入种群大小
cout<<"please input the size of the group:";
cin>>size;
//输入将进行的杂次数
cout<<"input the time:";
cin>>season; //获取大自然的信息
getInfo();
//初始化第一代
original(); for(int i=;i<=season;i++)
{//在时间限内发生的事
show(i);
for(int j=;j<size;j++)
{
//第 j 个个体和第 j+1 个个体进行杂交
hybrid(j,j+); //有一定的几率个体会发生变异
int p=rand()%+;
if(p>=varyP) vary(j); //计算个体被选中的概率
group[j].p=adaption(group[j]); //选择优良的个体
choose();
}
}
show(season);
} void main()
{
nature();
system("pause");
}

TSP问题 遗传算法 智能优化算法的更多相关文章

  1. 模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径

    模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...

  2. 智能优化算法对TSP问题的求解研究

    要求: TSP 算法(Traveling Salesman Problem)是指给定 n 个城市和各个城市之间的距离,要 求确定一条经过各个城市当且仅当一次的最短路径,它是一种典型的优化组合问题,其最 ...

  3. 群智能优化算法-测试函数matlab源码

    群智能优化算法测试函数matlab源代码 global M; creatematrix(2); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %画ackley图. %%%% ...

  4. 【优化算法】遗传算法GA求解混合流水车间调度问题(附C++代码)

    00 前言 各位读者大家好,好久没有介绍算法的推文了,感觉愧对了读者们热爱学习的心灵.于是,今天我们带来了一个神奇的优化算法--遗传算法! 它的优点包括但不限于: 遗传算法对所求解的优化问题没有太多的 ...

  5. 最优化算法——常见优化算法分类及总结

    之前做特征选择,实现过基于群智能算法进行最优化的搜索,看过一些群智能优化算法的论文,在此做一下总结. 在生活或者工作中存在各种各样的最优化问题,比如每个企业和个人都要考虑的一个问题"在一定成 ...

  6. 计算智能(CI)之粒子群优化算法(PSO)(一)

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 计算智能(Computational Intelligence , ...

  7. 粒子群优化算法及其java实现

    憋了两周终于把开题报告憋出来了,再一次证明自己不适合搞学术,哎--,花了点时间把报告中提到的粒子群算法看了看,看了些资料,用java跑起来. 算法简介 粒子群算法最先由Barnhart博士和Kenne ...

  8. 【优化算法】Greedy Randomized Adaptive Search算法 超详细解析,附代码实现TSP问题求解

    01 概述 Greedy Randomized Adaptive Search,贪婪随机自适应搜索(GRAS),是组合优化问题中的多起点元启发式算法,在算法的每次迭代中,主要由两个阶段组成:构造(co ...

  9. ARIMA模型--粒子群优化算法(PSO)和遗传算法(GA)

    ARIMA模型(完整的Word文件可以去我的博客里面下载) ARIMA模型(英语:AutoregressiveIntegratedMovingAverage model),差分整合移动平均自回归模型, ...

随机推荐

  1. STM32F2系列低功耗总结

    序号 运行状态 进入指令(stm32f2xx_pwr.c) 退出条件 状态 IO管脚状态 进一步降低功耗的措施 1 运行模式 上电/系统复位后的默认模式, HCLK驱动CPU运行代码 可通过指令 进入 ...

  2. 移动端h5页面的设计稿尺寸

    当我们在做手机端H5网页设计稿时(当然包含微信端的H5网页设计),如果没有做过类似的移动端的设计,UI设计师和前端工程师肯定会纠结的.如果是app设计师,就不会那么纠结啦. 延伸阅读: 2015年度最 ...

  3. JSP标签编程--简单标签

    javax.servlet.jsp.tagext里的类SimpleTagSupport 使用SimpleTagSupport类一网打尽以往复杂的标签开发,直接使用doTag()方法 java文件: p ...

  4. 浅谈Android五大布局

    Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLay ...

  5. 转 如何使用V7包中ActionBar(Eclipse版)

    http://blog.csdn.net/appte/article/details/11712591 以前3.0以前的版本要使用ActionBar,必须使用国外大牛写的ActionBarSherlo ...

  6. Sql语句不等于空

    对于这种有null的我一般用这样的句子 isnull(Tag,'') <> '文章' 这样就可以搞定了不管是字符还是数字都可以用 <>

  7. C#入门经典(3-窗体应用程序-第二章要点)

    新建一个窗体用用程序,拖一个按钮,加事件和Text属性.打开Form1Designer.cs.

  8. jsp如果超过字数就变成...

    <script> var infoTitle = '<ww:property value="infoTitle"/>'; if(infoTitle.leng ...

  9. Web工程师必备的43款可视化工具

    国外站点DATAVISUALIZATION.CH为大家总结出了当前热用的43款可视化工具,包括Arbor.Chroma.js.D3.js.Google Chart Tools等,绝对让你一饱眼福. 1 ...

  10. js中原生对象、内置对象和宿主对象(转)

    本帖最后由 无解. 于 2012-9-9 12:13 编辑 <ignore_js_op> 这个图来自于<JavaScript语言精髓与编程实践>第三章P184页.最近在改第二版 ...