Не знаю какая именно часть технической реализации интересует. Поэтому опишу исходные данные для анализа и некоторые правила анализа.Dalai wrote:Интересна чисто техническая реализация этого процесса
По большому счету, техническая реализация зависит от игровой ситуации. Это может быть действие ИИ на глобальной карте, в бою, в окне замка и т.д.
Рассмотрим алгоритм самообучающегося ИИ в бою. Более того, рассмотрим определенный момент t в бою, а именно, ход одной из единиц армии противника компьютера в выбранный наугад раунд боя. На этот момент времени t всю информацию о противостоящих сторонах запишем в виде двух матриц: D – матрица данных об обороняющейся армии, A – матрица данных об атакующей армии. Общий вид структур матриц будет идентичен между собой.
Подробнее запишем матрицу D в интересующий нам момент t: Dt = (P1, P2, …, Pi, …, P7), где Pi – случайный вектор (вектор случайных величин) характеристик боевой единицы, стоящей на i-ой (одной из 7) позиций.
Раскроем вектор столбце Pi. Транспонируем его и запишем как строку: PiT = (a*Pm; Ph). Здесь a параметр числа юнитов; Pm это вектор харатеристик монстров: Pm = (mbm1; mbm2; …; mbmj; … mbmn); Ph это вектор харатеристик героев: Ph = (hbm1; hbm2; …; hbmj; … hbmn), где
mbmj – случайная величина (СВ), равная произведению случайных величин mbj и mmj;
mbj – СВ, характеризующая базовое значение j-ого параметра монстра;
mmj – СВ, характеризующая коэффициент модификатора j-ого параметра монстра.
n – число параметров боевой единицы.
Допустим mb1 это СВ, характеризующая базовое значение атаки, тогда mm1 это бонус от артефактов и других модификаторов атаки для монстров.
Аналогично, для героев hbmj.
В качестве характеристик отбираются все ключевые навыки: способность летать, стрелять, кастовать определенные заклинания, атаковать, защищаться и др.
ИИ в каждый момент t своего хода в бою сравнивает матрицы Dt и At и с определенной вероятностью планирует действия базовые или альтернативные. В каждый последующий момент t+1 вес выбранного действия, а значит и остальных тоже, меняется: в случае успеха вес выполненного действия повышается, а невыполненных равномерным образом (в смысле пропорций их весов) снижается. В конце боя проводится сравнительный анализ отношения матриц A в конечные и начальный моменты боя. Полученное значение делится на D в начальный момент боя. То есть сначала оцениваются потери армии и затем потери оцениваются относительно силы армии противника. Это служит оценкой (весом) целой стратегии (последовательности действий) в бою против соперника с эквивалентной матрицей исходных данных.
Пример по существу. Допустим, экспертами уже установлены все возможные оценки, расставлены все веса действиям ИИ и записаны базовые стратегии.
Ситуация: 90 Джинов в трех стеках, по 30 в каждом, ходят первыми в бою против соперника человека.
Обозначим всевозможные действия Джинов кратко путями.
1. Если хватает маны на магию:
1.1. Колдовать замедление, если дистанционный урон соперника не превышает 10% суммарного здоровья всей собственной армии и если есть цель с резистом не более 25% без замедления. Вес этого действия 0,4 (Way1/0,4).
1.2. Колдовать ледяной молот, если все джины в армии могут нанести урон боле 25% суммарного здоровья противника, или если действующий стек джинов может уничтожить любой из стеков прямым уроном, который и будет целью. Вес этого действия 0,3 (Way2/0,3).
1.3. Колдовать иллюзию, если все джины армии могут сделать иллюзию с количеством опыта, превышающей 10% экспериенса армии соперника. Вес этого действия 0,2 (Way3/0,2).
1.4. В противном случае Рвение (Way4). Вес этого действия 0,1 (Way4/0,1).
2. Если нет маны и нельзя или невыгодно откупиться, то ближний удар (Way5). Вес этого действия 0 (Way5/0,0). Если вес равен 0, то действие выполняется из режима Wait, только при невозможности выполнить другие действия.
Базовая стратегия Джинов.
Way1/0,4 –> Way2/0,3–> Way3/0,2–> Way4/0,1–> Way5/0,0.
Обозначим базовую стратегию за Strategy0 (Str0).
Вот в такой ситуации можно издеваться над джинами с помощью диспела. Каждый раз, если система не самообучающаяся, то она будет после диспела с большей вероятностью видеть сигнал для действия Way1. Теперь опишем алгоритм, когда есть буфер памяти действий ИИ.
Ходят первые 30 джинов. Пусть после принятия Str0 наложенное замедление снято. Тогда в этом бою до уничтожения источника исцеления путю Way1 присваивается вес 0. Действие не возымело успеха, а значит оно недопустимо в будущем в тех же условиях. Другим действиям веса распределяются пропорционально, как 3 : 2 : 1 : 0.
Принимается Str1: Way1/0,0–> Way2/0,5–> Way3/0,33–> Way4/0,17–> Way5/0,0.
Ходят вторые 30 джинов. Пусть в результате принятия Str1 сделана иллюзия и тут же она разрушена отменой чар противника. Тогда в этом бою до уничтожения источника снятия иллюзий путю Way3 присваивается вес 0. Также присваивается вес 0 путю Way4, потому что рвение тоже может быть отменено. Остается одно активное действие.
Ходят третьи 30 джинов. Принимается Str2: Way1/0,0–> Way2/1,0 –> Way3/0,0 –>Way4/0,0 –>Way5/0,0.
Компьютер начинает пакостить и гасить монстров с наибольшим числом здоровьем, но обязательно тех, из которых он может убить хотя бы одного.
Пояснение: после Str0 логично обнулить веса Way3 и Way4, т.к. противник смог отменить замедление. Но замедление могло быть снято ускорением. То есть здесь нужен более внимательный анализ.
В целом победа дижнов убедительна, если отношение Af/A1 (здесь f индекс последнего раунда боя) велико (близко к 1), т.е. потери у джинов минимальные. И если сила соперника была не маленькой, то последовательность стратегий Str0->Str1->Str2 принимается успешной. Её вес высокий. А в следующем бою, в случае эквивалентности новых матриц A и D матрицам этого боя, новая битва полностью ведется по стратегии Str2, явившейся единственной успешной.
Замечание: отношение матриц Af/A1 не следует понимать простым делением, это сравнительный анализ случайных векторов, из которых эти матрицы состоят.
Какие-то есть еще полезные научные методы? Я писал о необходимости привлечения именно научные методов. Так то мне интересно, что еще можно привлеч сюда.Dalai wrote:Не согласен со словом "полностью" в первом предложении. Все остальное, конечно, верно.