How to resolve the algorithm Evolutionary algorithm step by step in the Picat programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Evolutionary algorithm step by step in the Picat programming language

Table of Contents

Problem Statement

Starting with:

Note: to aid comparison, try and ensure the variables and functions mentioned in the task description appear in solutions

A cursory examination of a few of the solutions reveals that the instructions have not been followed rigorously in some solutions. Specifically, Note that some of the the solutions given retain characters in the mutated string that are correct in the target string. However, the instruction above does not state to retain any of the characters while performing the mutation. Although some may believe to do so is implied from the use of "converges" Strictly speaking, the new parent should be selected from the new pool of mutations, and then the new parent used to generate the next set of mutations with parent characters getting retained only by not being mutated. It then becomes possible that the new set of mutations has no member that is fitter than the parent! As illustration of this error, the code for 8th has the following remark. NOTE: this has been changed, the 8th version is completely random now Clearly, this algo will be applying the mutation function only to the parent characters that don't match to the target characters! To ensure that the new parent is never less fit than the prior parent, both the parent and all of the latest mutations are subjected to the fitness test to select the next parent.

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Evolutionary algorithm step by step in the Picat programming language

Source code in the picat programming language

go =>
  _ = random2(),
  Target = "METHINKS IT IS LIKE A WEASEL",
  Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ",
  C = 50, % Population size in each generation
  M = 80,  % Mutation rate per individual in a generation (0.8)

  evo(Target,Chars,C,M),

  nl.


evo(Target,Chars,C,M) => 
  if member(T,Target), not member(T, Chars) then
     printf("The character %w is not in the character set: %w\n", T, Chars);
     halt
  end,

  % first random string
  TargetLen = Target.length,
  Parent = random_chars(Chars,TargetLen),
 
  % 
  % Until current fitness reaches a score of perfect match 
  % with the target string keep generating new populations
  % 
  CurrentFitness = 0,
  Gen = 1,
  while (CurrentFitness < TargetLen)
    println([gen=Gen, currentFitness=CurrentFitness, parent=Parent]),
    Gen := Gen + 1,
    [Parent2,CurrentFitness2] = generation(C,Chars,Target,M,Parent),
    CurrentFitness := CurrentFitness2,
    Parent := Parent2
  end,

  println([gen=Gen, currentFitness=CurrentFitness, parent=Parent]),
  printf("\nFound a perfect fitness (%d) at generation %d\n", CurrentFitness, Gen),
  
  nl.

%
% Generate a random string
%
random_chars(Chars, N) = [Chars[my_rand(Len)] : _ in 1..N] =>
  Len = Chars.length.

%
% Increment the fitness for every position in the string 
% S that matches the target
%
fitness(S,Target) = sum([1: I in 1..Target.length, S[I] == Target[I]]).


%
% If a random number between 1 and 100 is inside the 
% bounds of mutation randomly alter a character in the string  
%
mutate(S,M,Chars) = S2 =>
  S2 = copy_term(S),
  if my_rand(100) <= M then 
    S2[my_rand(S.length)] := Chars[my_rand(Chars.length)]
  end.

% Get a random value between 1 and N
my_rand(N) = 1+(random() mod N).

%
% Create the next population of parent
%
generation(C,Chars,Target,M,Parent) = [NextParent,NextFitness] =>
  % generate a random population 
  Population = [mutate(Parent,M,Chars) : _ in 1..C],

  % Find the member of the population with highest fitness, 
  NextParent = Parent,
  NextFitness = fitness(Parent,Target),
  foreach(X in Population)
    XF = fitness(X,Target),
    if XF > NextFitness then
      NextParent := X,
      NextFitness := XF
    end
  end.

  

You may also check:How to resolve the algorithm IBAN step by step in the Go programming language
You may also check:How to resolve the algorithm Gauss-Jordan matrix inversion step by step in the MATLAB programming language
You may also check:How to resolve the algorithm Zig-zag matrix step by step in the Objeck programming language
You may also check:How to resolve the algorithm Nim game step by step in the Quackery programming language
You may also check:How to resolve the algorithm User input/Graphical step by step in the Wren programming language