Проблемы с вашей программой:
wghts
ничему не учатся на предыдущей итерации - они случайным образом сбрасываются каждый раз через цикл.
output_1
, output_2
и output_3
рассчитываются из только что повторно инициализированной wghts
, поэтому изменения, сделанные:
if origin[0] != destination[0] and origin[1] != destination[1]:
wghts[0] = wghts[0] + learn
...
wghts[5] = wghts[5] + learn
никогда не отражаются в переменных output_*
.
Вы добавляете координаты X и Y жука и используете его в качестве числа поворотов. Дважды. Я не понимаю, как это имеет какой-то смысл, но я думаю, что это вещь нейронной сети.
Вы слишком поздно проверяете барьер в коде, так что он не синхронизирован с последующим. Ошибка не движется, поэтому сделайте проверку раньше.
Следующая очистка кода не сделает вашу ошибку менее случайной - просто надеюсь, что ваш код будет легче работать с:
from turtle import Screen, Turtle
from random import uniform
# Sets the Turtle main screen color
screen = Screen()
screen.bgcolor("pink")
# X and Y coordinate of Food
destination = (160, 59)
# Settings for food sprite
food = Turtle()
food.color("green")
food.penup()
food.setposition(destination)
food.pendown()
start = (-150, 12)
# Settings for bug sprite
bug = Turtle()
bug.color("red")
bug.penup()
bug.setposition(start)
bug.pendown()
LEARN = 0.1
BIAS = 0
# Main Loop
while True:
# X and Y coordinate of Bug
x, y = bug.position()
# Creates a barrier for turtle
if not -300 <= x <= 300 or not -300 <= y <= 300:
bug.penup()
bug.goto(start)
bug.pendown()
origin = start
else:
origin = (x, y)
# Weights
wghts = [uniform(-1, 1), uniform(-1, 1), uniform(-1, 1), uniform(-1, 1), uniform(-1, 1), uniform(-1, 1)]
# Compares food/destination X and Y with bug/origin X and Y.
# applies update ("LEARN") to all weights
if origin != destination:
wghts[0] += LEARN
wghts[1] += LEARN
wghts[2] += LEARN
wghts[3] += LEARN
wghts[4] += LEARN
wghts[5] += LEARN
# Output Neurons
output_1 = (wghts[0] * origin[0]) + (wghts[1] * origin[1]) + BIAS
output_2 = (wghts[2] * origin[0]) + (wghts[3] * origin[1]) + BIAS
output_3 = (wghts[4] * origin[0]) + (wghts[5] * origin[1]) + BIAS
# Relu Function
if output_1 < 0.1:
output_1 = 0
if output_2 < 0.1:
output_2 = 0
if output_3 < 0.1:
output_3 = 0
# Output values applied to turtle direction controls
bug.forward(output_1)
bug.right(output_2)
bug.left(output_3)