• Добро пожаловать на Черная дыра.
 

перспективы ИИ и робототехники в космосе.

Автор LRV_75, 08.04.2010 12:44:05

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

LRV_75

Цитировать
Цитировать"Черепицею шурша, крыша едет не спеша" (с)
Это вы о чем? О вольностях с Пушкиным
Кстати, о вольностях с Пушкиным Вы как то скупо. Вы явно что то скрываете  :wink:
Кстати, я не считаю это оффтопом. Это очень даже в контексте. Это, ИМХО пример ЕИ куда нужно стремиться ИИ.
Вoт ToГD/\ buDeT Do K()Sm()n/\FFтIКI   :wink:
Главное не наличие проблем, главное способность их решать.
У каждой ошибки есть Имя и Фамилия

Антип Од

Прошу менья извинит, что йа вмешиваюс, но предмет вашей ученой беседы настолько интерьесен...

Уважаемый Alex_Semenov рассказал все шикарно. Спасибо, читал с удовольствием. И все же у меня есть, что дополнить.

Года три назад я случайно обнаружил, что ИИ вовсе не так далек от реальности, как мне до этого казалось. Выяснилось, что его применение попросту выгоднее чем решение задачи в лоб проверенными методами. Дело уже движется без всяких грантов.  Эволюционирующие автоматы окружают нас потихоньку обходя с флангов. С помощью отмороженных айтишников, желающих почарджить заказчика и побыстрее.

Однажды заказали нашей бригаде (не без моей подачи) сговнякать кригинг для одного прожекта. Кто не знает, это любопытный метод прогнозирования поведения чего угодно в любой точке сколькиугодномерного пространстве при наличии данных о поведении сабжа (или ему подобных) где-либо в других точках.
Про него утверждается, что он, в некотором роде, наилучший, хотя это и не бесспорно.

Изобретен же он был для золотоискателей которые желали искать золото не где попало, а по системе. И от того там применяются геологические термины.

Наша область от геологии была далекой и юзвери от терминов приходили в ступор. Ступор усугублялся необходимостью представить себе четырехмерную сферу.
При попытке разъяснить предмет ступор переходил в кому или в потасовку, в зависимости от служебного положения собеседника.

В итоге заказчег высказался насчет того, что не могли бы вы убрать всякие вот эти настройки и графики куда-нибудь подальше в меню сеттингс. А вот здесь оставить только крыжик "Авто". Чтобы особо умные могли продолжать в том же духе, а НОРМАЛЬНЫЕ могли бы РАБОТАТЬ. И позвольте напомнить, что мы вам заказывали ОТЧЕТЫ и ПРОГНОЗЫ, а не вариограммы. Далее про себя, но отчетливо: ... а свои вариограммы можете засунуть себе в зад, если вы такие умные. Но у меня в офисе - чтобы больше никаких вариограмм и самородков.

Н-да, зашибись задачка...

 The actual process of fitting a model to an empirical
 semivariogram is much more of an art than a science, with
 different authorities suggesting different methods and protocols."
 
 Geoff Bohling, INTRODUCTION TO GEOSTATISTICS
 And VARIOGRAM ANALYSIS, 2005.

Короче, было ясно, как делать. Без всякого ИИ, но объем впечатлял. Слишком много вариантов решений надо было реализовать.
Делать это кодом было страшно. Какую красивую модель не придумай, кода все равно дофига, а чем больше кода - тем больше багов. К тому же, исходные данные зачастую очень плохие, решения не устойчивые.
Очень хотелось алгоритма, который бы решал не конкретную задачу, а любую, ну ладно, любую из некоторого широкого класса...

Ну-и сели составлять счет и уже в конце решили попробовать генетический алгоритм (но счет переделывать не стали).
И вот, прочтя по диагонали теорию в википедии за пару дней состряпали сей ИИ.

Точнее мягкий ИИ. Я согласен. Вообще не ИИ, но так называется.

Результат превзошел все ожидания. После совсем недолгих танцев с саблями вокруг первенца с перерывами на перечитывание теории он ожил и заработал.

Это было очаровательно. Три экрана кода... и возникало ощущение: как, уже все? ведь собирались же делать три месяца?!
Ощущение акта творения. Разум жил отдельно от задачи. Сам по себе. Надо было только формализовать задачу на понятном ему языке.
Но ее не надо было решать! Он решал любую. С любым количеством неизвестных. Неустойчивую - тоже. Хотя и брал решение немного с потолка, но это было не самое плохое решение!
Если исходные данные паршивые, то и прогноз тоже может быть не фонтан. И заказчику тоже это ясно.
А формализовать... Да это 5-10 строчек кода.
Типа, а апроксимуруй-ка мне вот эти данные полиномом степени не выше трех с погрешностью не хуже 5%, да попроще! И что угодно в том же духе.
В этом отношении ему было проще объяснить задачу чем человеку.

