Стань сильним Software Architect, впорядкуй знання та отримай нові навички. Реєстрація на тренінг!
×Закрыть

Прототип ИИ — 1

Кто хочет ради славы и хорошей кармы написать небольшой прототип искусственного интеллекта по следующей схеме?

>>> docs.google.com/...JB0D8yGu2f7NIMHtm1×6MYhRE

Общая схема состоит из:

1) узла «Sensors», принимающего информацию о внешнем мире;

2) набора узлов «Angels», каждый из которых предназначен для анализа информации от «Sensors» и памяти для прогнозирования результатов по исполнению какого-то определенного плана действий;

3) узла «Judge», предназначенного для оценки адекватности каждого из «Angels» путём сравнения их прогнозов с реальностью;

4) набора узлов «Souls», каждый из которых предназначен для анализа информации от «Sensors» и памяти для синтеза оптимального плана действий;

5) узла «Desire», предназначенного для оценки желательности каждого из планов от «Souls»;

6) узла «Will», предназначенного для выбора из всех планов оцененных «Desire» одного оптимального плана, который и будут реализовывать исполнительные устройства, пока не появится другой план;

7) узла «Actuators», передающего информацию на исполнительные устройства;

8, 9) узлы для автоматического генетического программирования «Angels» и «Souls».

В общем, где-то так... Самому мне делать впадло, да и не имеет смысла. Так как по-настоящему программировал я крайний раз лет так 10 назад, а пыхтеть над C++ Qt или Java Swing ради того, чтобы единолично получить все лавры, я думаю, это неправильно. Делиться надо :)

Давайте ваши замечания :D

UPDATE: Мою попытку реализовать схему можно посмотреть вот здесь:

>>> github.com/Eug145/TetrisAI

LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

А-ха-ха-ха! Эти граффы оказались сложнее, чем я думал... Слегонца. Ну, ладно, пока главный акселератор не готов, запускать не буду.
>>> www.youtube.com/...h?v=SwIaHYgCpr0
>>> www.youtube.com/...h?v=eHj3NTFyM88
Party hard? ...Не-а :(

Всё-таки, интересно узнать мнение «плюсовиков», спецов по Qt, по поводу ещё одного обновления:

>>> github.com/Eug145/TetrAI

Как вам дизайн (главный алгоритм вот здесь на 86 строке) ? Правильно ли я использую qint32, std::size_t? А насколько эротичны имена «aimodule_a_intf_ba.h», «aimodule_a_intf_bb.h»?

Мнение reality_hacker тоже очень важно.

2147483647 — есть же константы типа INT_MAX в <climits>.
qint32 я бы стал использовать только, если мы разбираем формат какого-то файла или передаём данные по сети, а так int или long. При компиляции под 64 битовую платформу qint32 станет bottleneck’ом.

double я бы тоже не использовал, если нет сумасшедшей точности и достаточно 5-6 знаков после запятой, то float. Чисто ради производительности.
size_t — это больше для size of an object in memory, а не для хранения просто чисел, хотя это и не принципиально.
strings[1], data[1].results — что такое 1?

А, вот! Только увидел.

По константам я использовал новый <limits>, но, чтобы сделать запись короче, решил использовать литерал, так как тип qint32 определён конкретно, конкретнее уже некуда. Использовать qint32 хочу в файлах, да, чтобы обеспечить совместимость между разными платформами (эдакий задел :) Про 64-битную платформу не подумал. Действительно, как-то по-дбильному вышло... Блин, как лучше исправить? Ну, ладно, подумаю.

Про float понял. Спасибо, подумаю. У меня планы на многопоточность на чем-нибудь вроде Intel Xeon Phi, да... Тип float, это я так понимаю, родное разрешение платформы, что ли?

history_time == 1 означает предыдущий цикл.

strings[1] содержит индекс начального Node, который находится в потоке (отсюда и «strings») для вычисления memory (обновление памяти Daemon на следующий цикл).

Ну может тогда его обэнумить, что-то вроде
enum {
SOMETHING=0,
PREVIOUS_LOOP=1
};

Функция DaemonScheme::calculate_result() использует то обстоятельство, что весь результат Daemon’а можно вычислить вызвав лишь один раз (тут и «жесткость») функцию DaemonScheme::calculate_string(int begin, int end, DaemonSchemeData & history_situation). Таким образом значение этой константы (1 в strings[1]) ограничено самим алгоритмом. Правда, её ещё можно установить и в 0, но для этого и сам алгоритм надо будет менять, по-моему... С индексацией результатов вычислений Daemon’а в предыдущем цикле — похожая ситуация...

Пусть будет немного «магических» констант :)

Тип float, это я так понимаю, родное разрешение платформы, что ли?
Если большой массив данных, то чтение float занимает в два раза меньше времени, чем чтение double :) Если используются SSE/SSE2 оптимизация компилятором, то один регистр содержит либо 4 float, либо 2 double. А для FPU практически пофиг, т.к. оно внутри себя всё равно использует long double.

