-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathchromosome_ordered.go
72 lines (62 loc) · 1.66 KB
/
chromosome_ordered.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package genetic_algorithm
import (
"bytes"
"fmt"
"strconv"
)
type OrderedGenes []int
func (g OrderedGenes) Len() int { return len(g) }
func (g OrderedGenes) Swap(i, j int) { g[i], g[j] = g[j], g[i] }
func (g OrderedGenes) Get(i int) interface{} { return g[i] }
func (g OrderedGenes) Set(i int, val interface{}) { g[i] = val.(int) }
func (g OrderedGenes) Copy(genes GenesInterface, from1, from2, to2 int) int {
bgenes, ok := genes.(OrderedGenes)
if !ok {
panic("Unexpected genes. Expected OrderedGenes")
}
return copy(g[from1:], bgenes[from2:to2])
}
func (g OrderedGenes) Ind(val int) int {
for i := 0; i < len(g); i++ {
if g[i] == val {
return i
}
}
return -1
}
type OrderedChromosome struct {
*ChromosomeBase
genes OrderedGenes
}
func NewOrderedChromosome(genes OrderedGenes) *OrderedChromosome {
chrom := new(OrderedChromosome)
chrom.ChromosomeBase = NewChromosomeBase()
chrom.genes = genes
return chrom
}
func NewEmptyOrderedChromosome(genesLen int) ChromosomeInterface {
genes := make(OrderedGenes, genesLen)
for i := 0; i < len(genes); i++ {
genes[i] = -1
}
return NewOrderedChromosome(genes)
}
func (chrom *OrderedChromosome) Genes() GenesInterface {
return chrom.genes
}
func (chrom *OrderedChromosome) OrderedGenes() OrderedGenes {
return chrom.genes
}
func (chrom *OrderedChromosome) Ind(val int) int {
return chrom.genes.Ind(val)
}
func (chrom *OrderedChromosome) String() string {
var buffer bytes.Buffer
for i, g := range chrom.genes {
if i != 0 {
buffer.WriteString(" ")
}
buffer.WriteString(strconv.Itoa(g))
}
return fmt.Sprintf("BC genes:[%v], cost: %f", buffer.String(), chrom.costVal)
}