tourselect.c  文件中共有两个函数:

selection (population *old_pop, population *new_pop)

individual* tournament (individual *ind1, individual *ind2)

首先,第一个函数代码如下:

1 /*Routine for tournament selection, it creates a new_pop from old_pop by performing tournament selection and the crossover*/

2 void selection (population *old_pop, population *new_pop)3 {4 int *a1, *a2;5 inttemp;6 inti;7 intrand;8 individual *parent1, *parent2;9 a1 = (int *)malloc(popsize*sizeof(int));10 a2 = (int *)malloc(popsize*sizeof(int));11 for (i=0; iind[a1[i]], &old_pop->ind[a1[i+1]]);29 parent2 = tournament (&old_pop->ind[a1[i+2]], &old_pop->ind[a1[i+3]]);30 crossover (parent1, parent2, &new_pop->ind[i], &new_pop->ind[i+1]);31 parent1 = tournament (&old_pop->ind[a2[i]], &old_pop->ind[a2[i+1]]);32 parent2 = tournament (&old_pop->ind[a2[i+2]], &old_pop->ind[a2[i+3]]);33 crossover (parent1, parent2, &new_pop->ind[i+2], &new_pop->ind[i+3]);34 }35 free(a1);36 free(a2);37 return;38 }

其中,

a1 = (int *)malloc(popsize*sizeof(int));

a2= (int *)malloc(popsize*sizeof(int));

分别生成两个  种群个体大小的数组 a1  a2,这两个数组里面以后会分别保存乱序的种群个体序号。

