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

//用次序表示法来表示个体编码
#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. Vi 详细教程

    进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于最后 ...

  2. Ubuntu vim显示行号语法高亮自动缩进

    配置文件名为Ubuntu vimrc在Fedora中vim的配置文件存放在/etc目录中,配置文件名为Ubuntu vimrc在终端 输入以下命令来编辑Ubuntu vimrc配置文件:sudo vi ...

  3. gridview如何隐藏一列数据,但又可以使用这列数据

    解决方案在RowCreated事件中书写如下代码 void GridView1_RowCreated(object sender, GridViewRowEventArgs e)    {       ...

  4. 深入理解最强桌面地图控件GMAP.NET ---离线地图

    enjoyeclipse 深入理解最强桌面地图控件GMAP.NET ---离线地图 这章会介绍GMAP.NET的核心功能之一:离线地图.这个功能可以满足很多政府项目.保密项目.或者由于种种原因不能上网 ...

  5. FragmentActivity与Fragment两者交互方法简介(转)

    FragmentActivity与Fragment两者交互方法简介 分类: Fragment 2014-07-07 18:17 88人阅读 评论(0) 收藏 举报 在Android4.0后很多时候我们 ...

  6. XML简单的增改删操作

    XML文件的简单增改删,每一个都可以单独拿出来使用. 新创建XML文件,<?xmlversion="1.0"encoding="utf-8"?> & ...

  7. 关于js的连续赋值

    首先,来看一个经典的案例: <script>var a = {n: 1}var b = a;a.x = a = {n: 2}alert(a.x);alert(b.x);</scrip ...

  8. HDU 5547 暴力

    Sudoku Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Subm ...

  9. 自动化运维工具Ansible详细部署

    本文来源:http://sofar.blog.51cto.com/353572/1579894/ 前言 一个由 Python 编写的强大的配置管理解决方案.尽管市面上已经有很多可供选择的配置管理解决方 ...

  10. <c:foreach> 标签怎么获取循环次数?

    <c:forEach var="i" begin="1" end="9" varStatus="status"&g ...