遗传算法的基本代码

本文档提供了一个用Delphi编写的遗传算法的基本代码实现,包括遗传算法的初始化、种群生成、交叉、变异等核心操作。代码中包含了随机数生成、适应度计算和种群统计等功能,适用于理解和学习遗传算法的原理。
摘要由CSDN通过智能技术生成
unit GADelphi;

interface

uses

  Math, SysUtils;



type



  PUnsigned = array of Cardinal;



  Pint = ^integer;

  individual = record

    chrom: PUnsigned;

    fitness: double;

    varible: double;

    xsite: integer;

    parent: array[0..1] of integer;

    utility: Pint;

  end;



  bestever = record

    chrom: PUnsigned;

    fitness: Double;

    varible: Double;

    generation: Integer;

  end;

  //* 随机数发生器使用的静态变量 */



  TGA = class(Tobject)

  public

    oldpop, temp, newpop: array of individual;

    bestfit: bestever;

    sumfitness: double;

    max, avg, min: double;

    pcross, pmutation: single;

    popsize, lchrom, chromsize, gen, maxgen, run, maxruns: integer;

    printstrings: integer; //* 输出染色体编码的判断,0 -- 不输出, 1 -- 输出 */

    nmutation: integer; //* 当前代变异发生次数 */

    ncross: integer;

    procedure initpop;

    procedure objfunc(var critter: individual);

    function flip(prob: single): boolean;

    function select: integer;

    function crossover(var parent1, parent2, child1, child2: PUnsigned): integer;

    function rnd(low, high: integer): integer;

    procedure mutation(child: PUnsigned);

    procedure generation;

    procedure preselect;

    constructor Create;

    procedure initdata;

    procedure initmalloc;

    procedure statistics(pop: array of individual);

    procedure initreport;

    procedure skip(skipcount: integer);

    procedure Go;

    procedure report;

    procedure repchar(ch: pchar; repcount: integer);

    procedure writepop;

    procedure writechrom(chrom: PUnsigned);

    procedure GARandomize;

    procedure advance_random;

    function randomperc: single;

    function randomnormaldeviate: double;

    procedure warmup_random(random_seed: single);

  end;



implementation

var

  oldrand: array[0..54] of double;

  jrand: integer;

  rndx2: double;

  rndcalcflag: integer;



procedure TGA.GARandomize; // * 设定随机数种子并初始化随机数发生器 * /

var

  randomseed: single;

  j1: integer;

begin

  for j1 := 0 to 54 do

    oldrand[j1] := 0.0;

  jrand := 0;

  repeat

    write('随机数种子[0 - 1]: ');

    readln(randomseed);

  until not ((randomseed < 0.0) and (randomseed > 1.0));

  warmup_random(randomseed);

end;



procedure TGA.warmup_random(random_seed: single); // * 初始化随机数发生器 * /

var

  j1, ii: integer;

  new_random, prev_random: double;

begin

  oldrand[54] := random_seed;

  new_random := 0.000000001;

  prev_random := random_seed;

  for j1 := 1 to 54 do

  begin

    ii := (21 * j1) mod 54;

    oldrand[ii] := new_random;

    new_random := prev_random - new_random;

    if (new_random < 0.0) then

      new_random := new_random + 1.0;

    prev_random := oldrand[ii];

  end;

  advance_random;

  advance_random();

  advance_random();

  jrand := 0;

end;



procedure TGA.advance_random; //* 产生55个随机数 */

var

  j1: integer;

  new_random: double;

begin

  for j1 := 0 to 23 do

  begin

    new_random := oldrand[j1] - oldrand[j1 + 31];

    if (new_random < 0.0) then

      new_random := new_random + 1.0;

    oldrand[j1] := new_random;

  end;

  for j1 := 24 to 54 do

  begin

    new_random := oldrand[j1] - oldrand[j1 - 24];

    if (new_ran
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值