for (i=0; i

{

a1[i]= a2[i] =i;

}

对两个数组进行初始话,顺序存放种群个体序号。

for (i=0; i

{

rand= rnd (i, popsize-1);

temp=a1[rand];

a1[rand]=a1[i];

a1[i]=temp;

rand= rnd (i, popsize-1);

temp=a2[rand];

a2[rand]=a2[i];

a2[i]=temp;

}

对a1, a2  数组中存放的个体序号打乱,其中打乱的次数为  popsize  ,该操作基本保证所有个体的序号基本不在其原有位置上。

(在高级面向对象语言中以上代码可以用一句库函数调用代替)

for (i=0; i

{

parent1= tournament (&old_pop->ind[a1[i]], &old_pop->ind[a1[i+1]]);

parent2= tournament (&old_pop->ind[a1[i+2]], &old_pop->ind[a1[i+3]]);

crossover (parent1, parent2,&new_pop->ind[i], &new_pop->ind[i+1]);

parent1= tournament (&old_pop->ind[a2[i]], &old_pop->ind[a2[i+1]]);

parent2= tournament (&old_pop->ind[a2[i+2]], &old_pop->ind[a2[i+3]]);

crossover (parent1, parent2,&new_pop->ind[i+2], &new_pop->ind[i+3]);

}

这部分代码完成了遗传算法中的  选择操作和  交叉操作。

其中  old_pop  new_pop都是相同种群个体大小的种群,其种群大小均为  popsize。

tournament   锦标赛法,这里面使用的是二元锦标赛选择法,循环体内共有4次  tournament  操作,该循环共执行  popsize/4  次,故共进行了  popsize  次二元锦标赛选择。由于每次选择出一个新个体,所以该方式选择出的新种群 new_pop  个体数   和   旧种群 old_pop  个体数一致。

同理,crossover  操作进行了  popsize/2  次 , (其中每次进行交叉操作的时候都是选择两个个体,每次判断选择的两个个体是否进行交叉都要根据给定的交叉概率进行判断),该循环体中crossover函数总共会对   popsize   个个体进行处理。

注意: crossover  操作  循环调用    popsize/2  次  而不是    popsize  次。

1 /*Routine for binary tournament*/

2 individual* tournament (individual *ind1, individual *ind2)3 {4 intflag;5 flag =check_dominance (ind1, ind2);6 if (flag==1)7 {8 return(ind1);9 }10 if (flag==-1)11 {12 return(ind2);13 }14 if (ind1->crowd_dist > ind2->crowd_dist)15 {16 return(ind1);17 }18 if (ind2->crowd_dist > ind1->crowd_dist)19 {20 return(ind2);21 }22 if ((randomperc()) <= 0.5)23 {24 return(ind1);25 }26 else

27 {28 return(ind2);29 }30 }

二元锦标赛竞赛法比较简单,  其中调用  check_dominance  函数判断两个个体的支配关系,如果互不支配则判断两个个体的拥挤距离,如果都相同这则随机选择一个个体。

遗传算法锦标赛选择java实现_多目标遗传算法 ------ NSGA-II (部分源码解析)二元锦标赛选择 tourselect.c...相关推荐

  1. 视频教程-YOLOv3目标检测:原理与源码解析-计算机视觉

    YOLOv3目标检测:原理与源码解析 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥78.00 ...

  2. Spring5源码 - 12 Spring事件监听机制_异步事件监听应用及源码解析

    文章目录 Pre 实现原理 应用 配置类 Event事件 事件监听 EventListener 发布事件 publishEvent 源码解析 (反推) Spring默认的事件广播器 SimpleApp ...

  3. JAVA并发容器-ConcurrentHashMap 1.7和1.8 源码解析

    HashMap是一个线程不安全的类,在并发情况下会产生很多问题,详情可以参考HashMap 源码解析:HashTable是线程安全的类,但是它使用的是synchronized来保证线程安全,线程竞争激 ...

  4. java if中的continue_java中break和continue源码解析

    在自己学习java语言的过程中,很容易把break和continue的用法混淆.为了便于以后快速查阅及温习,在此特留学习笔记一份. 简述 在任何迭代语句的主体部分,都可以用break和continue ...

  5. java 并发框架源码_某网Java并发编程高阶技术-高性能并发框架源码解析与实战(云盘下载)...

    第1章 课程介绍(Java并发编程进阶课程) 什么是Disruptor?它一个高性能的异步处理框架,号称"单线程每秒可处理600W个订单"的神器,本课程目标:彻底精通一个如此优秀的 ...

  6. java 中线程池的种类,原理以及源码解析(1)

    java 中的线程池创建都是Executors 类中提供的方法,并且方法返回线程池对象. Executors 源码: // // Source code recreated from a .class ...

  7. java B2B2C Springboot多租户电子商城系统-Eureka源码解析...

    Eureka的限流算法类RateLimiter是基于令牌桶算法来实现的,下面看一看令牌桶算法的原理: 需要JAVA Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码 一零 ...

  8. java 并发框架源码_Java并发编程高阶技术-高性能并发框架源码解析与实战

    Java并发编程高阶技术-高性能并发框架源码解析与实战 1 _0 Z' @+ l: s3 f6 r% t|____资料3 Z9 P- I2 x8 T6 ^ |____coding-275-master ...

  9. Spring5源码 - 13 Spring事件监听机制_@EventListener源码解析

    文章目录 Pre 概览 开天辟地的时候初始化的处理器 @EventListener EventListenerMethodProcessor afterSingletonsInstantiated 小 ...

最新文章

  1. 在android工程中,res目录下又有anim、drawable、layout、menu、raw、values和xml文件夹,分别用来保存?...
  2. PIC单片机精通_异步串口通讯实例与细节
  3. sortable 拖拽时互换目标的位置_双端通用型JS拖拽插件的封装与应用
  4. Walle 瓦力 web部署系统
  5. cmd命令操作Oracle数据库
  6. java 抽象封装多态_java面向对象(封装,继承,多态,抽象,接口的定义和实现)...
  7. OpenShift 4 Hands-on Lab (0) - 教程说明和准备环境
  8. 2017年java教材推荐_干货|2017年最新JavaEE课程大纲分享
  9. 李宏毅机器学习——无监督学习(四)
  10. win10超好看的鼠标主题,你也来试试吧
  11. 容器监控工具cAdvisor
  12. 论坛mysql表设计_网站论坛如何制作—简单论坛数据库的设计与操作
  13. pkg打包node工程
  14. #《神奇动物:邓布利多之谜》
  15. 行业分析报告|全球与中国项目货物物流市场现状及未来发展趋势
  16. NTFS文件系统详解(三)NTFS元文件解析
  17. 利用Nginxcp为cPanel/WHM服务器开启nginx支持
  18. foxmail国外只能收邮件,不能发邮件
  19. u盘格式化后数据能恢复吗?
  20. AndroidStudio - - - 点击头像更换头像_菜单选择_相机拍照与相册获取

热门文章

  1. jxl操作合并单元格复杂表头
  2. 微信小程序开发之获取用户信息
  3. 补淘宝单平台哪个便宜?如何补单才能增加权重?
  4. html自动跳转加微信好友,底部固定div并跳转复制微信号添加好友
  5. ios适配暗黑模式-图片、颜色
  6. oracle数据比对工具
  7. [转] 【幽默搞笑】笑死你,别怪我!(狠逗、狠强)
  8. A-Level商务例题解析及练习
  9. 蝴蝶效应、青蛙现象、鳄鱼法则
  10. 代码阅读工具使用入门