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

//用次序表示法来表示个体编码
#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. SQL查询重复记录

    假设现有一张人员表(表名:Person),若想将姓名.身份证号.住址这三个字段完全相同的记录查找出来,使用 1: SELECT p1.* 2: FROM persons p1,persons p2 3 ...

  2. DataSet和List<T> 泛型之间互相转换 (转载, 作者写的很好)

    /DataSet与泛型集合间的互相转换 //利用反射机制将DataTable的字段与自定义类型的公开属性互相赋值. //注意:从DataSet到IList<T>的转换,自定义类型的公开属性 ...

  3. angular指令系列---多行文本框自动高度

    angular.module('MyApp') .directive('autoTextare', ['$timeout', function ($timeout) { return { restri ...

  4. HDU 5569 matrix

    简单DP /* *********************************************** Author :Zhou Zhentao Email :774388357@qq.com ...

  5. Linux 互斥锁的实现原理(pthread_mutex_t)

    本文参考--http://www.bitscn.com/os/linux/201608/725217.html 和http://blog.csdn.net/jianchaolv/article/det ...

  6. MC34063+MOSFET扩流 12V-5V 折腾出了高效率电路(转)

    源:http://www.amobbs.com/thread-5484710-1-1.html 从网上找到一些MC34063扩流降压电路图,一个个的试,根本达不到我的基本要求,全都延续了34063的降 ...

  7. CodeForces 590A Median Smoothing

    构造题. 答案可以o(n)构造出来.首先要发现规律.只有01交替的串才可能变化,变化规律如下: 1开头,长度为偶数(0结尾):变(len-2)/2次 变完后 前半1 后半01开头,长度为奇数(1结尾) ...

  8. FreeRTOS 使用指南(转)

    源:FreeRTOS 使用指南 繁星电子开发团队制作 作为一个轻量级的操作系统,FreeRTOS 提供的功能包括:任务管理.时间管理.信号量.消息队列.内存管理.记录功能等,可基本满足较小系统的需要. ...

  9. openstack controller ha测试环境搭建记录(一)——操作系统准备

    为了初步了解openstack controller ha的工作原理,搭建测试环境进行学习. 在学习该方面知识时,当前采用的操作系统版本是centos 7.1 x64.首先在ESXi中建立2台用于测试 ...

  10. 使用for循环运算

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...