Чуть позже ИИ было велено эволюционировать. Вот тебе данные за 10 лет, наплоди клонов и к утру выведи таких, чтобы пошустрее да поточнее!
Глазом не моргнул. Эти клоны быстро решали уже не любые задачи, а только "свои", на прочих могли и тормозить. Класс эффективно решаемых задач
сузился, но производительность возросла на порядки. Ну и что? Для других задач можно наплодить других клонов. Не написав ни одной строчки кода.
ИИ жрет только электричество... Правда, когда эволюционирует, то жрет все 600 ватт и видно, что и киловатта будет маловато.

Я не теоретик. Я инженер. Но с тех пор все, что касается ИИ, читаю. И когда попадается новая задача думаю, не впихнуть ли туда ИИ. Не из-за понтов. А от лени. В проектах ИИ уже там и сям... Но заказчики не в курсе. Да им и не надо. Искусственный разум тянет щупальца в заднюю дверь.

Вот несколько выводов.

- Может ли ИИ самосовершенствоваться? Да, легко. Не может, а должен. В свободное от работы время. Если электричества не жалко.

- Нужен ли самомодифицирующийся код для ИИ? А ля ИИ, который сам пишет программки и сам компиллирует. Нет, не нужен. ИИ эволюционирует структурно. Как многоклеточный организм. Удаляя ненужные объекты и создавая необходимые ему объекты и связи. Если хотите, это тоже самое.
При этом он меняет свой код, но оперирует не на уровне текста, а уровнем выше. Замечу, что ныне откомпиллировать и запустить кусок кода прямо в рантайме больше не проблема. Просто это не надо.

- Может ли ИИ заменить в космосе человека? Очень часто - да. ИИ заменяет бюрократа, солдата и офисный планктон - без проблем. Не одним же прогрессорам трудиться в космосе. Я говорю об известных мне моделях ИИ.

- Нужны ли ИИ петафлопы? Похоже, нет. Петафлопы берутся вот откуда. Некий гражданин смоделировал "мозг" из трех нейронов. Не факт, что рабочий. И обнаружил, что мозгу надо 1000 операций, чтобы обработать 1 бит информации. Гражданин объявил, что мозгу из N нейронов надобно 1000 * N^N  * M операций, чтобы обработать M бит. Отсюда вывод. Надо больше петафлопов.

- Как пройти тест Тьюринга? Я знаю как. Просто. Надо смоделировать негодяя. Доктора Лектера. Чтобы нащупал болевые точки и начал по ним бить. Захватил инициативу и стал контролировать ситуацию. Пресекать попытки уйти от темы. Задавать вопросы, а не отвечать.
Ответы использовать, чтобы приказывать. Приказывать, а не выполнять. И тогда никто не скажет, что он недоумок.
Идея, кстати, не моя. Почти так работала Элиза.

Картина неутешительная... Нет, я не знаю, как сделать толкового инженера. Я даже не знаю, как сделать просто приятного собеседника. Я... имею в виду в компьютере сделать....

И никаких идей. Вот.
Служил Гаврила космонавтом
Гаврила космос покорял.

gans3

Мы послушали пересказ Лемовского рассказика "Формула Лимфатера" в исполнении шестнадцатого компилятора.  8)
А еще некоторые прорвали когнитивный барьер. В прошлом году.
Другие же летают в космос прямо с этого форума. Без разбега :wink:
Человеку лететь в дальний космос с исследовательскими целями так же "разумно", как залезть в ядерный реактор для изучения ядерных реакций. (c)

sychbird

Для задачи моделирования ИИ неплохо бы до анализа проблем, так или иначе концентрирующихся вокруг машины Тьюринга и теории распараллеливания алгоритмов, для начала озаботиться некой определенностью по следующим проблемам:

какого масштаба интеллект  мы собираемся моделировать? Масштаба Эйнштейна или масштаба Васи Пупкина, мотающего шестой срок на зоне? :D
И заодно попытаться поискать, у Васи Пупкина пример осознанного выбора альтернативы по результату рациональной оценки ситуации. И не забыть бы, что полицейские, бравшие Васю последний раз в Америке, за попытку ограбления банка, который он уже два раза грабил до этого, так и не успели заглянуть в описание Васиного modus vivendy. После последней Васиной попытки в банке чуток раскошелились на охранную систему. :D

