Fortran Coder

标题: 遗传算法(面向对象) [打印本页]

作者: weixing1531    时间: 2019-4-16 23:40
标题: 遗传算法(面向对象)
本帖最后由 weixing1531 于 2019-4-21 18:45 编辑

本程序在网友chichuyun程序基础上修改而得
原代码地址:https://github.com/chichuyun/Fortran-Tutorial/blob/master/16.%20%E9%81%97%E4%BC%A0%E7%AE%97%E6%B3%95.md

本人作了如下修改:
1.二进制编码方式由整数数组编码改为整数位编码,节约了内存
2.由仅支持单变量改为支持多变量
3.增加求最小值计算
4.增加格雷码

ga4vGray.f90 (15.5 KB, 下载次数: 22)

[Fortran] 纯文本查看 复制代码
program main
  use GA
  implicit none

  integer(kind=IB)::x=6,y
  type(genetic),allocatable :: process
  ALLOCATE(process)
  process%func => Fitness_func      ! 适应度函数 vector
  process%seed = 623456             ! 随机数种子
  process%iter_num = 200            ! 迭代次数
  process%population = 200          ! 种群大小
  process%numerical = 7             ! 有效数字
  process%retain_rate = 0.35_RP     ! 存活率
  process%random_rate = 0.35_RP     ! 随机率
  process%mutation_rate = 0.005_RP  ! 变异率
  process%x_num = 2                 ! 自变量个数
  !process%IsGray = .true.          ! .true.代表格雷编码
  !process%IsMin = .true.           ! .true.代表求最小值

  process%upperb = (/12.1_RP,5.8_RP/) ! 自变量上限
  process%lowerb = (/-3.0_RP,4.1_RP/) ! 自变量下限

  call process%Evolve()         ! 演化
  call process%Output()         ! 输出
  !以下验证编码转换函数
  call process%binary2gray(x,y) !二进制编码转换为格雷码
  write(*,*)y
  call process%gray2binary(x,y) !格雷码转换为二进制编码
  write(*,*)y
  DEALLOCATE(process)
  stop
contains
  !----------------------------------------------------------------------------!
  real(kind=RP) function Fitness_func(x) ! sufficiency function 适应度函数
    implicit none
    !process%x_num明确了自变量个数
    real(kind=RP), parameter :: PI=3.141592653589793_RP
    real(kind=RP), intent(in) :: x(:)

    !算例 -3.0<x(1)<12.1 4.1<x(2)<5.8  在(11.6255,5.7250)处有一个全局最大值38.8503
    Fitness_func = 21.5_RP + x(1) * Sin(4.0_RP * PI * x(1)) + x(2) * Sin(20.0_RP * PI * x(2))
  end function Fitness_func
  !----------------------------------------------------------------------------!
end program main






欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2