Разбор задачи на компьютерное моделирование

Задача взята из книги «‎Этюды для программистов» Чарлза Уэзерелла 1982 (рус.)

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

Моделирование ведется с шагом по времени в один месяц. В начале игры каждый игрок (президент компании) получает две обычные фабрики, четыре единицы сырья и материалов (сокращенно ЕСМ), две единицы готовой продукции (сокращенно ЕГП) и 10000 долл. наличными. Игроки занумерованы от 1 до N, и в первом круге игрок 1 — старший. С каждым кругом (т. е. ежемесячно) роль старшего переходит к следующему по порядку номеров игроку, после N-го старшим становится опять первый (так что номер старшего в круге Т вычисляется по формуле (Т mod N) + 1). На торгах при прочих равных условиях выигрывает самый старший игрок (тот, кто будет старшим в следующем круге).

1. Ежемесячные операции

Описанные ниже сделки происходят каждый месяц и именно в таком порядке. Если в какой-то момент компания не может выполнить своих финансовых обязательств, она немедленно объявляется банкротом. Ее имущество пропадает, и она выходит из игры (так что лучше иметь наготове запас наличных). Все денежные расчеты происходят между отдельными игроками и одним общим банком. Невозможна передача денег прямо от игрока к игроку, что исключает сговор, направленный против какой-либо компании. Банк, кроме того, контролирует источники сырья и скупает всю готовую продукцию.

  1. Постоянные издержки. Каждый игрок (в порядке убывания старшинства, начиная со старшего) платит 300 долл. за каждую имеющуюся у него ЕСМ, 500 долл. за каждую наличную ЕГП, 1000 долл. за владение каждой обычной фабрикой и 1500 долл. — за владение автоматизированной. Это постоянные ежемесячные издержки каждого игрока, даже если он в этом круге не предпринимает никаких других действий.
  2. Определение обстановки на рынке. Банк решает и сообщает игрокам, сколько ЕСМ продаст в этот раз и какова их минимальная цена. Объявляется также, сколько ЕГП в общей сложности будет закуплено и какова максимальная цена.

    Таблица 1.: Таблица 6.1. Уровни цен на ЕСМ и ЕГП
    Уровень ЕСМ Минимальная цена ЕГП Максимальная цена
    1 1.0Р $800 З.ОР $6500
    2 1.5Р 650 2.5Р 6000
    3 2.0Р 500 2.0Р 5500
    4 2.5Р 400 1.5Р 5000
    5 З.ОР 300 1.0Р 4500

    В табл. 6.1 приведены пять уровней предложения ЕСМ и спроса на ЕГП (обратите внимание, что с ростом одной из этих величин другая убывает), а также верхние и нижние границы цен для каждого случая. В число игроков Р не включены те, кто обанкротился, и Р может, таким образом, быть меньше N. Произведения 1.5Р и 2.5Р округляются до ближайшего целого с недостатком. В табл. 6.2 приведена матрица вероятностей перехода, в соответствии с которой банк определяет новый месячный уровень спроса и предложения, исходя из прежнего. Предполагается, что в нулевом месяце уровень равен 3.

                    
                    
     Старый уровень 
                Новый уровень                  
     1                2      3     4      5    
                  1   1/3              1/3    1/6   1/12   1/12 
                  2   1/4              1/3    1/4   1/12   1/12 
                  3   1/12             1/4    1/3   1/4    1/12 
                  4   1/12             1/12   1/4   1/3    1/4  
                  5   1/12             1/12   1/6   1/3    1/3  
  3. Заявки на сырье и материалы. Каждый игрок тайно от других готовит заявку на ЕСМ на текущий месяц. В заявке указывается требуемое число ЕСМ и предлагается цена не ниже банковской минимальной (запрос нуля ЕСМ или предложение цены ниже минимальной автоматически исключает игрока из торгов в этом месяце). Все заявки раскрываются одновременно, и имеющиеся ЕСМ распределяются между игроками в порядке убывания предложенной цены. Если сырья не хватает на всех, заявки с предложением более низкой цены не удовлетворяются. При прочих равных условиях сырье достается самому старшему игроку. Игроки платят за сырье при его получении. Банк не сохраняет оставшееся после удовлетворения заявок сырье на следующий месяц.

  4. Производство продукции. Все игроки по очереди (по убыванию старшинства, начиная со старшего) объявляют, сколько ЕСМ они собираются переработать в ЕГП в текущем месяце и на каких фабриках. Каждый игрок обязан тут же покрыть расходы на производство. Обычная фабрика может за месяц переработать одну ЕСМ при затратах в 2000 долл. Автоматизированная фабрика может либо сделать то же, либо переработать 2 ЕСМ при затратах в 3000 долл. Конечно, чтобы переработать ЕСМ, их надо иметь.

  5. Продажа продукции. При покупке банком у игроков ЕГП организуются примерно такие же торги, как и при продаже ЕСМ. Заявленные цены не должны превышать максимальную цену, установленную банком, причем банк покупает ЕГП в первую очередь у тех, кто заявил более низкую цену. При прочих равных условиях предпочтение отдается старшему игроку. Если предложение превышает спрос, наиболее дорогие ЕГП остаются непроданными. Игроки получают деньги за продукцию при ее продаже.

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

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

  8. Получение ссуд. Теперь каждый игрок может получить ссуду. Ссуды обеспечиваются имеющимися у игрока фабриками; под обычную фабрику дается ссуда 5000 долл., под автоматизированную — 10000 долл. Общая сумма непогашенных ссуд не может превышать половины гарантированного капитала, но в этих пределах можно свободно занимать. Банк немедленно выплачивает ссуду игроку. Срок погашения ссуды истекает через 12 месяцев — например, ссуду, взятую в 3-м месяце, возвращать надо в 15-м. Нельзя погашать ссуды раньше срока.

  9. Заявки на строительство. Игроки могут строить новые фабрики. Обычная фабрика стоит 5000 долл. и начинает давать продукцию на 5-й месяц после начала строительства; автоматизированная фабрика стоит 10 000 долл и дает продукцию на 7-й месяц после начала строительства. Обычную фабрику можно автоматизировать за 7000 долл., реконструкция продолжается 9 месяцев, все это время фабрика может работать как обычная. Половину стоимости фабрики надо платить в начале строительства, вторую половину — за месяц до начала выпуска продукции в этой же фазе цикла. Общее число имеющихся и строящихся фабрик у каждого игрока не должно превышать шести.

