Искусственная жизнь

В этом посте речь пойдёт о принципах построения искусственной жизни на основе ИИ, описанного ранее. Я обнаружил одну важную особенность: каждое действие неразрывно связано с состоянием, в котором его можно применять. Под состоянием (S) понимается все необходимые условия, в которых действие может быть исполнено. Т.е. в неоптимизированном идеальном варианте это совокупность всех параметров мира, в модели которого живёт ИИ. В оптимизированном варианте это только явно необходимые параметры без учета «погоды на Марсе».


Если ИИ нашёл новое сложносоставное действие с помощью анализа лога экспериментов, рассмотренного в предыдущем посте, то он обязан привязать это действие к набору параметров S, при которых оно может быть выполнено. Таким образом, к одному и тому же эффекту (состоянию), могут вести несколько действий, как примитивных, так и составных. Подходящее действие ИИ выбирает исходя из условий, в которых он находится.


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


Пусть A0 — множество всех действий прошитых в ИИ при рождении, а S — состояние системы. Тогда в общем виде алгоритм искусственной жизни будет выглядеть следующим образом.



// необходимо достичь предустановленного эффекта S1
1.) случайный_перебор_действий(A0, S1)
// эффект S1 достигнут, а также найдены многие другие действия и сохранены в множество A1
// необходимо достичь предустановленного эффекта S2
2.) случайный_перебор_действий(A0 + A1, S2)
// эффект S2 достигнут, а также найдены многие другие действия и сохранены в множество A2
// необходимо достичь предустановленного эффекта S1 и есть действие a75 для его достижения в условиях S75
3.) случайный_перебор_действий(A0 + A1 + A2, S75)
// достигнуты условия S75, теперь можно выполнять действия для достижения цели S1
4.) выполнение_набора_действий(a75)
// эффект S1 достигнут, многие действия откорректированы
...


На шаге 3 и 4 демонстрируется как ИИ выбирает промежуточный эффект S75 в качестве цели для достижения эффекта S1. Теперь о том, что такое случайный_перебор_действий(...) и как он может быть запрограммирован. Всё очень просто:

случайный_перебор_действий(A: множество действий, St: целевое состояние системы)
{
  Ac = найти_действия_приводящие_к_эффекту(A, St)
  Ss = извлечь_начальные_условия(Ac)
  while (S != St && not(S in Ss))
  {
    a = A0[random(LEN(A))]
    выполнение_примитивного_действия(a)
  }
  if (S == St)
    return;
  if (S in Ss)
  {
    a = найти_действие_по_начальным_условиям(Ac, S)
    выполнение_набора_действий(a)
    if (S == St)
      return;
    else
      exit("Критическая ошибка, обратитесь к разработчикам.");
  }
}


Функция случайный_перебор_действий(...) всегда должна завершаться удачно, т.е. приводить к искомому эффекту St. Эта функция пытается найти промежуточные точки для перехода к состоянию St и далее перебирает примитивные действия до тех пор пока одна из этих точек не будет достигнута. Если таких точек не нашлось вовсе, эта функция будет делать перебор примитивных действий до тех пор пока не достигнуто условие St.


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


Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то воспользуйтесь предлагаемыми ниже кнопками:


Блог: http://romanlovetext.blogspot.com/