Введение
Эта статья — продолжение предыдущего эксперимента, но с новым акцентом: теперь задача не просто привлекать внимание наблюдателя, а налаживать взаимодействие между существами — от сигналов к полноценной "торговле". Это шаг в сторону агентных симуляций, экономики и социодинамики в рамках игрового ИИ.
У любого ИИ есть какая-то цель. Существа в предыдущем эксперименте должны были привлекать внимание пользователя. Но что, если убрать пользователя из уравнения? Что, если дать существам внутреннюю мотивацию и возможность обмениваться ресурсами — пусть даже самыми примитивными? Так родился мой следующий шаг: обучить существ торговать друг с другом.
Я решил реализовать базовую рыночную экономику, где каждый агент может:
страдать от голода, холода и стресса,
получать ресурсы для избежания ущерба,
покупать и продавать предметы, влияющие на параметры.
Цель эксперимента — посмотреть, смогут ли существа формировать устойчивое поведение в условиях ограниченных ресурсов и ценовых отношений.
Основная механика
У существ появляются динамические параметры.
Скрытый текст
public enum CreatureParameters {
STRESS, HUNGER, TEMP_RESIST
}
public static class Creature {
private int id;
private float x;
private float y;
private HashMap<CreatureParameters, Integer> parameters;
private Inventory inventory = new Inventory();
private Offer offer;
private final CreatureState state = new CreatureState(1);
public record Offer(Item item, int price) {
}
Теперь существам необходимо питаться, чтобы не накапливать голод. Сильный голод приводит к накоплению стресса.
Для всей сцены теперь есть глобальный параметр температуры, который с каждым разом повышается (Но означает он похолодание), существа должны накапливать сопротивление холоду, чтобы не страдать от стресса.
У каждого существа теперь есть свой инвентарь с предметами, обладающие какими-либо полезными свойствами.
🍞 FOOD
— снижает голод;
🧥 CLOTHES
— увеличивает сопротивление температуре;
🍬 CANDY
— снижает стресс;
💰 MONEY
— универсальное средство обмена.
Скрытый текст
public enum Item {
FOOD(new Effect(CreatureParameters.HUNGER, 8), true),
CLOTHES(new Effect(CreatureParameters.TEMP_RESIST, 1), false),
MONEY(null, false),
CANDY(new Effect(CreatureParameters.STRESS, 8), true);
private final Effect effect;
private final boolean consumable;
Item(Effect effect, boolean consumable) {
this.effect = effect;
this.consumable = consumable;
}
}
Существа теперь не просто существуют, а генерируют ресурсы (еду, одежду и конфеты), но в момент своего появления определяется лишь один предмет, который существо может создавать, что приводит к потребности во взаимодействии с другими производителями, поэтому существам также выдаётся начальный капитал (100 монет), которые необходимы для любой торговой операции.
Торговля
Существа проверяют своё состояние и при необходимости инициируют торговлю:
if (parameters.get(HUNGER) < 100) {
tradeManager.trade(HUNGER, creature);
parameters.put(STRESS, parameters.get(STRESS) - 5);
}
//Пример с голодом
Если параметр критичен — существо ищет подходящего продавца с минимальной ценой и направляется к нему.
Скрытый текст
public Creature findSeller(CreatureParameters param, Creature creature) {
Item item = Arrays.stream(Item.values()).toList().stream().filter(i -> i.getEffect() != null).filter(i -> i.getEffect().parameter().equals(param)).findFirst().orElse(null);
return list.stream()
.filter(c -> c != creature)
.filter(c -> c.getOffer().item().equals(item))
.filter(c -> c.getInventory().getCount(item) > 1)
.filter(c -> c.getOffer().price() <= creature.getInventory().getCount(Item.MONEY))
.min(Comparator.comparingInt(c -> c.getOffer().price()))
.orElse(null);
}
В случае успешной сделки:
происходит обмен ресурса на деньги
Осуществление сделки Логирование сделок
Нарушение идиллии
Каждый цикл производит одну единицу ресурсов, но параметры понижаются быстрее, чем производится необходимый ресурс, поэтому постоянно накапливается стресс и образуется дефицит. А ещё, существа тратят время на перемещение при покупке, что сокращает число производимых ресурсов. Любое из существ для поддержания своих параметров должно продавать ресурс по цене покупки двух других.

Для реализации возможности менять цену, была приписана простая логика, по которой ИИ может внести правки в цену, только при условии бедности или, наоборот, достатка.
if (offerer.getInventory().getCount(Item.MONEY) > 100) {
if (rand < 10) increasePrice();
} else if (money < 10) {
decreasePrice();
}
Это не решает проблему увядания экономической системы, но создаёт борьбу за выживание среди существ.
Замечание: В системе из трёх существ, каждый зависит от каждого, поэтому поражение одного неминуемо ведёт к поражению двух других. Но ИИ каждого существа способен повлиять на порядок ухода со сцены.
Упрощаем суровые условия
После изменения скорости уменьшения параметров, были внесены новые правила:
Если существо накапливает много денег, оно может создать потомка:
Скрытый текст
if (creature.getInventory().getCount(Item.MONEY) > 200) {
spawn(new Creature("Подражатель "+name, offer));
}
Это поведение имитирует наследование стратегии — успешная модель реплицируется в новое существо с тем же предложением.
Так как новый продавец одежды может появится только от другого продавца одежды, то каждое существо с успешной стратегией создаёт себе равного конкурента.
Теперь существа выбирают не только самый дешёвый вариант сделки, но и ближайший к ним.
Ложная гипотеза
Я думал, что существа соберутся в одну большую кучу, но этого не происходит, хотя все они появляются довольно близко друг к другу
В таких условиях, как минимум 3 существа будут существовать всегда, но это будут представители, возможно, разных поколений.

Текущие результаты
Экономика становится самоорганизующейся — появляются паттерны поведения без вмешательства.
Успешные стратегии передаются потомкам — элемент эволюции.

Некоторые существа накапливали большие суммы и завышали цену, а после исчезновения конкурентов, врывались на рынок, приумножая свои накопления.

Таких существ я награждал именем Спекулянт.
Цена на любой товар в какой-то момент начинает варьироваться вокруг конкретного числа, это я обозначил как Действительная цена товара, хотя цена и должна была бы быть относительна цен на другие товары, но рост количества существ-продавцов замедляет изменения, стабилизируя рынок (Это я считаю странным).
Несмотря на демонстрацию существами некоторой гибкости, их поведение скорее дикое и основанное на инстинктах (Высокий вклад алгоритма и низкий вклад экспериментального опыта), поэтому сейчас существ можно назвать скорее лесным волком, нежели Волком с Уолл-Стрит.
Программируем хитрость
На этом этапе стало ясно, что одних лишь базовых реакций на внешние раздражители недостаточно для устойчивого и адаптивного поведения. Несмотря на элементы экономики и даже зачатки конкуренции, существа оставались реактивными: они не строили планов, не запоминали выгодные сделки и не развивали стратегии.
Чтобы превратить их из инстинктивных обитателей цифрового леса в более "социальных" агентов, я ввёл систему памяти и оценки прошлых взаимодействий.
Так родился Strategy.class
— класс, управляющий “поведением” существа не как набором инстинктов, а как системой принятия решений на основе прошлого опыта.
Скрытый текст
public class Strategy {
private final LinkedList<TradeRecord> tradeHistory = new LinkedList<>();
private final int MEMORY_LIMIT = 100;
private final Map<Creature, Double> trustMap = new HashMap<>();
private double DEFAULT_TRUST = 0.5;
private double SCAM_CHANCE = 0.0;
private static class TradeRecord {
Creature partner;
String item;
double price;
boolean wasScam;
boolean isGood;
}
}
Теперь каждое существо:
запоминает до 100 последних сделок: с кем, что, по какой цене;
формирует доверие к другим существам — агентов с хорошей историей торговли предпочитают в будущем;
может отказаться от сделки, если цена кажется "нечестной", исходя из среднего по памяти.
ИИ в момент обмена определяет поле isGood для записи трейда (на основе этого я смог построить таблицу для предсказательного алгоритма [алгоритм Случайного Леса] и добавил работу с ней в моменте выбора продавца).
Это привело к появлению первых торговых предпочтений и зачатков репутации. Некоторые существа начали избегать «жадных» агентов, даже если они находились ближе и предлагали нужный товар.
Сразу после этого я ввёл механику обмана, изначально до такого опускались только бедные продавцы, но чем чаще обман совершался существом, тем больше становилась его вероятность. Сам обман заключался в том, что вместо обычной цены, в момент сделки, продавец брал двойную сумму, что записывалось в память покупателя.
Успешные стратегии передаются потомкам, в том числе и обман.
Результаты
Ввод обмана стал финальной точкой эксперимента, теперь я мог сказать, что развитие оптимальной стратегии лежало на плечах маленьких дурачков. Это также подтвердилось тем, что если раньше "Подражатели" ничем не уступали предкам в момент появления, то теперь им приходилось изменять унаследованную стратегию для конкуренции. Таким образом начал встречаться Демпинг.


Но больше всего меня удивил потомокX3, стратегия которого позволила пережить всех, накопить много товаров и мгновенно избавляться от потомков-конкурентов

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

Заключение
С добавлением стратегии и обмана мои жёлтые существа впервые вышли за пределы простой симуляции обмена ресурсами. Они стали не просто реагировать на голод или холод, а учиться, доверять, избегать, манипулировать. Появилась динамика поведения, зависящая не только от внешней среды, но и от социальной памяти.
Это уже не просто игра. Это — модель общества. И следующий шаг может быть: дать существам язык. Пусть начнут договоры, шантаж и, возможно, дружбу.
Так или иначе, мне в любом случае будет интересно рассмотреть ещё какие-либо алгоритмы на примере этих жёлтых человечков.
