Xavier Nayrac

Rubyiste accro au TDD, serial blogger, apprenti data scientist, heureux utilisateur de Vim, accordéoniste.
Si vous vous sentez particulièrement généreux, suivez moi sur Twitter.

Un algorithme génétique en Julia - partie 3

| Comments

Niveau : intermédiaire

Aujourd’hui j’essaye de faire la sélection en vue de la reprodution ;) Si vous aviez suivi ma série d’articles les algorithmes génétiques démystifiés vous savez de quoi je parle…

Voici d’abord les fonctions que j’ai jusqu’à présent :

main.jl
1
2
3
4
5
6
7
create_chromosome(size) = rand(0:1, size)

function create_population(size, chromosome_size)
  [ create_chromosome(chromosome_size) for _ in 1:size ]
end

score(population) = map(sum, population)

Alors j’ai remis des _, parce que sans j’y arrivais vraiment pas ;) J’ai aussi ajouté l’argument size à la fonction de création d’un chromosome pour éviter les nombres magiques.

Je veux opérer une sélection très simple : un tournoi. Pour ça, je commence avec une fonction fight qui va renvoyer le meilleur chromosome parmi deux:

1
2
3
function fight(scores, index1, index2)
  scores[index1] > scores[index2] ? index1 : index2
end

En fait je ne passe pas de chromosome à cette fonction mais le tableau des scores de la population, obtenu avec score et deux indexs.

julia> include("main.jl")

julia> pop = create_population(8, 20)
8-element Array{Array{Int32,1},1}:
 [1,0,1,1,1,1,1,0,1,0,1,1,1,0,1,0,1,1,1,1]
 [1,1,0,0,0,1,0,1,0,1,0,0,0,0,0,1,0,1,1,1]
 [0,0,1,0,1,0,0,1,0,1,0,0,1,1,1,0,0,1,0,1]
 [1,1,0,1,1,1,0,1,1,0,0,1,1,1,0,1,0,1,1,1]
 [0,1,0,0,1,1,1,1,0,1,0,1,1,0,0,1,0,0,0,1]
 [1,1,0,0,0,1,0,0,1,0,1,1,1,0,1,1,1,0,1,0]
 [1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1]
 [0,0,0,1,0,1,0,0,0,1,1,1,0,1,0,1,1,1,1,1]

julia> scores = score(pop)
8-element Array{Int32,1}:
 15
  9
  9
 14
 10
 11
 10
 11

Et la fonction fight renvoit l’index du meilleur des deux chromosomes du combat:

julia> fight(scores, 1, 2)
1

julia> fight(scores, 7, 8)
8

La prochaine fois je pourrais organiser le tournoi proprement dit.

À demain.

Articles connexes

Commentaires