github.com/yaricom/goNEAT@v0.0.0-20210507221059-e2110b885482/neat/genetics/organism_test.go (about)

     1  package genetics
     2  
     3  import (
     4  	"testing"
     5  	"math/rand"
     6  	"sort"
     7  	"math"
     8  	"bytes"
     9  	"encoding/gob"
    10  )
    11  
    12  // tests organisms sorting
    13  func TestOrganisms(t *testing.T) {
    14  	gnome := buildTestGenome(1)
    15  	count := 100
    16  	orgs := make(Organisms, count)
    17  	var err error
    18  	for i := 0; i < count; i++ {
    19  		orgs[i], err = NewOrganism(rand.Float64(), gnome, 1)
    20  		if err != nil {
    21  			t.Error(err)
    22  			return
    23  		}
    24  	}
    25  
    26  	// sort ascending
    27  	sort.Sort(orgs)
    28  	fit := 0.0
    29  	for _, o := range orgs {
    30  		if o.Fitness < fit {
    31  			t.Error("Wrong ascending sort order")
    32  		}
    33  		fit = o.Fitness
    34  	}
    35  
    36  	// sort descending
    37  	for i := 0; i < count; i++ {
    38  		orgs[i], err = NewOrganism(rand.Float64(), gnome, 1)
    39  		if err != nil {
    40  			t.Error(err)
    41  			return
    42  		}
    43  	}
    44  	sort.Sort(sort.Reverse(orgs))
    45  	fit = math.MaxFloat64
    46  	for _, o := range orgs {
    47  		if o.Fitness > fit {
    48  			t.Error("Wrong ascending sort order")
    49  		}
    50  		fit = o.Fitness
    51  	}
    52  }
    53  
    54  func TestOrganism_MarshalBinary(t *testing.T) {
    55  	gnome := buildTestGenome(1)
    56  	org, err := NewOrganism(rand.Float64(), gnome, 1)
    57  	if err != nil {
    58  		t.Error(err)
    59  		return
    60  	}
    61  
    62  	// Marshal to binary
    63  	var buf bytes.Buffer
    64  	enc := gob.NewEncoder(&buf)
    65  	err = enc.Encode(org)
    66  	if err != nil {
    67  		t.Error(err)
    68  		return
    69  	}
    70  
    71  	// Unmarshal and check if the same
    72  	dec := gob.NewDecoder(&buf)
    73  	dec_org := Organism{}
    74  	err = dec.Decode(&dec_org)
    75  	if err != nil {
    76  		t.Error(err)
    77  		return
    78  	}
    79  
    80  	// check results
    81  	if org.Fitness != dec_org.Fitness {
    82  		t.Error("org.Fitness != dec_org.Fitness")
    83  	}
    84  
    85  	dec_gnome := dec_org.Genotype
    86  	if gnome.Id != dec_gnome.Id {
    87  		t.Error("gnome.Id != dec_gnome.Id")
    88  	}
    89  
    90  
    91  	equals, err := gnome.IsEqual(dec_gnome)
    92  	if !equals {
    93  		t.Error(err)
    94  	}
    95  }