2. Окончание игры и подсчет результатов

Игра оканчивается после некоторого фиксированного числа кругов (13 или более) или когда обанкротятся все игроки, кроме одного. Чтобы подсчитать общий капитал компании, надо сложить стоимость всех фабрик (по цене, по которой их можно было бы построить заново), стоимость имеющихся у нее ЕСМ (по минимальной банковской цене текущего месяца), стоимость имеющихся ЕГП (по максимальной банковской цене текущего месяца) и имеющиеся у компании наличные. После этого надо вычесть общую сумму ссуд и предстоящих расходов по уже начатому строительству. Если к концу игры приходит несколько игроков, результаты считаются по их капиталам.

Любой игрок в любой момент может узнать состояние дел любого другого игрока — его капитал, наличные, взятые ссуды, все, что касается готовой продукции, имеющихся и строящихся фабрик. Во время торгов игроки ничего не знают о заявках, сделанных другими, но, как только банк собрал все заявки, они обнародуются и количество купленных или проданных каждым игроком единиц становится известно всем. Игроки могут сами вести любые записи, но банк не предоставляет им никакой информации, кроме той, которая предусмотрена правилами игры. Построение формальной модели

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

В первую очередь, все правила игры можно разбить на 2 большие группы:

  • Действия в начале и по завершению игры (формальные признаки начала и окончания симуляции, а так же связанные действия)
  • Правила ходов. То есть, непосредственно сама симуляция.

Получаем схему, типичную для симуляций:

  • Инициализация
  • Условия завершения выполнены?
  • Нет. Игроки совершают действия из коробки с правилами
  • Да. Завершить симуляцию.

Начнем с условий завершения симуляции.

  • Прошло фиксированное число кругов (шагов симуляции). Это синтетическое условие, которое не относится к стимулируемому явлению.
  • Обанкротились все игроки, кроме одного. А вот это уже похоже на доменное условие, разберемся.

Находим в условие упоминание банкроства: «‎Если в какой-то момент компания не может выполнить своих финансовых обязательств, она немедленно объявляется банкротом. Ее имущество пропадает, и она выходит из игры». То есть, если переводить на язык процедуры игры, то эта фраза значит буквально «‎в пуле активных игроков остался один». То есть и это условие синтетическое, несмотря на его изначальную формулировку. Разбор правил шагов и построение отношений.

Все шаги заботливо перечислены автором задачи в пункте «‎Ежемесячные операции». Если присмотреться, то почти каждая операция является обменом.

Операция Кто отдает Кому дает Что отдает Что получает
Издержки Игрок Некоторую сумму издержек (формула) Право сделать ход
Заявка ЕСМ Игрок Банк Деньги ЕСМ
Продажа ЕГП Игрок Банк ЕГП деньги
Производство ЕГП Игрок ЕСМ + Деньги ЕГП
Погашение ссуды Игрок Банк Деньги (формула) Погашенное фин. обязательство (т.е. единицу долга)
Выдача ссуды Банк Игрок Деньги Фин. обязательство от игрока.
Постройка (модернизация) фабрики Игрок Деньги Новая фабрика

Вот и готова первая модель: функция обмена ресурсов между участниками симуляции.

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

3. TODO Параметризация функций обмена

4. TODO Рассчет начальных условий шага симуляции