From e493349a1be5f30b98c54989e5b0484d7b7bd872 Mon Sep 17 00:00:00 2001 From: Haibao Tang Date: Thu, 4 Jan 2018 11:10:04 -0800 Subject: [PATCH] [allhic] Implements gago.Genome interface --- allhic/evaluate.go | 39 ++++++++++++++++++++++++++++++++++++++- allhic/optimize.go | 13 +------------ 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/allhic/evaluate.go b/allhic/evaluate.go index 0a0b97e..3586f5c 100644 --- a/allhic/evaluate.go +++ b/allhic/evaluate.go @@ -11,6 +11,7 @@ package allhic import ( "fmt" + "math/rand" "github.com/MaxHalford/gago" ) @@ -96,12 +97,48 @@ func (r Tour) Evaluate() (score float64) { return } +// Mutate a Tour by applying by permutation mutation and/or splice mutation +// TODO: CHANGE TO GENOME_MUTATION (INVERSION + TRANSPOSITION) +func (r Tour) Mutate(rng *rand.Rand) { + if rng.Float64() < 0.35 { + gago.MutPermute(r, 3, rng) + } + if rng.Float64() < 0.45 { + gago.MutSplice(r, rng) + } +} + +// Crossover a Tour with another Tour by using Partially Mixed Crossover (PMX). +func (r Tour) Crossover(q gago.Genome, rng *rand.Rand) { + gago.CrossPMX(r, q.(Tour), rng) +} + +// Clone a Tour. +func (r Tour) Clone() gago.Genome { + var clone Tour + copy(clone.Tigs, r.Tigs) + return clone +} + +// Shuffle randomly shuffles an integer array using Knuth or Fisher-Yates +func (r Tour) Shuffle() { + N := r.Len() + for i := 0; i < N; i++ { + // choose index uniformly in [i, N-1] + j := i + rand.Intn(N-i) + r.Tigs[j], r.Tigs[i] = r.Tigs[i], r.Tigs[j] + } +} + +// MakeTour creates a slice of tigs and shuffles them +// func MakeTour(rng *rand.Rand) gago.Genome { +// var tour Tour +// } // MakeVector returns a random vector by generating 5 values uniformally // distributed between -10 and 10. // func MakeVector(rng *rand.Rand) gago.Genome { // return Vector(gago.InitUnifFloat64(2, -20, 20, rng)) // } - // GASetup set up the Genetic algorithm // func GASetup() { // var ga = gago.Generational(MakeVector) diff --git a/allhic/optimize.go b/allhic/optimize.go index 9f21e4c..dc69e55 100644 --- a/allhic/optimize.go +++ b/allhic/optimize.go @@ -11,7 +11,6 @@ package allhic import ( "fmt" - "math/rand" ) // Optimizer runs the order-and-orientation procedure, given a clmfile @@ -19,16 +18,6 @@ type Optimizer struct { Clmfile string } -// Shuffle randomly shuffles an integer array using Knuth or Fisher-Yates -func Shuffle(tour Tour) { - N := len(tour.Tigs) - for i := 0; i < N; i++ { - // choose index uniformly in [i, N-1] - r := i + rand.Intn(N-i) - tour.Tigs[r], tour.Tigs[i] = tour.Tigs[i], tour.Tigs[r] - } -} - // Run kicks off the Optimizer func (r *Optimizer) Run() { clm := InitCLMFile(r.Clmfile) @@ -44,7 +33,7 @@ func (r *Optimizer) Run() { // } // fmt.Println(test) - Shuffle(tour) + tour.Shuffle() // fmt.Println(tour) tourScore = tour.Evaluate() fmt.Println(tourScore)