И что самое интригующее, что разница в числе нейронов в мозге Эйнштейна и Васи отличается не на порядки. :P

А еще злые языки из числа психологов некоторых школ установили, что среднее число психотипов колеблется где то в районе пятидесяти.
И прогнозирование поведения индивидов в соответствии с их психотипом не требует учета реализации актов их свободы воли на основе рациональной оценки ими ситуации. И дает весьма статистически достоверные предсказания. :roll:
А наши доблестные практики-психологи из НКВД доказали, что и самого Альберта Эйнштейна они на этой козе успешно объехали. (см историю взаимоотношений А.Э. с женой русского художника, подзабыл фамилию.)

А вообще то, я считаю, что   реальные образцы ИИ уже действуют тут и там, и вполне готовы к полезной деятельности в космосе. :)
А все разговоры о вычислительной мощности, потребной для моделирования ИИ, без учета отмеченных мной "нехороших проблем" - от лукавого.  :D
Ответил со свойственной ему свирепостью (хотя и не преступая ни на дюйм границ учтивости). (C)  :)

Alex_Semenov

Антип Од, классная история!
Спасибо!
Очень интересно.
И эта ваша история  помимо прочего напомнила мне вот такие строчки из очень давно прочитанной диетической (популярной) книги Растригина "Этот случайный, случайный, случайный мир":

стр 200-2001

******
Надо сказать, что и до сих пор можно встретить людей, которые не могут свыкнуться с мыслью, что в определенных тяжелых случаях быстрее и надежней действовать случайным образом. Однажды мой хороший приятель после бурного обсуждения случайного поиска на очередной научной конференции умолял меня признаться, что все это чушь.
- Я все хорошо понимаю,  - говорил он, беде это нужно для самоутверждения. Но скажи откровенно: случайный или неслучайный поиск – разве это так важно?  А может быть, все-таки градиентный метод лучше?
Признайся!
Я не признался.
А солидный и заслуженный теоретик авторитетно убеждал меня:
- Молодой человек, ну что вы занимаетесь случайным поиском? Я раньше тоже занимался им и доказал, что случайное поведение всегда равномерно хуже регулярного, а случайный поиск хуже регулярного поиска. Бросьте его!
Я не бросил.
В другой раз мне пришлось услышать, как один из рьяных противников случайного поиска жаловался:
- Я занимаюсь созданием сложнейших электротехнических устройств, и мне очень много приходится искать, моделируя поведение объекта на быстродействующей вычислительной машине. Так вот программисты определяют оптимальные варианты случайным поиском! Мне в конце концов безразлично, каким методом будет найден оптимальный вариант машины. Но ведь это же нелогично! Сколько я их не убеждал, что случайный поиск это нонсенс, не могут понять! Если программист хоть один раз считал методом случайного поиска, его уже за уши не оттянешь. И что они в этом находят?
До сих пор страсти вокруг случайного поиска не утихли. Дело в том, что детерминизм нашего мышления отчаянно протестует против признания оптимальности случайного поведения...

*****

Растригин Л.А. Этот случайный, случайный, случайный мир. 2-е издание.
(М.: Молодая гвардия, 1974. - Эврика) стр 200-201



Можно скачать по ссылке:

http://publ.lib.ru/ARCHIVES/E/''Evrika''/Rastrigin_L.A._Etot_sluchaynyy,_sluchaynyy_mir.(1974).[djv].zip

Вообще обратите внимание на эту свалку, кому интересно:

http://publ.lib.ru/ARCHIVES/E/''Evrika''/_''Evrika''.html

Антип Од,  обратите внимание на год издания цитируемой книги.
То есть ваша история не такая уж и новая.
До вас были люди, который приходили в восторг от применения случайных методов
:)
Но.
Есть но.
Да, я не совсем все понял но по всей видимости у вас была классическая задача оптимизации. Поиска глобального экстремума некой N-мерной функции. Это действительно задача, для которой прекрасно затачиваются генетические алгоритмы.
Но ЗДЕСЬ надо понимать, что в данном случае случайность не используется как средство решения задачи, которая не решается детерминированным способом. Вы это сами прекрасно понимаете. Просто таким способом задача решается легче.
То есть действительно речь идет о типично мягком ИИ поиск решения задач, которые плохо формализуются но наверняка формализуются!

Мои же глубокие и путанные умствования (скажем в приводившейся здесь Пьесе) сводятся к тому, что случайность обладает ЕЩЕ и некой волшебной способностью решать не решаемые детерминированным способом задачи. При этом я утверждаю что эта способность и есть "божий дар" в чистом виде – то что мы называем способностью к творчеству.

