Искусственный интеллект для NPC: обмен товарами между двумя персонажами

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

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

Критерии оценки покупаемых предметов Критерии оценки продаваемых предметов
Желаемый объект Компонент желаемого объекта
Компонент для желаемого объекта Редкость материала
Устранение дефицита
Редкость материала
Убывающая полезность

Каждому предмету присваивается «базовая стоимость», которая затем корректируется с учётом указанных факторов:

  • Желаемый объект – умножаем базовую цену на коэффициент 2.0. NPC не продаёт то, к чему стремится сам.
  • Компонент для желаемого объекта – умножаем цену на 1.5. При избытке таких компонентов при продаже их ценность наоборот растёт.
  • Устранение дефицита – за каждый дефицитный параметр цена увеличивается на 10%. NPC не реализует товары, восполняющие собственный дефицит.
  • Редкость материала – обозначаем для каждого материала коэффициент коррекции. NPC оценивает распространённость материала от –1 (редкий) до 1 (широко распространённый), и предметы из редких материалов дорожают, а из часто встречающихся — удешевляются.
  • Убывающая полезность – стоимость каждого последующего экземпляра снижается на постоянную величину (декремент). В расчёт идёт число уже имеющихся экземпляров, кроме тех, что нужны в полном комплекте для желаемого объекта.

Алгоритм торгового взаимодействия

Торговля начинается с инициализации торговой сессии: каждая сторона формирует список выставляемых на обмен предметов (tradable). В него не включаются: желаемые объекты и их необходимые компоненты, товары, устраняющие дефициты, а также лучшее оружие и броня.

Одна из сторон становится активной и формирует запрос, выбирая из tradable противника те вещи, которые желает приобрести (по тем же критериям, по которым отказывается продавать своё).

Противоположная сторона оценивает запрошенные предметы и затем отбирает из tradable активного участника товары для компенсации, следуя приоритету: желаемые объекты → их компоненты → устранение дефицита → вооружение/броня лучше текущего → ценные вещи. Если суммарная стоимость выбранных вещей превышает стоимость запроса (с учётом параметра «жадность»), формируется контрпредложение и отправляется инициатору сделки.

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

Искусственный интеллект для NPC: обмен товарами между двумя персонажами

Технические детали: оценка, выгодно ли предложение, производится как сравнение стоимости чужих предметов и собственных, умноженных на коэффициент «жадности». Для распознавания компонентов желаемых объектов используется нейросетевой эмбеддинг, позволяющий понять сложные цепочки производства (например, уголь → руда → металл → наконечник → кирка).

Свойства предметов и рецепты хранятся в файле .xlsx, что упрощает правку баланса торговли без вмешательства в код.

Пример технологической цепочки создания кирки
Технологическая схема создания кирки

Результаты

Ниже представлены шесть примеров торговых сессий между NPC. В верхней строке указаны начальные tradable-предметы, в нижней – итоговый состав сделки.

NPC 1 NPC 2
1

Начало: [‘copper_ore’,2], [‘vein’,29], [‘bone_spear’,1], [‘coal’,15]

Итог: [‘bone_spear’,1]

Начало: [‘small_leather’,19], [‘coal’,8], [‘flint_stone’,4], [‘clay’,11], [‘rope’,19]

Итог: [‘flint_stone’,4], [‘clay’,11], [‘small_leather’,15]

2

Начало: [‘big_leather’,8], [‘vein’,15], [‘tin_ore’,10], [‘tin’,6], [‘clay’,4]

Итог: [‘tin_ore’,2], [‘clay’,4]

Начало: [‘copper_ore’,4], [‘copper_coin’,11]

Итог: [‘copper_ore’,4]

3

Начало: [‘copper’,17], [‘rope’,23], [‘bones’,10], [‘wooden_stick’,1], [‘clay’,21]

Итог: [‘wooden_stick’,1], [‘clay’,17]

Начало: [‘big_leather’,5], [‘small_leather’,13], [‘bone_spear’,1]

Итог: [‘big_leather’,3]

4

Начало: [‘copper’,23], [‘flint_stone’,22], [‘copper_coin’,1], [‘small_leather’,3]

Итог: [‘small_leather’,2]

Начало: [‘wooden_chips’,19], [‘tin’,11], [‘big_leather’,5]

Итог: [‘big_leather’,1]

5

Начало: [‘clay’,50], [‘tin_ore’,7]

Итог: [‘clay’,17], [‘tin_ore’,2]

Начало: [‘copper_ore’,42]

Итог: [‘copper_ore’,6]

6

Начало: [‘copper_ore’,2], [‘ruby’,1], [‘flint_stone’,1]

Итог: [‘copper_ore’,2], [‘flint_stone’,1]

Начало: [‘coal’,27]

Итог: [‘coal’,2]

Выводы

  • Разработан алгоритм обмена, обеспечивающий реалистичные сделки между NPC с учётом свойств предметов и производственных цепочек.
  • Асинхронная оценка покупаемых и продаваемых товаров создаёт взаимовыгодные обмены.
  • Параметр «жадность» можно делать индивидуальным или динамическим, влияя на торговые взаимоотношения – например, через страх или доверие.
  • Итерационный подход снижает вычислительную нагрузку и допускает ввод игрока-человека без необходимости мгновенного завершения всех шагов.
  • Следующий этап разработки — внедрение системы общения между NPC.

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

 

Источник

Читайте также