|
@@ -144,7 +144,7 @@ func (s *SnakeSimulator) Verify(population *genetic.Population) (results []*gene
|
|
}
|
|
}
|
|
|
|
|
|
results[index] = &genetic.IndividalResult{
|
|
results[index] = &genetic.IndividalResult{
|
|
- Result: float64(len(s.snake.Points)) * float64(s.stats.Move),
|
|
|
|
|
|
+ Result: float64(len(s.snake.Points)-2) * float64(s.stats.Move),
|
|
Index: index,
|
|
Index: index,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -152,22 +152,46 @@ func (s *SnakeSimulator) Verify(population *genetic.Population) (results []*gene
|
|
}
|
|
}
|
|
|
|
|
|
func (s *SnakeSimulator) GetHeadState() []float64 {
|
|
func (s *SnakeSimulator) GetHeadState() []float64 {
|
|
- headX := int32(s.snake.Points[0].X)
|
|
|
|
- headY := int32(s.snake.Points[0].Y)
|
|
|
|
- foodX := int32(s.field.Food.X)
|
|
|
|
- foodY := int32(s.field.Food.Y)
|
|
|
|
- width := int32(s.field.Width)
|
|
|
|
- height := int32(s.field.Height)
|
|
|
|
|
|
+ headX := float64(s.snake.Points[0].X)
|
|
|
|
+ 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)
|
|
|
|
+ // prevX := float64(s.snake.Points[1].X)
|
|
|
|
+ // prevY := float64(s.snake.Points[1].Y)
|
|
|
|
+ foodX := float64(s.field.Food.X)
|
|
|
|
+ foodY := float64(s.field.Food.Y)
|
|
|
|
+ width := float64(s.field.Width)
|
|
|
|
+ height := float64(s.field.Height)
|
|
diag := float64(width) * math.Sqrt2
|
|
diag := float64(width) * math.Sqrt2
|
|
|
|
|
|
- lWall := headX
|
|
|
|
- rWall := width - headX
|
|
|
|
- tWall := headY
|
|
|
|
- bWall := height - headY
|
|
|
|
- lFood := int32(0)
|
|
|
|
- rFood := int32(0)
|
|
|
|
- tFood := int32(0)
|
|
|
|
- bFood := int32(0)
|
|
|
|
|
|
+ tBack := float64(1.0)
|
|
|
|
+ bBack := float64(1.0)
|
|
|
|
+ lBack := float64(1.0)
|
|
|
|
+ rBack := float64(1.0)
|
|
|
|
+ // if prevX == headX {
|
|
|
|
+ // if prevY > headY {
|
|
|
|
+ // tBack = 0.0
|
|
|
|
+ // } else {
|
|
|
|
+ // bBack = 0.0
|
|
|
|
+ // }
|
|
|
|
+ // }
|
|
|
|
+
|
|
|
|
+ // if prevY == headY {
|
|
|
|
+ // if prevX > headX {
|
|
|
|
+ // rBack = 0.0
|
|
|
|
+ // } else {
|
|
|
|
+ // lBack = 0.0
|
|
|
|
+ // }
|
|
|
|
+ // }
|
|
|
|
+
|
|
|
|
+ lWall := headX * lBack
|
|
|
|
+ rWall := (width - headX) * rBack
|
|
|
|
+ tWall := headY * tBack
|
|
|
|
+ bWall := (height - headY) * bBack
|
|
|
|
+ lFood := float64(0)
|
|
|
|
+ rFood := float64(0)
|
|
|
|
+ tFood := float64(0)
|
|
|
|
+ bFood := float64(0)
|
|
|
|
|
|
tlFood := float64(0)
|
|
tlFood := float64(0)
|
|
trFood := float64(0)
|
|
trFood := float64(0)
|
|
@@ -178,21 +202,11 @@ func (s *SnakeSimulator) GetHeadState() []float64 {
|
|
blWall := float64(0)
|
|
blWall := float64(0)
|
|
brWall := float64(0)
|
|
brWall := float64(0)
|
|
|
|
|
|
- if foodX == headX {
|
|
|
|
- if foodY > headY {
|
|
|
|
- bFood = foodY - headY
|
|
|
|
- } else {
|
|
|
|
- tFood = headY - foodY
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ tFood = (1.0 - (headY-foodY)/height) * tBack
|
|
|
|
+ bFood = (1.0 - (foodY-headY)/height) * bBack
|
|
|
|
|
|
- if foodY == headY {
|
|
|
|
- if foodX > headX {
|
|
|
|
- rFood = foodX - headX
|
|
|
|
- } else {
|
|
|
|
- lFood = headX - foodX
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ rFood = (1.0 - (foodX-headX)/width) * rBack
|
|
|
|
+ lFood = (1.0 - (headX-foodX)/width) * lBack
|
|
|
|
|
|
if lWall > tWall {
|
|
if lWall > tWall {
|
|
tlWall = float64(tWall) * math.Sqrt2
|
|
tlWall = float64(tWall) * math.Sqrt2
|
|
@@ -218,41 +232,32 @@ func (s *SnakeSimulator) GetHeadState() []float64 {
|
|
brWall = float64(rWall) * math.Sqrt2
|
|
brWall = float64(rWall) * math.Sqrt2
|
|
}
|
|
}
|
|
|
|
|
|
- foodDiagXDiff := math.Abs(float64(foodX - headX))
|
|
|
|
- foodDiagYDiff := math.Abs(float64(foodY - headY))
|
|
|
|
- if foodDiagXDiff == foodDiagYDiff {
|
|
|
|
- if math.Signbit(float64(foodX - headX)) {
|
|
|
|
- if math.Signbit(float64(foodY - headY)) {
|
|
|
|
- trFood = foodDiagXDiff * math.Sqrt2
|
|
|
|
- } else {
|
|
|
|
- brFood = foodDiagXDiff * math.Sqrt2
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- if math.Signbit(float64(foodY - headY)) {
|
|
|
|
- tlFood = foodDiagXDiff * math.Sqrt2
|
|
|
|
- } else {
|
|
|
|
- blFood = foodDiagXDiff * math.Sqrt2
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ tTail := (headY - tailY)
|
|
|
|
+ bTail := (tailY - headY)
|
|
|
|
+ lTail := (headX - tailX)
|
|
|
|
+ rTail := (tailX - headX)
|
|
|
|
|
|
return []float64{
|
|
return []float64{
|
|
- float64(lWall) / float64(width),
|
|
|
|
- float64(lFood) / float64(lWall),
|
|
|
|
- float64(rWall) / float64(width),
|
|
|
|
- float64(rFood) / float64(rWall),
|
|
|
|
- float64(tWall) / float64(height),
|
|
|
|
- float64(tFood) / float64(tWall),
|
|
|
|
- float64(bWall) / float64(height),
|
|
|
|
- float64(bFood) / float64(bWall),
|
|
|
|
- float64(tlWall) / diag,
|
|
|
|
- float64(tlFood) / diag,
|
|
|
|
- float64(trFood) / diag,
|
|
|
|
- float64(trWall) / diag,
|
|
|
|
- float64(blFood) / diag,
|
|
|
|
- float64(blWall) / diag,
|
|
|
|
- float64(brFood) / diag,
|
|
|
|
- float64(brWall) / diag,
|
|
|
|
|
|
+ lWall / width,
|
|
|
|
+ lFood,
|
|
|
|
+ rWall / width,
|
|
|
|
+ rFood,
|
|
|
|
+ tWall / height,
|
|
|
|
+ tFood,
|
|
|
|
+ bWall / height,
|
|
|
|
+ bFood,
|
|
|
|
+ tlWall / diag,
|
|
|
|
+ tlFood,
|
|
|
|
+ trWall / diag,
|
|
|
|
+ trFood,
|
|
|
|
+ blWall / diag,
|
|
|
|
+ blFood,
|
|
|
|
+ brWall / diag,
|
|
|
|
+ brFood,
|
|
|
|
+ tTail / height,
|
|
|
|
+ bTail / height,
|
|
|
|
+ lTail / width,
|
|
|
|
+ rTail / width,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|