Alex_Semenov

Кстати для любителей нырять в этот омут настоятельно рекомендую:

http://www.koob.ru/lefevr_v_a/konfliktuyushie_strukturi



Конфликтующие структуры, Лефевр В.А.[/size]

В книге рассматривается достаточно интересный подход к исследованию систем, «наделенных разумом».

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

Alex_Semenov

ЦитироватьСознаюсь.. Это я просто поленился сразу проверить ссылку - сейчас находится что была доказана универсальность простейшей машины Тьюринга
The Prize Is Won; The Simplest Universal Turing Machine Is Proved
http://blog.wolfram.com/?year=2007&monthnum=10&name=the-prize-is-won-the-simplest-universal-turing-machine-is-proved

Это несколько иная область. Здесь речь идет о клеточных автоматах.
Давно доказано что среди разынх клеточных автоматов есть автоматы, способные к универсальным вычислениям.
Автора интересовал вопрос клеточный автомат МИНИМАЛЬНОЙ конфигурации. Простейший универсальный вычислитель. Так как уже найдено доказательство что автомат размерностью 2.2 не может быть универсальным, то нахождение автомата конфигурацией 3.2 означает нахождение минимального универсального клеточного автомата.



Все это очень в стороне от того что мы обсуждаем. Хотя очень красиво само по себе. В философском плане цель автора вообще как по мне не очень нравится. Я как то привык считать что континуальная реальность в принципе не сводится к вычислимости. Она много мощнее... Это дискретный мир может существовать в реальности но реальност всецело в дискретность не помещается...
Хотя кто знает...

zyxman

ЦитироватьЭто дискретный мир может существовать в реальности но реальност всецело в дискретность не помещается...
А как-же квантованность?
- Насколько я понял, практически все достаточно глубоко исследованные взаимодействия квантованы (собственно, пока достаточно глубоко исследованы только электромагнитные взаимодействия, да еще последнее время активно исследуют спиновые).
"Демократия, это когда царь умный, а также добрый и честный по отношению к своим холопам".
--
Удача - подготовленный успех!

ТАУ

Почему-то человеки зациклились на создание именно Искусственного Интеллекта (ИИнт), на меньшее они не согласны. (В компьютерных играх напишут кучу скриптов и называют гордо – ИИ :)). Правда, «неуспехи» в создании полноценного ИИнт, заставляют переходить к созданию ущербного, «мягкого» ИИнт. А может и не надо (по крайней мере, пока) так уж упираться, пытаясь создать Искусственный Интеллект уровня Васи Пупкина, тем более Эйнштейна? Может стоит сначала решить более простую задачу – создать Искусственный Инстинкт (ИИнс)?
Идея не моя, её Станислав Лем высказал в одной из своих работ.
Например, пчёлы прекрасно справляются с задачами распознавания, навигации, поиска (ресурсов, места для жилья), сбора и передачи информации, коммуникации, взаимодействия с себе подобными, могут переключаться с одного вида деятельности на другой – сбор нектара и пыльцы, выработка воска, строительство сот, санитарная обработка и уборка улья, проветривание его, выращивание потомства, защита и т.д и т.п. И всё это многообразие поведения и выполняемых функций реализовано в «каких-то» ~800 000 нейронах. Да, их поведение «жёстко» запрограммировано, ну и что? Если врождённого инстинкта достаточно для такого сложнейшего поведения, поведения полностью адекватного для среды (окружающего мира), в котором они существуют, то ведь большего и не требуется.

Надо разработать ИИнс для задач решаемых в космосе, вот и всё. Представьте себе массу всяких разных «космо-аппаратов» (никоим образом не андроидов, внешний вид определяется функциональностью), с ИИнс по «мощности» равный инстинктам насекомых, «ИИнс-аппаратов» дифференцированных по применению, возможно образующих некую функционально организованную иерархию (типа социальной организации пчёл в рое), способных перепрограммироваться в зависимости от вида решаемых задач (в пределах «зашитых» блоков поведенческих алгоритмов). Такие «ИИнс-аппараты» смогут многое, и без «мягкого-жесткого» индивидуального ИИнт. Надо опустить «планку» и не пытаться создать разумных «ИИнт-роботов», интеллект которых стремился бы к интеллекту Человека. Это совсем не требуется для решения большинства задач, по крайней мере, сильно избыточно для их решения.