так вы сам ии-то — пропустили

так, сдекларировали одной фразочкой — а все внимание мелкотехническим деталям топографии
да и то — не деталям даже, так, наметано на высоком уровне

в общем — useless bullshit, как по мне, на гитхаб даже смотреть не буду

Обновил код, но пока результат оставляет желать лучшего. Если у кого есть желание поискать bug’и, то — прошу, пожалуйста!

Таки-да... Работает оно не так, как я предполагал:

>>> github.com/...Eug145/TetrisAI

@ reality_hacker

Нужен шумоподавитель!

Так этот АИ еще и на джаваскрипте? Ну тогда он точно захватит мир.

...тогда он точно захватит мир.
Не-не :) Просто из меня такой «хороший» программист, что мой ИИ не останется без нюансов:

>>> postimg.org/...mage/miclrvm7b
>>> www.youtube.com/...h?v=Djj7jW6ny2M

Заведи собаку. У неё это всё уже внутри, осталось только обучить. За дешевизну придётся заплатить фактом, что Actuators умеет только гавкать и приносить тапочки.

Заведи девушку. Узлы Actuators просто впечатляют. Но Judge отсутствуют как таковые, всё соединено напрямую.

Не взлетит. У ТС слишком много шума в голове.

спасибо за информацию, пазл собирается.

Та особо не за что пока... Оно ж ведь ещё не работает :)

Кстати, если захотите сделать по-настоящему «крутую» версию, вам наверное будет интересно узнать на каком «языке» можно было бы первоначально запрограммировать «Angels» и «Souls» вместо использования псевдослучайных чисел. Вот, есть тут такой парень, звать его Louis Savain:

>>> rebelscience.blogspot.com

Знаете такого? Довольно известная личность :D Как бы там ни было, но я был ошеломлен его проектом COSA:

>>> www.rebelscience.org/Cosas/COSA.htm

А разработана логика узлов, например «Angels» и «Judge»?

Не знаю :D Смотря что вы имеете в виду под «логика разработана» (; Ну, ладно, это был чисто формальный ответ. Если честно, у меня сейчас есть только приблизительные схемы узлов.

В «Angels» для прототипа я бы рекомендовал использовать один из самых, мне кажется, простых способов. Для каждого выходного значения (можно бит, но, мне кажется, лучше — байтовое слово) синтезируем или через псевдослучайные числа (в самом начале работы) или через генетические алгоритмы (в последующие этапы) по одному массиву записей. Каждая запись состоит из набора номеров, которые соответствуют номерам входных значений от «Sensors» и от памяти. У каждого из «Angels» своя пронумерованная область памяти, но общий «Sensors». Нумерация сквозная. Т.е., например, от номера 0 до номера 99 — это общие входные значения от «Sensors»; от номера 100 до 9999 — это уже номера области локальной памяти, которая для каждого из «Angels» своя. Таким образом, для каждого из выходных значений в каждом из «Angels» определяется в канонической форме [1] логическая функция. Выходными значениями в «Angels» являются: флаг готовности предсказывать, флаг наличия кадра предсказания, набор флагов (допустим, 10 штук) классификации ситуации, собственно кадр предсказания (такой же, как и выходные значения «Sensors»), область записи в локальную память. Входными значениями в «Angels» являются: текущий кадр от «Sensors», счетчик кадров в режиме предсказывания, область чтения из всё той же локальной памяти.

«Judge» можно сделать наподобие такого себе компаратора. В случае, если при очередном опросе «Angels», кто-то из них изъявит готовность предсказывать, его образ (локальная память и массив записей, помните?) копируется в другой «тестовый» массив (свой для каждого из «Angels»), и там начинается оценка его адекватности. При поступлении очередного кадра из «Sensors» счетчик кадров увеличивается на 1, и, в случае наличия предыдущего кадра предсказания, оба кадра сравниваются по-битно и соответствующая оценка адекватности по кадру записывается в один из, допустим, 10-ти массивов оценок в зависимости от значений флагов классификации ситуации. При этом область локальной памяти для образа должна оставаться неизменной [2]. Т.о. в процессе работы такого компаратора, мы для каждого из «Angels» будем иметь по 10 (допустим) массивов оценок. Каждый такой массив характеризует способность какого-то из «Angels» предсказывать будущие значения «Sensors» в определенных ситуациях и на определенный отрезок времени.

«SoA» (как и «SoS») предполагается сделать согласно идей профессора John R. Koza...

[1] >>> en.wikipedia.org/...oolean_algebra
[2] Этим и отличается работа каждого из «Angels» в режиме предсказания и в режиме обучения.

Похоже на агентов в ИИ. Погугли на эту тему, наверняка уже инфы куча. Мински этим помоему занимается, уж как лет 20 ....

Я хочу за основу взять идеи профессора John R. Koza по автоматическому т.н. генетическому программированию:

>>> en.wikipedia.org/wiki/John_Koza

Статьи Marvin L. Minsky почитаю, если будет такая возможность.

Подписаться на комментарии