|
@@ -57,42 +57,48 @@ func (s *SnakeSimulator) Verify(population *genetic.Population) (results []*gene
|
|
for index, inidividual := range population.Networks {
|
|
for index, inidividual := range population.Networks {
|
|
s.stats.Individual = uint32(index)
|
|
s.stats.Individual = uint32(index)
|
|
s.statsUpdateQueue <- true
|
|
s.statsUpdateQueue <- true
|
|
-
|
|
|
|
- rand.Seed(time.Now().UnixNano())
|
|
|
|
- switch rand.Uint32() % 4 {
|
|
|
|
- case 1:
|
|
|
|
- s.snake = &Snake{
|
|
|
|
- Points: []*Point{
|
|
|
|
- &Point{X: 20, Y: 20},
|
|
|
|
- &Point{X: 21, Y: 20},
|
|
|
|
- &Point{X: 22, Y: 20},
|
|
|
|
- },
|
|
|
|
- }
|
|
|
|
- case 2:
|
|
|
|
- s.snake = &Snake{
|
|
|
|
- Points: []*Point{
|
|
|
|
- &Point{X: 22, Y: 20},
|
|
|
|
- &Point{X: 21, Y: 20},
|
|
|
|
- &Point{X: 20, Y: 20},
|
|
|
|
- },
|
|
|
|
- }
|
|
|
|
- case 3:
|
|
|
|
- s.snake = &Snake{
|
|
|
|
- Points: []*Point{
|
|
|
|
- &Point{X: 20, Y: 20},
|
|
|
|
- &Point{X: 20, Y: 21},
|
|
|
|
- &Point{X: 20, Y: 22},
|
|
|
|
- },
|
|
|
|
- }
|
|
|
|
- default:
|
|
|
|
- s.snake = &Snake{
|
|
|
|
- Points: []*Point{
|
|
|
|
- &Point{X: 20, Y: 22},
|
|
|
|
- &Point{X: 20, Y: 21},
|
|
|
|
- &Point{X: 20, Y: 20},
|
|
|
|
- },
|
|
|
|
- }
|
|
|
|
|
|
+ s.snake = &Snake{
|
|
|
|
+ Points: []*Point{
|
|
|
|
+ &Point{X: 19, Y: 20},
|
|
|
|
+ &Point{X: 20, Y: 20},
|
|
|
|
+ &Point{X: 21, Y: 20},
|
|
|
|
+ },
|
|
}
|
|
}
|
|
|
|
+ // rand.Seed(time.Now().UnixNano())
|
|
|
|
+ // switch rand.Uint32() % 4 {
|
|
|
|
+ // case 1:
|
|
|
|
+ // s.snake = &Snake{
|
|
|
|
+ // Points: []*Point{
|
|
|
|
+ // &Point{X: 20, Y: 20},
|
|
|
|
+ // &Point{X: 21, Y: 20},
|
|
|
|
+ // &Point{X: 22, Y: 20},
|
|
|
|
+ // },
|
|
|
|
+ // }
|
|
|
|
+ // case 2:
|
|
|
|
+ // s.snake = &Snake{
|
|
|
|
+ // Points: []*Point{
|
|
|
|
+ // &Point{X: 22, Y: 20},
|
|
|
|
+ // &Point{X: 21, Y: 20},
|
|
|
|
+ // &Point{X: 20, Y: 20},
|
|
|
|
+ // },
|
|
|
|
+ // }
|
|
|
|
+ // case 3:
|
|
|
|
+ // s.snake = &Snake{
|
|
|
|
+ // Points: []*Point{
|
|
|
|
+ // &Point{X: 20, Y: 20},
|
|
|
|
+ // &Point{X: 20, Y: 21},
|
|
|
|
+ // &Point{X: 20, Y: 22},
|
|
|
|
+ // },
|
|
|
|
+ // }
|
|
|
|
+ // default:
|
|
|
|
+ // s.snake = &Snake{
|
|
|
|
+ // Points: []*Point{
|
|
|
|
+ // &Point{X: 20, Y: 22},
|
|
|
|
+ // &Point{X: 20, Y: 21},
|
|
|
|
+ // &Point{X: 20, Y: 20},
|
|
|
|
+ // },
|
|
|
|
+ // }
|
|
|
|
+ // }
|
|
|
|
|
|
i := 0
|
|
i := 0
|
|
s.stats.Move = 0
|
|
s.stats.Move = 0
|
|
@@ -160,19 +166,20 @@ func (s *SnakeSimulator) Verify(population *genetic.Population) (results []*gene
|
|
}
|
|
}
|
|
|
|
|
|
results[index] = &genetic.IndividalResult{
|
|
results[index] = &genetic.IndividalResult{
|
|
- Result: float64(len(s.snake.Points)-2) * float64(s.stats.Move),
|
|
|
|
- // Result: float64(s.stats.Move),
|
|
|
|
- Index: index,
|
|
|
|
|
|
+ // Result: float64(len(s.snake.Points)-2) * float64(s.stats.Move),
|
|
|
|
+ Result: float64(s.stats.Move),
|
|
|
|
+ Index: index,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
func (s *SnakeSimulator) GetHeadState() []float64 {
|
|
func (s *SnakeSimulator) GetHeadState() []float64 {
|
|
headX := float64(s.snake.Points[0].X)
|
|
headX := float64(s.snake.Points[0].X)
|
|
headY := float64(s.snake.Points[0].Y)
|
|
headY := float64(s.snake.Points[0].Y)
|
|
- tailX := float64(s.snake.Points[len(s.snake.Points)-1].X)
|
|
|
|
- tailY := float64(s.snake.Points[len(s.snake.Points)-1].Y)
|
|
|
|
|
|
+ // tailX := float64(s.snake.Points[len(s.snake.Points)-1].X)
|
|
|
|
+ // tailY := float64(s.snake.Points[len(s.snake.Points)-1].Y)
|
|
// prevX := float64(s.snake.Points[1].X)
|
|
// prevX := float64(s.snake.Points[1].X)
|
|
// prevY := float64(s.snake.Points[1].Y)
|
|
// prevY := float64(s.snake.Points[1].Y)
|
|
foodX := float64(s.field.Food.X)
|
|
foodX := float64(s.field.Food.X)
|
|
@@ -210,10 +217,10 @@ func (s *SnakeSimulator) GetHeadState() []float64 {
|
|
tFood := float64(height)
|
|
tFood := float64(height)
|
|
bFood := float64(height)
|
|
bFood := float64(height)
|
|
|
|
|
|
- tlFood := float64(diag)
|
|
|
|
- trFood := float64(diag)
|
|
|
|
- blFood := float64(diag)
|
|
|
|
- brFood := float64(diag)
|
|
|
|
|
|
+ // tlFood := float64(diag)
|
|
|
|
+ // trFood := float64(diag)
|
|
|
|
+ // blFood := float64(diag)
|
|
|
|
+ // brFood := float64(diag)
|
|
tlWall := float64(0)
|
|
tlWall := float64(0)
|
|
trWall := float64(0)
|
|
trWall := float64(0)
|
|
blWall := float64(0)
|
|
blWall := float64(0)
|
|
@@ -241,21 +248,21 @@ func (s *SnakeSimulator) GetHeadState() []float64 {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if math.Abs(foodY-headY) == math.Abs(foodX-headX) {
|
|
|
|
- if foodX > headX {
|
|
|
|
- if foodY > headY {
|
|
|
|
- trFood = math.Abs(foodX-headX) * math.Sqrt2
|
|
|
|
- } else {
|
|
|
|
- brFood = math.Abs(foodX-headX) * math.Sqrt2
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- if foodY > headY {
|
|
|
|
- tlFood = math.Abs(foodX-headX) * math.Sqrt2
|
|
|
|
- } else {
|
|
|
|
- blFood = math.Abs(foodX-headX) * math.Sqrt2
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ // if math.Abs(foodY-headY) == math.Abs(foodX-headX) {
|
|
|
|
+ // if foodX > headX {
|
|
|
|
+ // if foodY > headY {
|
|
|
|
+ // trFood = math.Abs(foodX-headX) * math.Sqrt2
|
|
|
|
+ // } else {
|
|
|
|
+ // brFood = math.Abs(foodX-headX) * math.Sqrt2
|
|
|
|
+ // }
|
|
|
|
+ // } else {
|
|
|
|
+ // if foodY > headY {
|
|
|
|
+ // tlFood = math.Abs(foodX-headX) * math.Sqrt2
|
|
|
|
+ // } else {
|
|
|
|
+ // blFood = math.Abs(foodX-headX) * math.Sqrt2
|
|
|
|
+ // }
|
|
|
|
+ // }
|
|
|
|
+ // }
|
|
|
|
|
|
if lWall > tWall {
|
|
if lWall > tWall {
|
|
tlWall = float64(tWall) * math.Sqrt2
|
|
tlWall = float64(tWall) * math.Sqrt2
|
|
@@ -305,68 +312,68 @@ func (s *SnakeSimulator) GetHeadState() []float64 {
|
|
brWall = float64(rWall) * math.Sqrt2
|
|
brWall = float64(rWall) * math.Sqrt2
|
|
}
|
|
}
|
|
|
|
|
|
- tTail := (headY - tailY)
|
|
|
|
- if tTail < 0 {
|
|
|
|
- tTail = height
|
|
|
|
- }
|
|
|
|
- bTail := (tailY - headY)
|
|
|
|
- if bTail < 0 {
|
|
|
|
- bTail = height
|
|
|
|
- }
|
|
|
|
- lTail := (headX - tailX)
|
|
|
|
- if lTail < 0 {
|
|
|
|
- tTail = width
|
|
|
|
- }
|
|
|
|
- rTail := (tailX - headX)
|
|
|
|
- if lTail < 0 {
|
|
|
|
- tTail = width
|
|
|
|
- }
|
|
|
|
|
|
+ // tTail := (headY - tailY)
|
|
|
|
+ // if tTail < 0 {
|
|
|
|
+ // tTail = height
|
|
|
|
+ // }
|
|
|
|
+ // bTail := (tailY - headY)
|
|
|
|
+ // if bTail < 0 {
|
|
|
|
+ // bTail = height
|
|
|
|
+ // }
|
|
|
|
+ // lTail := (headX - tailX)
|
|
|
|
+ // if lTail < 0 {
|
|
|
|
+ // tTail = width
|
|
|
|
+ // }
|
|
|
|
+ // rTail := (tailX - headX)
|
|
|
|
+ // if lTail < 0 {
|
|
|
|
+ // tTail = width
|
|
|
|
+ // }
|
|
|
|
|
|
- tlTail := float64(diag)
|
|
|
|
- trTail := float64(diag)
|
|
|
|
- blTail := float64(diag)
|
|
|
|
- brTail := float64(diag)
|
|
|
|
- if math.Abs(headY-tailY) == math.Abs(headX-tailX) {
|
|
|
|
- if tailY > headY {
|
|
|
|
- if tailX > headX {
|
|
|
|
- trTail = math.Abs(tailX-headX) * math.Sqrt2
|
|
|
|
- } else {
|
|
|
|
- tlTail = math.Abs(tailX-headX) * math.Sqrt2
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- if tailX > headX {
|
|
|
|
- brTail = math.Abs(tailX-headX) * math.Sqrt2
|
|
|
|
- } else {
|
|
|
|
- blTail = math.Abs(tailX-headX) * math.Sqrt2
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ // tlTail := float64(diag)
|
|
|
|
+ // trTail := float64(diag)
|
|
|
|
+ // blTail := float64(diag)
|
|
|
|
+ // brTail := float64(diag)
|
|
|
|
+ // if math.Abs(headY-tailY) == math.Abs(headX-tailX) {
|
|
|
|
+ // if tailY > headY {
|
|
|
|
+ // if tailX > headX {
|
|
|
|
+ // trTail = math.Abs(tailX-headX) * math.Sqrt2
|
|
|
|
+ // } else {
|
|
|
|
+ // tlTail = math.Abs(tailX-headX) * math.Sqrt2
|
|
|
|
+ // }
|
|
|
|
+ // } else {
|
|
|
|
+ // if tailX > headX {
|
|
|
|
+ // brTail = math.Abs(tailX-headX) * math.Sqrt2
|
|
|
|
+ // } else {
|
|
|
|
+ // blTail = math.Abs(tailX-headX) * math.Sqrt2
|
|
|
|
+ // }
|
|
|
|
+ // }
|
|
|
|
+ // }
|
|
|
|
|
|
return []float64{
|
|
return []float64{
|
|
lWall / width,
|
|
lWall / width,
|
|
rWall / width,
|
|
rWall / width,
|
|
tWall / height,
|
|
tWall / height,
|
|
bWall / height,
|
|
bWall / height,
|
|
- (1.0 - lFood/width),
|
|
|
|
- (1.0 - rFood/width),
|
|
|
|
- (1.0 - tFood/height),
|
|
|
|
- (1.0 - bFood/height),
|
|
|
|
|
|
+ // (1.0 - lFood/width),
|
|
|
|
+ // (1.0 - rFood/width),
|
|
|
|
+ // (1.0 - tFood/height),
|
|
|
|
+ // (1.0 - bFood/height),
|
|
tlWall / diag,
|
|
tlWall / diag,
|
|
trWall / diag,
|
|
trWall / diag,
|
|
blWall / diag,
|
|
blWall / diag,
|
|
brWall / diag,
|
|
brWall / diag,
|
|
- (1.0 - tlFood/diag),
|
|
|
|
- (1.0 - trFood/diag),
|
|
|
|
- (1.0 - blFood/diag),
|
|
|
|
- (1.0 - brFood/diag),
|
|
|
|
- tTail / height,
|
|
|
|
- bTail / height,
|
|
|
|
- lTail / width,
|
|
|
|
- rTail / width,
|
|
|
|
- tlTail / diag,
|
|
|
|
- trTail / diag,
|
|
|
|
- blTail / diag,
|
|
|
|
- brTail / diag,
|
|
|
|
|
|
+ // (1.0 - tlFood/diag),
|
|
|
|
+ // (1.0 - trFood/diag),
|
|
|
|
+ // (1.0 - blFood/diag),
|
|
|
|
+ // (1.0 - brFood/diag),
|
|
|
|
+ // tTail / height,
|
|
|
|
+ // bTail / height,
|
|
|
|
+ // lTail / width,
|
|
|
|
+ // rTail / width,
|
|
|
|
+ // tlTail / diag,
|
|
|
|
+ // trTail / diag,
|
|
|
|
+ // blTail / diag,
|
|
|
|
+ // brTail / diag,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|