ИИнс будет создать явно проще, чем ИИнт (хотя совсем не просто, в любом случае человекам сильно напрячь интеллект придётся).
Это будет гораздо дешевле.
Время создания нового «ИИнс-аппарата» будет гораздо меньше, чем «ИИнт-робота», т.к. не будет периода долгого обучения – ИИнс уже на момент создания будет полностью сформирован («прошит», молодая пчела сразу включается в работу), в отличие от «ИИнт-робота», для набора «мощности интеллекта» которому требуется большой период обучения (по аналогии с Человеком).
Износившийся «ИИнс-аппарат» не обязательно ремонтировать, можно будет просто заменить на новый (отработавшая пчела изгоняется из улья и погибает).
Гибель «ИИнс-аппарата» не будет трагедией, в отличие от гибели «ИИнт-робота», поскольку последний наделён сознанием по определению – интеллект у него, разум, пусть и искусственный, а значит и право на жизнь.
Гибель «ИИнс-аппарата» из-за несовершенства «зашитых» алгоритмов будет служить отправной точкой для создания аппаратов с более совершенным ИИнс.
Космос для таких «ИИнс-аппаратов» будет средой обитания, под которую они и будут «затачиваться» и совершенствоваться. А «ИИнт-роботы» – потом, это будет следующим этапом освоения Космоса (не исключающим дальнейшее применение «ИИнс-аппаратов»).
"Миллиардов звёзд над нами Млечность..." (с)

Антип Од

Спасибо за ссылочки, Алекс!
Читаю с наслаждением.

Вот на обмен: http://bestforum.ru/bestblog/2007/08/16/teorija_igr_i_jekonomicheskoe_povedenie._nejjman_fon_dzh._morgenshtern_o..html

Одна из самых любимых книжек. Понятно, что ИИ должен действовать неким "оптимальным" образом. Эта книжечка как раз о том, что есть этот самый "оптимальный" образ. Оказывается, очень часто это совсем не то, что представляется оптимальным интеллекту естественному.

Первое издание на русском языке называлось, кажется, просто "Теория игр". Ибо экономическое поведение человека в те времена не приветствовалось...
 
Есть один подход к моделированию чего угондно, на удивление тупой... Пусть поведение некой системы есть функция F(x1, x2...,xN, y1, y2,...,yM) где xi - внутренние параметры системы, yi - параметры окружающей среды. В общем случае N и M равны бесконечности, функция задана в бесконечномерном пространстве. Старина Фредгольм 100 лет назад предположил что эта функция есть сверточка и записал интегральное уравнение которое описывает "все что угодно". Вообще то он лишь искал способ решать дифуры, но неожиданно для всех открыл общую теорию всего. Оказалось, что во-первых, уравнение Фредгольма можно записать для любой системы... Потом оказалось, что уравнение эквивалентно системе линейных уравнений с бесконечным количеством неизвестных (ну-и уравнений тоже). Дело за малым... Понаблюдаем за функцией F и средой. Каждое наблюдение даст по меньшей мере одно уравнение. Остается лишь наблюдать подольше, чтобы число уравнений превысило число неизвестных. Надо только позаботиться чтобы как нибудь сократить количество неизвестных до конечного. Скажем, исходя из здравого смысла. Иначе придется долго наблюдать.  Неплохо будет и подсократить размерность пространства решения. Вот и все. В итоге имеем матрицу. Осталось только ее обратить. И внутренние параметры системы будут найдены. Остается только умножить обратную (ладно, псевдообратную) матрицу на вектор параметров среды и получить искомую F. В любой точке пространства и времени. И неважно, что описывает функция F. Поведение камешка, звезды, человека, вселенной. В прошлом, настоящем, будущем. Метод общий.  

Между делом заметим: задача обращения матрицы идеально распараллеливается...

The Matrix is a system, Neo. That system is our enemy.

Есть только одна засада.  Матрица может оказаться сингулярной. Это значит только одно: поведение системы не связано со средой. Например система - это Бог. Или женщина. Вещь в себе. В противном случае метод рабочий, - доказано!

Вопрос только в том, А с какого перепуга поведение системы не связано со средой???? Кто-то отменил причинность что-ли??? Выходит, что так...

Ну-или внутри у нее неонка. Точнее, генератор случайных чисел на неонке...
Служил Гаврила космонавтом
Гаврила космос покорял.

Kosmogen

