运用遗传算法求解函数极值(fortran)

本文介绍了如何使用遗传算法在Fortran中求解复杂函数的极值问题,包括算法的起源、基本步骤和关键函数的实现。通过实例展示了遗传算法在函数优化中的应用,并提醒读者注意二进制与十进制转换以及大型程序的模块化编写。
摘要由CSDN通过智能技术生成

写在前面

这篇文章适合一些应急学习最优化算法的朋友们,对于大佬级别的同学请直接跳过,毕竟小编也只是一个和计算机没多大关系的传统工科生。
完整代码已经上传到本人博客资源,欢迎下载

小编第一次遇到遗传算法是在大三的一次美赛中,当时需要学习一些优化算法。然而作为最优化算法的远古级别的遗传算法自然是作为了我第一个学习的目标。

在这里写下我对GA的感觉,这个算法属于智能算法,理论上是可以实现全局最优但是经过一段时间的学习,感觉对于一些复杂的函数想实现全局最优还真的需要点运气。这个算法是最经典的,后期很多类似的算法纷纷出现,粒子群算法,蚁群算法之类的。这里不做评价,小编觉得学习其中一个就好,一通百通嘛。

最后!!!!!这次我用GA算法完整的计算了一些复杂的函数。这里给出一些关键步骤和一些心得以防自己后期回来温习。(ps完整代码后期有空传上去)

遗传算法的前世今生

遗传算法的概念最早是由Bagley J.D
于1967年提出的。后来Michigan大学的J.H.Holland教授于1975年开始对遗传算法(Genetic Algorithm,
GA)的机理进行系统化的研究。遗传算法是对达尔文生物进化理论的简单模拟,其遵循“适者生存”、“优胜略汰”的原理。遗传算法模拟一个人工种群的进化过程,并且通过选择、杂交以及变异等机制,种群经过若干代以后,总是达到最优(或近最优)的状态。

自从遗传算法被提出以来,其得到了广泛的应用,特别是在函数优化、生产调度、模式识别、神经网络、自适应控制等领域,遗传算法更是发挥了重大的作用,大大提高了问题求解的效率。遗传算法也是当前“软计算”领域的重要研究课题。

本文首先结合fortran对遗传算法实现过程进行详细的分析,然后通过1个实际的函数优化案例对其应用进行探讨。

算法步骤简介

很多人都已经写过遗传算法的几个基本步骤,我在这里不做赘述,直接把地址放下来,大家可以去细细的品。这个算法原来这么神奇。

https://blog.csdn.net/qq_34374664/article/details/78874956

之前对我启发很大的博客找不到了,但是看完他的文章我相信你会对GA的大致过程有了一个了解

看完记得回来看我接下来的表演哦!

哈哈哈哈哈,是不是觉得竟然如此神奇,不需要多么强的数学理解能力就可以看懂。

遗传算法的主体结构

让我们开始遗传算法的编程环节
首先,我们需要整理一下思路想一下整个计算过程需要用到哪几个函数(子程序)
1.种群初始化
2.计算种群适应度
3.种群适应度排序
4.选择(筛选)操作
5.交叉操作
6.变异操作
以上是需要用到的函数。
其次,我们需要有一定的编大型程序的意识。对于一些数据可以设置为全局变量并且一直保存,所以我们需要提前把一些经常用到的量理出来。
pop_size: 输入种群大小
chromo_size: 输入染色体长度
generation_size: 输入迭代次数
cross_rate: 输入交叉概率
cross_rate: 输入变异概率
elitism: 输入是否精英选择
(这些变量在后面的用到的时候再作解释)

开始求解:

1.种群初始化:

integer i,j,k
integer pop_size, chromo_size,pop_num
real x
call RANDOM_SEED()
do i=1,pop_size
    do j=1,pop_num
    do k=1,chromo_size
        call RANDOM_NUMBER(x)
        pop(i,j,k) = nint(x)
    end do
    end do
end do

语言解释:对大小为pop-size的种群的每个个体,对个体的pop-num个维度,对每个维度的chromo_size大小的染色体长度进行随机赋值。
RANDOM_SEED()__一个基本的随机数的产生函数

2.计算种群个体适应度(对不同的优化目标,此处需要改写)

 integer i,j,k
    integer pop_size,pop_num,chromo_size
    real fitness_value1(pop_size,pop_num).
    
!do  i=1,pop_size(单层维度,一个自变量时的初始化方法)
!   fitness_value(i) = 0.  
!end do

do i=1,pop_size
   do j=1,pop_num
       do k=1,chromo_size
      if (pop(i,j,k) == 1)then
            fitness_value1(i,j) = fitness_value1(i,j)+2**(k-1)
      end if
      
   end  do     
   fitness_value1(i,j) = -500+fitness_value1(i,j)*(500-(-500)
  • 9
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值