Делать мне нечего, по этому хочу провести лекцию о том, что же такого я намудрил в коде.
Думаю все уже знакомы с моделью формального нейрона?

Итакс, он имеет множество входов и один выход. Видимо для простоты и экономии учёные мужи решили, что коллатерали не нужны, однако был на моей памяти источник информации о том, что по коллатералям спайк не разделяется, не ослабевает, а дублируется, он идентичен спайку проходящему по аксону. Логично предположить, что выходов у нейрона множество, пусть они и не исходят непосредственно из сомы, но куда то же они ведут?
Что есть нейрон и что он делает?
В однослойном перцептроне 5 видов информации:
1 Входной слой
2 Веса связей от входов к нейронам
3 Слой скрытых нейронов
4 Веся связей к выходам
5 Слой выходов
Все уже давно привыкли рассматривать эти элементы отдельно - отдельно веса, отдельно нейроны. Но что будет если их объединить?
Входной и выходной слои трогать не нужно, они являются интерфейсом, а вот веса связей можно вложить в сами нейроны, состояние связей станет свойством каждого нейрона и нейросеть больше станет похожа на картотеку. Связи хранят значения, постепенно подстраиваясь под входы и выходы. В целом связи обученного нейрона будут напоминать несколько полупрозрачных изображений наложенных друг на друга - кадр. Этот самый кадр я использую в программе.
Что делает функция нейрона?
Не зависимо от того пороговая она или сигмоидальная, она суммирует взвешенный связями сигнал в приемлемое значение, о неявном предназначении которого ни кто не говорит - сравнение сигнала со входов с весами связей. Сигнал есть значения входов, связи запомненная картинка, функция сравнивает их и выдаёт результат на выход. Пороговая - 0 или 1, а сигмоида от 0.0 до 1.0
В программе используется пороговая функция memcmp, поскольку сигмоиду реализовать и отладить куда труднее.
Что есть выходы нейрона?
Я думаю наличие коллатералей достаточное основание полагать, что нейрон имеет множество выходов. Как же нейрон понимает, какой выход использовать? Эту проблему решили с помощью метода обратного распространения ошибки, корректирующего деятельность сети. А ведь достаточно просто запомнить состояние выходов аналогично входам.
Но есть нюанс - как же нейрону понять, как изменилось состояние выходов, если на них ни что не воздействует? Ответ прост. Нужно использовать выходы двусторонне - как выход для нейросети и как вход для воздействия внешней среды. Тогда нейросеть будет видеть связь между желаемыми действиями и "положением конечностей".
Почему только классификация?
Перцептрон не имеет связей между нейронами. А для чего они нужны - эти связи катастрофически жрут память, но они же указывают порядок кадров. Представьте, что будет если в перцептроне каждый нейрон связать со всеми нейронами сети однонаправленными связями со своими весами. Каждый нейрон будет распространять взвешенные спайки остальным нейронам, и в этой какофонии сигналов будет один смысл - указать на тот нейрон, который содержит следующий кадр. Да, именно так. Я не помню кто эту гипотезу предложил - нейроны наращивают связи если они оба активны. Напрашивается один правильный вывод - если два нейрона активны и связь создаётся однонаправленная, то означает это, что один нейрон имеет остаточную активность, а второй полную. Конус роста аксона и коллатералей прокладывают путь по "светящимся" нейронам от более тусклых (сопутствующих) к ярким(вероятным), реализуя предсказательную систему в которой вес связи синонимичен вероятности выпадения события после сопутствующего. В коде программы эти связи так же неявно представлены. Я просто подумал - зачем хранить столь огромное количество связей, если кадры в программе не дробятся на части? В отличие от живых или искусственных нейронов в кадрах нет аппроксимирующих ассоциаций.
Как я уже писал - вероятность выпадения одного события после другого тем выше, чем меньше событий между ними. Основываясь на этом предположении я решил использовать порядок кадров, как порядок выпадения событий, тем самым придя к системе "If А then B or C or D or ... Z".
В программе ближайший кадр является наиболее вероятным после выпавшего, по мере удаления выпавшего кадра от следующего вероятность уменьшается. В идеале, программа ищет ближайший подобный кадр, уменьшая точность сравнения. В представленном же кода она ищет точное совпадение (пороговой функцией) и выдаёт результат.
Что за результат такой?
Возвращаемся к системе "If А then B or C or D or ... Z". Я предположил, что наиболее вероятное развитие событий (а если добавить в программу модуляцию, то "желаемое"), это сохранение порядка выпадения этих событий, как со стороны внешней среды, так и со стороны нейронной сети. По этому, чтобы сохранить порядок запомненных событий, программа выдаёт в качестве результата кадр идущий после найденного, как наиболее вероятный исход и как наиболее желанный исход, поскольку в качестве результата из данного кадра используются запомненное состояние выходов.
Программа пытается восстановить состояние выходов из памяти, чтобы восстановить порядок событий.
Кадры запоминаются по переполняющемуся счётчику. Память программы представляет собой кольцо кадров с двумя головками. Первая - запоминает события перезаписывая кадры по порядку. Вторая - ищет кадр который выдаёт в результат.
Сейчас программа делает всё строго - запоминает, сравнивает, действует используя только логические значения. Чтобы сделать её более живой, нужно использовать функции, выдающие не только 0 или 1, а значения в некотором диапазоне.