ЦитироватьОчень хотелось алгоритма, который бы решал не конкретную задачу, а любую, ну ладно, любую из некоторого широкого класса...
Ну-и сели составлять счет и уже в конце решили попробовать генетический алгоритм (но счет переделывать не стали).
И вот, прочтя по диагонали теорию в википедии за пару дней состряпали сей ИИ.
Точнее мягкий ИИ. Я согласен. Вообще не ИИ, но так называется.
...
Вообще то метод Кригинга - чисто интерполяционная процедура пространственной статистики, обеспечивающая минимум ошибки в точках с уже измеренными значениями. Но хорош только для определенных структур данных. Гораздо более универсальным является метод NNI (Natural Neighbour Interpolation) - естественных соседей по диаграмме Вороного.  Есть и другие методы. Так что человек - эксперт пока не в состоянии определить какой метод выбрать для обработки первичных данных, а что говорить про ИИ?  Действуют по опыту и методом тыка, а было бы неплохо задействовать ИИ. Вы затронули тему автоматической обработки регистрируемых роботами пространственных данных. На чем писался софт?  Для распараллеливания алгоритмов сейчас есть CUDA и OpenCL, предлагаемые nVidia  для графических плат, расчетов на GPU серии GeForce (см. демонстрации от сообщества CUDA http://www.nvidia.ru/object/cuda_apps_flash_new_ru.html).  На этой основе в связке "аппаратная часть-сигналы от внешней среды-реакция" может быть создан вполне эволюционирующий ИИ.
Сигналы есть, но Их пока нет (SETI)

Антип Од

ЦитироватьВообще то метод Кригинга - чисто интерполяционная процедура пространственной статистики, обеспечивающая минимум ошибки в точках с уже измеренными значениями. Но хорош только для определенных структур данных.

Многие так думают. Просто потому, что действительно, кригинг часто применяется для интерполяции. Это не так. На самом деле, это метод моделирования произвольного процесса. Интерполяция лишь одно из его приложений. Например, кригинг позволяет предсказать, где нужно выполнить еще одно измерение, чтобы максимально повысить точность предсказания. Это немаловажно, если измерение требует сверления дырки глубиной 1 км. Или, например, надо заразить СПИДом 10 обезьян и ждать 10 лет пока они издохнут.
Служил Гаврила космонавтом
Гаврила космос покорял.

Антип Од

ЦитироватьНа чем писался софт?  Для распараллеливания алгоритмов сейчас есть CUDA и OpenCL, предлагаемые nVidia  для графических плат, расчетов на GPU серии GeForce (см. демонстрации от сообщества CUDA

Софт изначально писался С++, а ныне пишется на С#. Последнее в разы дешевле. CUDA имелась в виду на случай, если ИИ будет работать медленно. Нифига. Не понадобилась. ИИ работает быстро на обычном десктопе. Да, может быть, в тысячу раз медленнее, чем детерминированый алгоритм. Но все равно, достаточно быстро, чтобы пользователь не заметил задержки.
Служил Гаврила космонавтом
Гаврила космос покорял.

LRV_75

ЦитироватьСофт изначально писался С++, а ныне пишется на С#. Последнее в разы дешевле. CUDA имелась в виду на случай, если ИИ будет работать медленно. Нифига. Не понадобилась. ИИ работает быстро на обычном десктопе. Да, может быть, в тысячу раз медленнее, чем детерминированый алгоритм. Но все равно, достаточно быстро, чтобы пользователь не заметил задержки.
Значит говорите код на 3-х экранах .... а может дадите посмотреть эти 3 экрана?  :D  (желательно на шарпе)

(интересно он на... с капслоком пошлёт или без оного  :D )
Главное не наличие проблем, главное способность их решать.
У каждой ошибки есть Имя и Фамилия

Антип Од

ЦитироватьЗначит говорите код на 3-х экранах .... а может дадите посмотреть эти 3 экрана?  :D  (желательно на шарпе)

(интересно он на... с капслоком пошлёт или без оного  :D )

Легко!
Вот простенький интеллект. Немного тормозной но, например, аппроксимирует любыми функцЫями множество точек в легкую.

public class Evolver {        

        private static ArrayList Guys;

        public int Population = 1000;
        private int _GenerationNo;
        public int GenerationNo { get { return _GenerationNo; } }
        // Evolution parameters
        private double _Survivability = 0.4; // 40% will survive the next generation
        private double _BestQuota = 0.05; // 5% best will be guaranteed protected
        private double _DeathRate = 0.3; // 30% will die, 25% free space for newborn
        public double Survivability { get { return _Survivability; } set { _Survivability = value; } }
        public double BestQuota { get { return _BestQuota; } set { _BestQuota = value; } }
        public double DeathRate { get { return _DeathRate; } set { _DeathRate = value; } }
        public double BreadingRate { get { return 1.0 - _DeathRate - _BestQuota - _Survivability; } }
        public int SurvivorsCount { get { return (int)(_Survivability * Population); } }
        public int BestCount { get { return (int)(_BestQuota * Population); } }
        public int DeadCount { get { return (int)(_DeathRate * Population);}}
        public int NewbornCount { get { return Population - SurvivorsCount - BestCount - DeadCount; } }
        public int LossLimit = 100;
        // Mutation parameters
        public double MutationLevel = 0.01;
        public double MutationMagnitude = 0.05;
        public int MutationCount { get { return (int)(MutationLevel * Population); } }
        // Current Solution
        private IGenom BestGuy;
        public object Solution { get { return Populator.GetSolution(BestGuy); } }
        public double Fitness { get { return BestGuy.Fitness; } }
        //
        private double AvgFitness;
        private double Divergence;
        private IPopulator Populator;        
        //
        private int LossCount = 0;
        private static Random RND;
        private static Random IntRND;

        public IGenom Evolve(IPopulator APopulator){ //Pt[] AData, Polynom ATemplate) {
            ///////            
            //////////////
            _GenerationNo = 0;
            Populator = APopulator;
            LossCount = 0;
            // 1. Populate
            RND = new Random(); IntRND = new Random();
            //Data = AData;
            Populate(Populator);

            while (LossCount < LossLimit) {
                // 1. Calculate fitness
                double fsum = 0;
                foreach (IGenom guy in Guys) {
                    fsum += guy.Fitness;
                }
                AvgFitness = fsum / Guys.Count;
                double dsum = 0;
                foreach (IGenom guy in Guys) {
                    double df = guy.Fitness - AvgFitness;
                    dsum += df * df;
                }
                Divergence = Math.Sqrt(dsum / Guys.Count);

                ArrayList happy = new ArrayList();
                int happylimit = SurvivorsCount;
                // Greencard lottery

                for (int idx = IntRND.Next(Guys.Count); happy.Count 0.5) {
                        happy.Add(Guys[idx]); Guys.RemoveAt(idx);
                        if (happy.Count >= happylimit) break;
                    }
                }                

                // next train just for best ones
                ArrayList best = new ArrayList();
                foreach (IGenom guy in Guys) best.Add(guy);
                best.Sort(new GuyComparer());

                IGenom best_guy = best[0] as IGenom;

                if (BestGuy == null || best_guy.Fitness < BestGuy.Fitness) {
                    BestGuy = best_guy.Clone();
                    LossCount = 0;
                }
                else LossCount++;

                double bestFit = (best[0] as IGenom).Fitness;
                double avgFit = AvgFitness;

                int bestgrant = BestCount;

                for (int ct = 0; ct toLive) {
                    int idx1 = IntRND.Next(best.Count);
                    int idx2;
                    for (idx2 = IntRND.Next(best.Count); idx2 == idx1; idx2 = IntRND.Next(best.Count)) ;
                    IGenom g1 = best[idx1] as IGenom;
                    IGenom g2 = best[idx2] as IGenom;
                    if (g1.Fitness > g2.Fitness) best.Remove(g1);
                    else best.Remove(g2);
                }

                happy.AddRange(best);

                // OK, start breeding

                while (happy.Count < Population) {
                    int idx1 = IntRND.Next(happy.Count);
                    int idx2;
                    for (idx2 = IntRND.Next(happy.Count); idx2 == idx1; idx2 = IntRND.Next(happy.Count)) ;
                    IGenom g1 = happy[idx1] as IGenom;
                    IGenom g2 = happy[idx2] as IGenom;
                    IGenom baby = Sex(g1 as IGenom, g2 as IGenom);
                    happy.Add(baby);
                }
               
                // Applay mutations
                int muQuote = (int)(MutationLevel * Population);
                for (int ct = 0; ct < muQuote; ct++) {
                    IGenom g = happy[IntRND.Next(happy.Count)] as IGenom;
                    int geneIdx = IntRND.Next(g.Count);
                    Gene mutant = Mutate(g.GetGene(geneIdx), MutationMagnitude);                    
                    g.SetGene(geneIdx, mutant);
                }

                Guys.Clear(); foreach (IGenom g in happy) Guys.Add(g);

                _GenerationNo++;
            }
            return BestGuy as IGenom;
        }

        private void Populate(IPopulator APopulator){
            Guys = new ArrayList();
            for (int ct = 0; ct < Population; ct++) {
                IGenom guy = APopulator.Create();
                for (int ctg = 0; ctg < guy.Count; ctg++)
                    guy.SetGene(ctg, Mutate(guy.GetGene(ctg), MutationMagnitude)); // Total mutation
                Guys.Add(guy);
            }            
        }

        private Gene Mutate(Gene g, double AMagnitude){
            Gene r = new Gene();
            double amp = g.Space.Size * AMagnitude;            
            double dv = (RND.NextDouble() - 0.5) * amp;            
            r.Val = g.Val + dv;
            r.Space = g.Space;
            return r;
        }

        private IGenom Sex(IGenom p1, IGenom p2) {
            IGenom guy = Populator.Create(); // new IGenom(Data, p1.Poly);
            for (int ct = 0; ct < guy.Count; ct++) {
                guy.SetGene(ct, Sex(p1.GetGene(ct),p2.GetGene(ct)));
            }
            return guy;
        }

        private Gene Sex(Gene g1, Gene g2) {
            Gene g = new Gene();
            double ratio = RND.NextDouble();
            g.Val = ratio * g1.Val + (1.0 - ratio) * g2.Val;
            return g;
        }

        public bool CheckParams() {
            return _BestQuota + _DeathRate + _Survivability <0> 0.05;
        }        

        private class GuyComparer : IComparer {
            public int Compare(object x, object y) {
                IGenom gx = x as IGenom;
                IGenom gy = y as IGenom;
                if (gx.Fitness gy.Fitness) return 1;
                return 0;
            }
        }

    }
Служил Гаврила космонавтом
Гаврила космос покорял.

Антип Од

Вот исчо к нему интерфейс IGenom:

public interface IGenom {        
        int Count { get; }  // Число генов
        Gene GetGene(int idx);
        void SetGene(int idx, Gene g);
        double Fitness { get; }
        IGenom Clone();
    }

А так же сам образчик гена:

public class Gene {
        public double Val;   // Это, собственно, искомая величина
        public DataRange Space; //  Это интервал поиска, просто min и max

        public Gene() { }
        public Gene(double val, double min, double max) { Val = val; Space = new DataRange(min, max); }

        public Gene Clone() {
            Gene r = new Gene();
            r.Val = Val; r.Space = Space.Clone();
            return r;
        }

        public override string ToString() {
            return Val.ToString();
        }
    }
Служил Гаврила космонавтом
Гаврила космос покорял.

Антип Од

Вот еще к нему популятор:

public interface IPopulator {
        IGenom Create();
        object GetSolution(IGenom AGenom);
    }

Делает, собственно, две вещи
1) Создает новую особь из ничего.
2) GetSolution Превращает геном в объект конкретного типа, к примеру в полином. То есть, конструирует искомый класс из набора чисел.

Прошу учесть, я не говорил, что это лучший мой ИИ. Но зато он на три экрана и работает.
Служил Гаврила космонавтом
Гаврила космос покорял.

LRV_75

Антип Од, спасибо, посмотрим.
Ух ты, а что это комменты на английском?
Главное не наличие проблем, главное способность их решать.
У каждой ошибки есть Имя и Фамилия

LRV_75

Наименования переменных вообще сказка MutationLevel, Population, точно ИИ  :D  :D  :D
Главное не наличие проблем, главное способность их решать.
У каждой ошибки есть Имя и Фамилия

Антип Од

ЦитироватьАнтип Од, спасибо, посмотрим.
Ух ты, а что это комменты на английском?

Чо... понятно дело... Русских буков на клаве не всегда есть.

Вот немножко разъяснений...

Эволвер сохраняет в следующем поколении часть наилучших особей (тех у которых фитнес лучше)

Затем в лотерею сохраняет часть особей от фонаря, не взирая на фитнес.

Остальных мочит и заменяет на потомков и мутантов.

Вычисления заканчиваются в тот момент, когда за некоторое число поколений геном ни разу не улучшился. Т.е. родился совершенный будда, лучше которого ну никак.

Вот и вся любовь.

Популятор нужен для того, чтобы Эволвер не имел дела с конкретными объектами. Эволвер не имеет понятия, что именно он оптимизирует. Да ему и не надо.

Популятор может рожать как одинаковые объекты, так и разные(!), Эволверу - все равно. Число генов в особи тоже может быть разным, но тогда надо подкорректировать функцию Sex, - если гены не годятся для скрещивания (отвечают за принципиально разные вещи), то она и не должна их скрещивать, иначе, однако, совсем уроды будут получаться.

Быстродействие катастрофически зависит от эффективности функции Fitness. Если эта функция каждый раз просчитывает здоровенный массив исходных данных, - тогда CUDA или что-то в этом духе.

Между поколениями исходные данные можно менять (добавлять новые, удалять старые), тогда Эволвер будет за изменениями следить и менять лучшего Гуя на другого, даже если раньше сабж его устраивал.
Служил Гаврила космонавтом
Гаврила космос покорял.