Инженерный тур. 3 этап
Энергетика — отрасль для стороннего человека сложная и статичная — на деле стремительно развивается и уже сегодня предлагает множество интересных технологий: от солнечных и ветровых электростанций до микросетей и архитектуры интернета энергии.
Эти и многие другие технологии уже достаточно хорошо изучены, реализованы, но пока еще не встроены в реальные энергетические комплексы, потому что от надежной работы энергосистем в буквальном смысле зависят человеческие жизни. Тем не менее энергетика ближайшего будущего — это тема многих исследований и экспериментов.
Основная задача инженерного тура профиля — моделирование энергосистемы и разработка алгоритмов управления энергообеспечением.
Цель — разработать стратегию оптимального построения умной энергосети и управления ею в условиях локальной конкуренции. Победит та команда, чья энергосеть окажется самой эффективной с точки зрения производства, накопления и расхода энергии, и самой гибкой, способной выбрать оптимальный подход с учетом меняющихся условий.
Энергетика — одна из важнейших и сложнейших сфер современной цивилизации, и это возлагает на специалистов-энергетиков большую ответственность. Цена ошибки слишком высока, а любое изменение должно быть тщательно выверено.
Из-за этого кажется, что энергетика инертна и отстает от современности. Но ученые и инженеры постоянно работают над новыми технологиями. Многое из того, что могло казаться фантастикой, уже изобрели, исследовали, а где-то даже построили и используют:
- солнечные и ветряные электростанции,
- накопители энергии для домохозяйств,
- изолированные энергосети, которые обмениваются мощностями и многое другое — лишь малая доля из того, что уже позволяет сократить потери и поставлять стабильную электроэнергию в сложных условиях.
Но почему их не вводят повсеместно? Ответ простой: если собрать все новшества (даже самые проверенные) и внедрить сразу в больших масштабах — энергетика не выдержит и рухнет. Это сложная сфера со множеством взаимосвязей, и часто они совсем не очевидны. Именно для этого нужны ученые и инженеры, способные ставить эксперименты и просчитывать все варианты.
Взять на себя инициативу и заглянуть вперед можно уже сейчас. В инженерном туре финала участники примерят на себя роль энергосбытовых компаний в энергетике ближайшего будущего, где представлены новые технологии. Стенд «Интеллектуальные энергетические системы» выступает полигоном, готовым к самым смелым идеям и стратегиям для создания наиболее эффективной и гибкой энергосистемы.
Количество участников в команде: 4–5 человека.
Компетенции, которыми должны обладать члены команды:
- Data-аналитик: способен работать с данными, анализировать, выбирать те, что наиболее информативны в нужный момент времени. Этот человек может совмещать роль тестера в команде.
Системный аналитик: анализирует стратегию игры и поведение других команд на площадке и на других распределенных площадках, занимается топологией сети. Здесь понадобятся навыки и знания из теории игр, умение комбинировать и искать оптимальные стратегии.
Совместно оба аналитика должны быть способны определить, какие данные важны для создания алгоритмов управления и что будет являться управляющими параметрами.
Программист: создает алгоритмы управления и вывода необходимых данных, строит обратные связи, работает с реализацией стратегии.
В команде желательно два программиста, которые способны делать ревью кода друг друга.
- Капитан: принимает решения, находясь на слой выше в потоке информации. Должен обладать знаниями по всем основным темам, уметь разбираться в коде, анализировать задачи, строить стратегии. Видит картину в целом, отвечает за постановку цели, за распределение ролей в команде, за быстрое перераспределение задач в случае необходимости, отделяет главное от второстепенного, перенаправляет усилия команды. От работы капитана во многом зависит исход игры.
Практический тур ежегодно проводится на стендах-тренажерах «Интеллектуальные энергетические системы» (СТИЭС), разработанных компанией «Полюс-НТ». Это модель поселения с потребителями энергии (жилые дома, больницы, заводы), электростанциями на альтернативных источниках энергии.
Стенд воссоздает погодные условия (ветер и освещенность) и рынок электроэнергии (многоуровневая биржа микроконтрактов). Общий вид комплекса представлен на рис. 4.1, устройство комплекса представлено в Приложении 1. Заключительный этап этого года проводится сразу на двух площадках, и конфигурация комплексов на них максимально идентична по характеристикам (в частности, пространственно-геометрическим).
На время инженерного тура каждая команда закрепляется за одним из ПК-терминалов комплекса «Интеллектуальные энергетические системы». Работа идет в программно-аппаратной среде терминала, для нее в этой среде могут быть использованы только предустановленные библиотеки и ПО.
Для анализа данных и формирования стратегий участники могут использовать внешние ноутбуки с любым ПО, которое считают необходимым. Команда может использовать для работы личные ноутбуки, а при их отсутствии — запросить у организаторов ноутбук/ПК.
| Наименование | Описание |
|---|---|
| Стенды-тренажеры «Интеллектуальные энергетические системы» (СТИЭС) | Основные стенды для проведения финальных соревнований |
Энергосистемы объединены в единую сеть и подсоединены к внешней энергосистеме по схеме «микрогрид»: каждая из энергосистем сначала балансируется собственными ресурсами, а затем — через внешнюю энергосистему, в том числе с помощью оппонентов.
Будущая энергосистема разделена между конкурирующими компаниями. Общий порядок работы заключается в следующем:
- Каждая команда становится одной из конкурирующих энергокомпаний, строит свою собственную энергосистему и управляет ею. Разделение происходит через цепочку аукционов, в которых участники изначально находятся в принципиально одинаковых условиях.
- Команды собирают из полученных объектов собственную энергосистему (при этом из одного и того же набора можно составить очень разные по эффективности энергосистемы) и готовят управляющие скрипты (программы на языке Python) для управления ими.
- Выполняется моделирование нескольких «дней работы» энергосистемы, в ходе которого участники управляют своими энергосистемами посредством скриптов.
Таким образом, команды в течение нескольких сессий:
- анализируют прогнозы погоды и поведения потребителей, распределяют объекты потребления и генерации на аукционе,
- собирают из них энергосеть, настраивают автоматизированную систему управления (путем написания скриптов),
- испытывают ее в ходе моделирования энергосистемы в пробных играх.
Конечной метрикой эффективности разработанной стратегии является прибыль, полученная в результате штатного функционирования энергосистемы. В последние дни финала происходит экспериментальное измерение эффективности построенных энергосистем в соревновательных играх. Очки, набранные командами во время моделирования, пересчитываются в баллы, которые участники получат за командную часть олимпиады.
В этом году физические задачи определения параметров генераторов модифицированы: светильники на столах светятся несинхронно, имитируя движение солнца с востока на запад. Кроме этого, изменен характер прогнозов на силу ветра: они были разными на каждом из трех столов (но на соответствующих столах каждой из двух площадок были одинаковыми). Киберфизические солнечные электростанции, киберСЭС, введенные в прошлом году, сохранены, но незначительно изменена механика их поворота (поменялись скорость поворота и диапазон значений угла).
В самой игре изменен характер экономической модели:
- аукцион ведется по принципу all-pay (платят все) на пакеты объектов с заранее выставленными тарифами,
- в рамках моделирования начисляются экологические баллы, которые в конце игры конвертируются в баллы итогового счета,
- банк для итоговой выплаты формируется из налогов, взимаемых с команд на протяжении моделирования,
- введена механика дискретного износа сетей: в течение моделирования ветки подстанций накапливают износ, при превышении которого ветка отключается на один такт и автоматически включается,
- с помощью управляющего скрипта команды могут вручную отключать ветки для сброса накопленного износа.
Поскольку киберСЭС и ветрогенераторы в такой задаче конкурируют за общее пространство в центральной области стенда, главные подстанции выставлены на аукцион наравне с остальными объектами для того, чтобы команды могли выбирать себе подходящее место. Помимо этого, имелось незначительное влияние светильников соседних стендов, и оно в случае обнаружения его командами было бы монетизировано на аукционе: более выгодные подстанции были бы куплены дороже.
Задача командного практического тура заключительного этапа представляет собой комплексную интегральную задачу, полное оптимальное решение которой сложно. Однако полное приближенное решение способна найти любая команда. Качество и сложность используемых приближений отражает глубину понимания, знаний и уровень компетенций участников. Система оценки полностью автоматизирована и спроектирована таким образом, чтобы однозначно и численно оценить качество найденных и реализованных участниками решений.
Проведение заключительного этапа происходит в виде командного турнира. Цель команд — набрать наибольшее число баллов в турнире.
Этап проводился уже сформированными командами. Это продолжительный период времени, в течение которого участники знакомятся с правилами, изучают предоставленную систему и делают заготовки (управляющие скрипты, стратегии и вспомогательные программы).
Во время подготовки проводится ряд пробных игр как локальных (между команд на отдельной площадке), так и синхронных (среди всех команд на обеих площадках).
Проводятся три синхронных соревновательных игры. В каждой игре вся совокупность принятых участниками решений интегрально оценивается стендом в автоматическом режиме. Каждая игра идет с разными прогнозами, и за каждую игру очки, заработанные участниками, переводятся в рейтинговые баллы. За все три игры результат складывается, после чего вычисляется итоговый балл умножением на 100 и делением на максимальную сумму рейтинговых баллов.
Игры во время командного тура заключительного этапа разделяются на два вида:
- пробные;
- соревновательные.
Все пробные игры предназначены для отработки решений и проведения экспериментов. Никаких баллов за пробные игры не начисляется. Все командные баллы участники получают только за результаты соревновательных игр.
Детальные правила игр 2024–25 года, которые предоставлялись участникам, можно найти в Приложениях 2 и 3.
Минимум за 10 мин до запуска аукциона участникам выдаются прогнозы погоды и потребления для каждой категории потребителей в предстоящей игре. Файл прогнозов выгружается из интерфейса игры в формате CSV и анализируется любым способом на усмотрение участников (с помощью табличного калькулятора или программно). За время анализа участники должны спроектировать энергосистему, наиболее удовлетворяющую предстоящим условиям.
На этом этапе определяется, какой объект к чьей энергосистеме будет подключен. Аукцион закрытого типа, с продолжением в случае догоняющих ставок (отличающихся от лидирующей на заданную правилами величину). Одновременно разыгрываются по три лота. Этот этап практически невозможно пройти успешно без глубокого предварительного анализа и разработанных участниками систем для поддержки принятия решений.
Проводится через 60 с после основного. В этот интервал времени каждая команда имеет право повторно выставить на торги один из приобретенных ранее пакетов. Данный этап дает командам шанс на исправление ошибок в закупках, если они не слишком существенны.
Участникам предоставляется время на проектирование топологии сети. За это время они находят оптимальную конфигурацию своей энергосистемы и собирают ее на стенде. В это же время команда адаптирует к получившейся энергосистеме составленные заранее управляющие скрипты.
Загрузка осуществляется через пользовательский интерфейс стенда. Написание скрипта производится любым способом на усмотрение команд. Желательно, чтобы скрипт был написан и проверен заранее (для этого участникам предоставляется тестовая библиотека с документацией).
Данный этап начинается после подтверждения готовности всех команд путем голосования через пользовательский интерфейс или по поднятой руке на локальных тренировочных играх. Все управление на этом этапе осуществляется только скриптами. Участники наблюдают за работой своих скриптов и могут их заменить, например, в случае обнаружения ошибки. Количество повторных загрузок скрипта не ограничено, во время очередного такта выполняется загруженный на данный момент скрипт.
На синхронных тренировочных и зачетных играх итоговые баллы за моделирование публикуются в чате инженерной задачи. На локальных играх баллы оглашаются устно или выводом табло на экран (в зависимости от технических способностей площадок проведения).
Команды выгружают журнал управляющего скрипта, после чего анализируют его с использованием тестовой библиотеки (принцип и порядок анализа — на усмотрение участников). Кроме того, они анализируют и обсуждают результаты внутри команды, ищут гипотезы и составляют план их проверки.
Аукцион проводится по закрытой схеме. Участники делают ставки в течение заданного отрезка времени, после чего система поводит итог.
В отличие от прошлых лет, на аукционе разыгрывается пакеты объектов с заранее установленными тарифами (для потребителей — цена за 1 МВт \(\times\) такт потребленной энергии, для остальных объектов — арендная плата за каждый такт).
Ставки на пакеты делаются на повышение по правилам all-pay (платят все), а именно, в виде фиксированных сумм, которые участники готовы заплатить, чтобы пакет лотов достался именно им, но выплачивают свои ставки, даже если они не выиграли лот. Ставки участников на каждом раунде этого аукциона вычитаются из их результата.
Выигрывает предложивший наибольшую ставку, но если один участник или более предложили ставку, отличающуюся от лидирующей не больше, чем на заданную величину (на зачетных играх она составила 50 руб.), для владельца лидирующей и догоняющих ставок назначался повторный раунд аукциона. При этом ставка all-pay на повторном туре выплачивается отдельно от предыдущей. Стартовая цена каждого лота составляла 1 руб., каждый повторный раунд аукциона повышает стартовую цену в 2 раза (2, 4, 8 и т. д.). Если на лот никто не выставил ставку, он исключается из игры.
Сумма ставок на аукционе all-pay не может превышать 9999, что контролируется системой управления ходом аукциона, и в случае исчерпания лимита команда автоматически исключается из всех последующих раундов all-pay.
В течение 60 с после окончания аукциона каждая команда имеет право выставить на торги один из своих пакетов. Команда ничего с этого не приобретает (выплаченные ставки не возвращаются), но получает возможность избавиться от лишнего объекта, нарушающего баланс энергосистемы. Она не имеет права делать ставки на объект, который выставила на торги.
На аукционе разыгрываются параллельно по три лота. Порядок выставления лотов фиксирован и известен участникам заранее.
На аукцион выставляются стартовые пакеты, в которые входят:
- главная подстанция,
- мини-подстанция типа А,
- кибер-СЭС,
- жилой дом.
Каждая команда обязана выкупить один из этих пакетов, в противном случае в конце аукциона команды получают один из этих пакетов случайным образом и бесплатно. Покупка двух таких пакетов не предусмотрена и ограничена технически (после выкупа пакета с главной подстанцией команда автоматически исключается из торгов за остальные такие пакеты).
Часть лотов (глобальные) доступна для всех участников аукциона, часть (локальные) — только в пределах одной из двух площадок (для обеих площадок состав объектов и условия были одинаковы).
Локальные лоты представляют собой из инструментов защиты от монополии (закупки избыточного числа объектов одной командой). Само по себе монопольное поведение не является неспортивным, однако при широком его распространении игра становится вырожденной — выигрышной становится стратегия отказа от участия в аукционе. Она является абсолютно легальной и психологически нетривиальной, но требует решения только части подзадач стенда, поэтому целесообразно, чтобы она была выигрышной только в ситуациях, близких к экстремальным.
Система оценивания полностью автоматизирована и спроектирована таким образом, чтобы однозначно и численно оценить качество найденных и реализованных участниками решений. Итог отдельной игры отражает интегральную эффективность решений команды в данных игровых условиях в виде условного экономического баланса. Проведение практического тура происходит в виде командного турнира. Цель команд-участников — набрать наибольшее число баллов в турнире.
Турнир представляет собой серию зачетных игр. Каждая игра проводится с разными прогнозами и оценивается по рейтинговому принципу: две команды с наименьшим итоговым счетом получают 0 баллов, лучшая команда — 100 баллов, остальные — количество процентов, пропорциональное между лучшим и вторым худшим результатами. Средний рейтинг по финальным играм составляет итоговый командный балл.
Иными словами, за каждую игру очки, заработанные участниками, переводятся в рейтинговые баллы по формуле:
\[p_i =100\frac{max(m, x_i)-m}{M-m},\]
где \(p_i\) — рейтинговый балл i-й команды; \(x_i\) — очки i-й команды за игру; \(M\) — наилучший из всех команд результат за игру; \(m\) — второй с конца результат за игру.
Итоговый командный балл состоит среднего арифметического рейтинговых баллов за три зачетные игры: \[\begin{gather} \text{Итоговый балл} = \frac {1}{3} \times ~\text{рейтинг 1-й игры} + \frac {1}{3} \times ~\text{рейтинг 2-й игры} +\\+ \frac {1}{3} \times ~\text{рейтинг третьей игры}. \end{gather}\]
Итоговый командный балл составляет 60% итогового индивидуального балла участника заключительного этапа. Максимально возможный индивидуальный балл участника заключительного этапа составляет 100 баллов.
Команда-победитель — это команда, набравшая наибольший итоговый командный балл.
В ходе выполнения финальной задачи оценивается комплексное решение финальной задачи профиля. Выделение и формулирование подзадачи является частью интегральной (главной) задачи профиля. Проверкой решения подзадачи является ее вклад в результат игры. Описанные ниже задачи выделены разработчиками и известны участникам из описания. Распределение усилий между подзадачами принимают сами команды.
Задачи из физики присутствовали, однако их физическая составляющая была сведена к минимуму, а физические модели были тривиальными.
Эта задача возникает на пятом этапе игры, при моделировании энергосистемы. Вырабатываемая мощность солнечных батарей зависит от напряжения на солнечных панелях модели солнечной электростанции на стенде. Напряжение на солнечных панелях по отношению к яркости светильников, строго говоря, нелинейно. Однако характеристики солнечных панелей, измеряющих цепей и светильников подобраны так, что отклонение реальных значений от линейной их аппроксимации составляет не более 2%. В дальнейшем они калибруются до полной линейности внутренним ПО солнечных батарей.
Время релаксации измерительной системы солнечных батарей в два раза меньше минимального интервала между изменением яркости и измерением вырабатываемой мощности, поэтому генерация солнечных батарей зависит только от погоды на текущем такте игры.
В соревнованиях текущего года зависимость генерации от фактической яркости освещения составила определяется по формуле: \[P(L) = max(0; 0{,}91L + 2{,}81).\]
Коридор отклонений модели от фактических данных (от \(-0{,}2\) до \(+0{,}3\)) составляет менее, чем заложенное в модель случайное отклонение фактических значений яркости освещения от прогнозных (от \(-0{,}5\) до \(+0{,}5\)).
В условиях задачи этого года, когда светильники светят асинхронно (со сдвигом на шесть тактов, но их прогнозы отличаются), у солнечной батареи нет однозначно наилучшего положения и угла наклона.
Расположение СЭС позволяет сдвигать график генерации СЭС, что может компенсировать уменьшение ее общей выработки. В частности, выгодно смещение СЭС к западу, чтобы пик выработки сместился ближе к вечернему пику потребителей третьей категории (и более высокому уровню цен на бирже).
Помимо этого, может быть выгодным разведение используемых СЭС на восток и запад для уменьшения пиковой генерации и, следовательно, уменьшения потерь. Использование киберСЭС позволяет регулировать получаемую генерацию в течение суточного цикла.
В целом, оптимальный выбор решения этой подзадачи зависит от решения остальных подзадач, а также составленной энергосистемы. При этом всегда остается доступным консервативный вариант по максимизации общей выработки энергии.
Эта задача возникает на пятом этапе игры, при моделировании энергосистемы. Команда должна иметь решение этой задачи для эффективной работы на этапах №№ 1–3 при проектировании энергосистемы и при участии в аукционе.
Задача вычисления генерации ветровых электростанций по данным погоды похожа на такую же задачу для солнечных батарей, но является более сложной.
Для получения величины генерации используется скорость вращения анемометра, который установлен на модели ветровой электростанции. Устройство анемометра — вертикально-осевой; его лопасти устроены так, что скорость вращения линейно пропорциональна скорости ветра (если считать поток ветра гомогенным). В случае постоянной негомогенности ветрового потока (когда анемометр не перемещается) скорость вращения анемометра также линейна по отношению к максимальной скорости ветра в потоке.
Измерительная система — инерциальная система вращения с трением. Ее параметры нужно вычислять по данным прошедших игр. Время полной остановки анемометра с максимальной скорости вращения составляет около 5 тактов игры (оно зависит от максимальной скорости ветра в месте расположения анемометра). Время полного разгона аналогично составляет 2 такта игры.
Генерируемая мощность пропорциональна кубу скорости вращения анемометра. При достижении максимального уровня генерации (20 МВт) мощность далее не растет, но при увеличении скорости вращения еще на 30% ветряк уходит в штормовой режим и генерирует 0 до тех пор, пока скорость вращения не уменьшится.
Зависимость генерации от скорости ветра можно оценить большим числом способов на основании данных прошедших игр. Можно как построить собственную модель для каждого ветряка, так и создать общую для всех, со свободным параметром для калибровки модели под каждый конкретный ветряк.
Например, при построении единой модели как линейной комбинации от скорости ветра за пять последних тактов зависимость будет такой: \[P(w_0,w_{-1},w_{-2},w_{-3},w_{-4}) = k\frac{(0{,}987w_0 + 0{,}332w_{-1} + 0{,}154w_{-2} + 0{,}099w_{-3} + 0{,}051w_{-4})^3}{1008},\] где \(w_{-n}\) — скорость ветра \(n\) тактов назад, а коэффициент \(k(0;1]\) подбирается для каждого ветряка индивидуально по прошлым данным (знаменатель дроби подобран так, чтобы для наилучшего ветряка коэффициент \(k\) составлял единицу).
При вычислениях необходимо учитывать тот факт, что генерация ветровых электростанций ограничена правилами на уровне 20 МВт. Поэтому если прогнозируемая генерация превышает предельный уровень, то надо считать, что спрогнозировано именно на уровне предела.
Средняя величина ошибки такого набора коэффициентов между прогнозируемой и реальной генерацией на играх финала составила 5,9%, что, с одной стороны, связано с большой инерционностью физического анемометра. С другой стороны, из-за кубической зависимости генерации от силы ветра любые погрешности в средней части диапазона скоростей ветра очень сильно влияют на прогнозируемую мощность. Если скорость ветра мала или велика, погрешности влияют очень слабо.
Эта задача возникает на четвертом этапе игры, при сборке сети, или даже на этапах №№ 1–3, если участники системно подходят к задачам проектирования энергосистемы. В ней имеющиеся объекты нужно распределить по энергосистеме с использованием подстанций, дополнительных модулей и с учетом ограничений правил.
Цель проектирования сложна и зависит от участников. Ее возможные компоненты:
- Минимизация суммарных потерь (и связанных с ними штрафов).
- Минимизация стоимости обслуживания инфраструктуры.
- Максимизация доходов от потребителей.
- Минимизация убытков от регулярных ремонтов ЛЭП.
- Накопление энергии с целью продажи в период высоких цен на внешней бирже.
- Набор экологических баллов для получения большей доли банка экологических налогов.
- Злоупотребление механикой начисления экологических баллов за использование накопителей путем циклического перекачивания энергии между ними.
- Минимизация потерь через активное маневрирование мощностью при помощи ТЭС и накопителей.
- Возможность решить эту задачу быстро для перепроектирования энергосистемы в реальном времени, то есть сразу в течение аукциона по мере закрытия лотов.
Это — одна из интегральных задач стенда, в которой собираются все остальные (вторая такая — аукцион). Для нее существует множество решений, близких к оптимальному. Задача точного поиска глобального экстремума довольно сложна, однако нахождение локального экстремума, который незначительно отличается от глобального, является не только разрешимой, но и используется для калибровки решений, предлагаемых участниками.
Каждая команда справляется с ней тем или иным способом: как через написание экспертной системы для автоматической оптимизации сети, системы прогнозирования и визуализации, так и вручную на листе бумаги.
Это задача, которую очень легко решить удовлетворительно (чтобы была возможность работать с остальными задачами), можно решить хорошо (чтобы получить минимальное преимущество перед другими командами), можно решить полностью, но только в рамках выбранного командой сужения задачи.
Задача возникает на первом и пятом этапах игры, при анализе прогнозов и моделировании энергосистемы.
В течение всей игры командам доступны все данные о прогнозах погоды и действующих контрактах. Из них можно вычислить прогноз дефицита или профицита мощности на каждый такт. Для этого нужно на основании составленных заранее игроками моделей вычислить из прогнозов погоды прогнозы генерации. Из результирующего множества случайных величин (вероятная генерация для каждой электростанции и вероятное потребление для каждого потребителя) нужно вычислить их сумму. Она будет представлять собой распределение вероятностей профицита/дефицита мощности в системе. Важно учитывать, что максимальный дефицит или профицит мощности ограничен главной подстанцией и установленными на ней объектами.
В задаче текущего года, в отличие от прошлых лет, предельная возможная сложность энергосистем намного выше, поэтому приведенное ниже решение достаточно эффективно работает только для достаточно простых систем. В более сложных системах может понадобиться дополнительный учет потерь, который сильно зависит от конфигурации сети. Это приводит к тому, что задача становится значительно более интегрированной в систему поддержки принятия решений, разработка которой необходима для успешной работы, и которая формируется у каждой команды в том или ином виде — программном или таблично-вычислительном.
Каждая энергосистема состоит из набора подстанций и подключенных к ним объектов. Эффективная энергосистема представляет собой граф-дерево, в узлах которого находятся подстанции, а ребра — энергорайоны с множеством подключенных объектов и, что очень важно, двумя узлами подстанций, к которым подключен энергорайон (причем, если энергорайон физически подключен только к одной подстанции, то второй узел виртуален).
По правилам мощность, протекающая через один узел, увеличивает износ линии, тем самым повышая уровень потерь в линии. Это приводит к тому, что необходимо прогнозировать энергобаланс в каждом энергорайоне по отдельности (полностью аналогично нахождению общего баланса) и учитывать складывание токов в энергосистеме при протекании их по дереву.
Задача возникает на первом и пятом этапах игры, при анализе прогнозов и моделировании энергосистемы. Команда должна иметь ее решение для эффективной работы на этапах №№ 2–3 — участии в аукционе.
Далее нужно решить задачу нахождения вероятностного распределения экономических потерь. Это делается почти тривиально при принятии консервативной оценки прибылей и убытков от взаимодействия с внешней энергосистемой: каждый мегаватт непредсказанной избыточной мощности эффективно несет убыток в 1 очко, а каждый мегаватт недостаточной — 2 очка. К этим значениям нужно добавить стоимость электроэнергии, закупленной/проданной во внешней энергосистеме по цене за 1 такт вперед.
Далее математическое ожидание получившейся случайной величины нужно минимизировать, используя параметры направляемой/извлекаемой мощности из аккумуляторов и закупаемой/продаваемой мощности во внешней энергосистеме. Выгоды от торговли с другими командами и ранних закупок во внешней энергосистеме можно учитывать независимо.
Эта задача немного проще, чем кажется, из-за того, что использование аккумуляторов экономически намного выгоднее взаимодействия с внешней энергосистемой, имеет смысл закупать/продавать электроэнергию в ней только в случае невозможности сделать это через аккумулятор. Оба аспекта образуют тандем, который можно обозначить как балансирующее воздействие на энергосистему. Иными словами, сначала решается задача вычисления дисбаланса (для удовлетворительного решения достаточно приблизительного прогноза или даже фактического значения), который балансируется сначала аккумуляторами, после — заявкой на биржу.
Задачу (нахождение балансирующего воздействия, минимизирующего математическое ожидание экономических потерь) недостаточно решить аналитически — алгоритм решения нужно реализовать также в управляющем скрипте (и других вспомогательных программах), что для большинства школьников является нетривиальной и неустойчивой к ошибкам задачей. Немного проще ее решить перебором, перебрав все значения балансирующего воздействия в размахе случайного распределения дефицита/профицита мощности в системе с фиксированным шагом, например, 0,1. Такой точности будет вполне достаточно, и такое решение можно реализовать быстрее, чем точное. Впоследствии, при наличии времени, его можно заменить точным.
В дальнейшем на основании этих данных можно вычислить распределение вероятностей прибыли за всю игру.
Накопители имеют три основные сферы применения:
- Накопление выработанной внутри энергосистемы энергии для более позднего ее использования без взаимодействия с внешней энергосистемой. Это обычно выгодно, поскольку сначала продать энергию вовне, а затем позже ее купить практически всегда ведет к издержкам.
- Уменьшение потоковой мощности на линиях энергосистемы для уменьшения электрических потерь. Зависимость величины потерь от мощности нелинейна и сильно возрастает с увеличением мощности. Потерянную мощность не только нельзя продать, но она обкладывается дополнительными штрафами.
- Смещение взаимодействия с внешней энергосистемой во времени. Цены на ней непостоянны, поэтому способность временно задерживать электроэнергию в системе позволяет продавать ее по более выгодной цене.
Кроме того, за использование накопителей щедро начисляются экологические баллы, что позволяет злоупотреблять ими, перекачивая энергию из одного в другой и, тем самым, получая баллы за один и тот же мегаватт несколько раз.
Задача возникает на втором и третьем этапах игры при участии в аукционе.
Это задача нахождения предельной цены контракта объекта на аукционе — такой цены, приобретение контракта по которой ожидаемо не принесет ни прибылей, ни убытков. Для расширения над задачей нахождения полного экономического баланса энергосистемы достаточно вычислить суммарную прогнозируемую прибыль энергосистемы с этим объектом и без него.
Для электростанций разницу между этими величинами нужно разделить на число тактов в игре. Для потребителей — разделить на суммарное потребление его за всю игру (это случайная величина; для примерной оценки ее можно заменить на математическое ожидание, но предполагается, что команды к этому этапу накопили достаточную экспертизу и опыт вычислений со случайными величинами).
Получившееся число обозначает:
- для электростанций — максимальную осмысленную цену,
- для потребителей — минимальную.
С учетом того, что все объекты одного класса сделаны аналогичными, ее расчет можно сделать и без программирования, средствами электронных таблиц Excel или их аналогов.
В текущем году торги проводятся пакетно: каждый лот содержит по несколько объектов, обычно два–три (лоты с главными подстанциями содержали четыре: одну поворотную СЭС, одного потребителя третьей категории, одну миниподстанцию и собственно главную подстанцию. Такая механика смещает фокус с собственной цены объекта на ценность добавления к энергосистеме группы объектов. Это не меняет фундаментального свойства аукциона — комплиментарности объектов друг другу, вроде убыточности генерации при недостатке потребления, но делает его расчет из важного для победы в необходимый для участия.
Аукцион проводится по системе all-pay: участники платят сделанную ставку, даже если лот они не выиграли. Это также смещает фокус их внимания с произвольного выставления ставок к предварительному составлению стратегии ставок.
Задача возникает на втором и третьем этапах игры при участии в аукционе.
Хотя команды могут найти оптимальную энергосистему для любого набора прогнозов погоды, эту энергосистему им еще нужно собрать, обыгрывая конкурентов за каждый необходимый лот на аукционе. Игра в целом относится к рефлексивным. Игры этого класса не имеют устойчивого решения, а использование смешанных стратегий едва ли оправдано на одиночном сеансе.
Участникам нужно анализировать поведение оппонентов, предугадывать их цели и искать способы помешать целям оппонентов, при этом защитив свои. Для этого можно создать несколько вспомогательных инструментов:
- Нахождение эффективных конфигураций энергосистем — не только оптимальной, но всех, которые достаточно хороши. Все команды будут стремиться к какой-то из них, и для любой промежуточной ситуации на аукционе можно предположить, к какой из них будут стремиться оппоненты.
- Нахождение оптимальной ставки на аукционе, исходя из ценности лота для себя и оппонентов. Ценности лота для оппонентов можно оценить из предположения об энергосистеме, к которой они стремятся, с использованием решения задачи расчета прогноза рентабельности. В этих условиях оптимальной ставкой будет максимальная ставка всех оппонентов, при условии, что она не превышает собственной максимальной ставки. Далее участникам будет интересно от этой ставки отклониться, чтобы рискнуть и увеличить выгоду, либо нарушить стратегию оппонентов.
Также в течение всего времени аукциона командам нужно оценивать риск того, что целевую энергосистему составить не удастся и, при необходимости, переходить к альтернативным вариантам.
Эта задача, тривиальная сама по себе, значительно углубляет задачи вычисления экономического баланса энергосистемы и составления стратегии для аукциона.
Механика аукциона устроена следующим разом: те, кто устанавливают цены заявок хоть чуть-чуть хуже для себя, чем их оппоненты, получают преимущество и, потенциально, более выгодную цену. С другой стороны, в случае выставления на биржу дефицитного товара, сбивание цены приведет исключительно к потере очков, без получения иных преимуществ.
Более того, механика устроена таким образом, что не взаимодействовать с ней участники не могут, поэтому эту задачу можно во многом обойти, если спроектировать энергосистему так, что она всегда будет предлагать на биржу дефицитный товар (товар здесь — избыток или недостаток энергии, иначе говоря, генерация или потребление). В целом задача сводится к прогнозированию того, будет на бирже в дефиците спрос или предложение и, в случае размещения недефицитного товара, подстраивания цены под прошлое поведение оппонентов.
В модели текущего года на бирже присутствует предзаполнение автоматическими заявками, которые не принадлежат игрокам и по легенде представляют участников торгов из внешней энергосистемы. Они позволяют смягчить изменение цены при общей несбалансированности энергосистем игроков (энергоизбыточности или энергодефицитности), но требуют учета этих заявок при выборе цены собственной заявки. Эта механика подавляет жадное поведение, одновременно делая механику биржи менее катастрофической для ее полноценных участников.
Задача возникает на пятом этапе игры при моделировании энергосистемы.
Это первая точка сборки решений предметных задач, возникающих в командном туре. Основная задача таких систем — вычисление ценности лота при заданных параметрах энергосистемы.
Минимальный полезный вариант такой системы может быть устроен следующим образом:
- Имеются прогнозы погоды и потребления на следующую игру (будем считать, что реальные значения будут точно соответствовать прогнозам).
- Для каждого такта игры вычисляем генерацию. Например, солнечные батареи вычисляем из яркости солнца с найденным ранее коэффициентом конверсии солнечной энергии в мощность, например, 1 МВт / 284 лк.
- Вычисляем энергобаланс в каждый такт игры.
- Вычисляем изменение счета в каждый такт игры.
- Добавляем в энергосистему интересующий объект.
- Повторяем шаги 1–4.
Сравниваем результаты для энергосистемы при наличии и без наличия интересующего объекта:
- для электростанций оптимальная цена есть их цена плюс разница результатов энергосистем, деленная на число тактов игры;
- для потребителей оптимальная цена есть их цена плюс разница результатов игры, деленная на потребленную потребителем энергию.
Хорошую систему от примитивной могут отличать следующие характеристики:
- Учет погрешностей прогнозов. Расчет наихудшего варианта, наилучшего, наиболее вероятного и других статистических характеристик.
- Расчет стоимости лота для энергосистем оппонентов — чтобы выиграть лот, нужно ставить не собственную цену, а цену, большую, чем у оппонентов. Для этого необходимо оценивать ценность лота для оппонентов.
- Проверка корректности модели и ее параметров путем сравнения фактических ставок оппонентов с предсказанными.
- Прогноз эффективности задуманной энергосистемы.
Важно, что такая система лишь помогает принимать решения, но не гарантирует того, что команда с наилучшей реализацией этой задачи наиболее эффективно проведет аукцион.
Разработанные командами программы варьировались по сложности от простых таблиц Excel до веб-сервисов с элементами машинного обучения.
Это вторая точка сборки предметных задач, возникающих в командном туре. Задача управляющего скрипта — используя возможность управления продажей электроэнергии во внешнюю энергосистему, управления накопителями, прогнозирования генерации, максимизировать число очков, которое получит команда за командный тур.
Неработающий (или работающий плохо) управляющий скрипт значительно ухудшит результаты команды вне зависимости от того, насколько хорошо они сыграли аукцион и проработали предметные задачи командного тура.
Самый простой вариант скрипта может действовать, например, по следующему алгоритму:
- Повернуть киберСЭС на угол, указанный в заранее вычисленной таблице значений.
- Оценить генерацию на следующем такте. Вычислить энергобаланс следующего такта.
- ЕСЛИ энергобаланс положителен, ПЕРЕЙТИ к п. 6.
- Попытаться ликвидировать дефицит из накопителей.
- Ликвидировать дефицит из внешней энергосистемы.
- ЗАВЕРШИТЬ РАБОТУ.
- Попытаться ликвидировать профицит, перенаправив мощность в накопители.
- Ликвидировать профицит, продав мощность во внешнюю энергосистему.
- ЗАВЕРШИТЬ РАБОТУ.
Хороший скрипт может обладать следующими характеристиками:
- Оценки энергобаланса на всю игру вперед и ранняя закупка электроэнергии.
- Коррекция прогнозов генерации на основании реальных данных от электростанций.
- Использование распределения вероятных значений энергобаланса, чтобы вычислять средневзвешенную величину его коррекции: дефицитный энергобаланс обходится дороже профицитного, соответственно, нужно минимизировать не модуль энергобаланса, а математическое ожидание экономических потерь в результате ошибок прогнозов.
- Коррекция заложенных в модель параметров генерации СЭС и ВЭС с учетом наблюдаемых значений генерации.
- Такое управление накопителями, которое полностью разряжает их к последнему такту игры.
- Такое управление накопителями, которое злоупотребляет начислением экологических баллов, при этом продолжая нормальное использование накопления.
- Моделирование состояния энергосистем оппонентов для предсказания будущих состояний биржи.
- Вычисление графика отключений, минимизирующего штрафы за отключение потребителей и исключающие отключения ТЭС и заводов.
- Предсказание графиков отключений оппонентов и влияние их на наполнение биржи заявками.
- Уточнение моделей энергосистем оппонентов на основании реального состояния биржи.
- Управление риском: в ряде случаев осмысленно использование неоптимальных характеристик управления, которые несмотря на то, что они снижают математическое ожидание счета в командном этапе, увеличивают вероятность обойти другую команду.
Курсы от разработчиков профиля:
- Курс «Интеллектуальные энергетические системы»: https://onti.polyus-nt.ru/course/view.php?id=2.
- Курс «Тематические разборы задач профиля ИЭС»: https://onti.polyus-nt.ru/course/view.php?id=4.
- Курс «Разбор задач второго этапа профиля ИЭС НТО 24/25»: https://onti.polyus-nt.ru/course/view.php?id=24.
Материалы, подобранные по темам задач:
- Курс «Теория игр» от Школа «Интеллектуал» и проекта «Дети и наука»: https://childrenscience.ru/courses/math_games/.
- Курс МФТИ «Теория игр»: https://courses.mipt.ru/course/view/83.
- Курс «Теория вероятностей — наука о случайности»: https://stepik.org/course/2911/promo.
- Книга «Вероятность: примеры и задачи», автор А. Шень: https://old.mccme.ru//free-books//shen/shen-probability.pdf.
- Курс Андрея Райгородского «Теория вероятностей», плейлист: https://www.youtube.com/playlist?list=PLthfp5exSWEr8tRK-Yf-i9aXgcFJ-O16d.
- Курс «Основы теории графов»: https://stepik.org/course/126/promo.
- Курс «Основы дискретной математики»: https://stepik.org/course/1127/promo.
- Статья «Численные методы решения нелинейных уравнений»: https://prog-cpp.ru/digital-find/.
- Книга «Код: тайный язык информатики», автор Чарльз Петцольд: https://www.livelib.ru/book/1000005181-kod-tajnyj-yazyk-informatiki-charlz-pettsold.
- Курс «Программирование на Python»: https://stepik.org/course/67/syllabus.
- Курс «Программирование на Python для решения олимпиадных задач»: https://stepik.org/course/66634/promo.
- Курс «Python: основы и применение»: https://stepik.org/course/512/promo.
- Курс «Основы машинного обучения»: https://openedu.ru/course/hse/INTRML/.
- Курс «Python для извлечения и обработки данных»: https://openedu.ru/course/hse/PYTHON/.
Стенд-тренажер «ИЭС» 2024–25 года состоит из следующих основных частей:
- Модельная поверхность, на которой располагаются модели объектов энергосистемы: электростанций, потребителей и объектов энергетической инфраструктуры.
- Терминалы управления энергосистемой. Это персональные компьютеры, объединенные со стендом в единую информационную сеть. Каждая команда работает со своим терминалом.
- Модели объектов энергосистемы — небольшие стереотипные архитектурные модели, содержащие в себе необходимую управляющую электронику и измерительные системы.
- Светильники, моделирующие солнечное освещение. Они способны создавать освещенность в центре стола до 5 клк.
- Мощные вентиляторы, моделирующие ветровые условия, которые могут создавать ветер со скоростью до 8 м/с на расстоянии не менее 1 м от плоскости вращения.
- Управляющая электроника стенда. Эта часть скрыта от участников и, с их точки зрения, не несет функциональной нагрузки.
На рис. 8.3 показан интерфейс моделирования. Внизу находятся графики энергетического и экономического баланса, вверху — состав энергосистемы, слева — графики прогнозов погоды и потребления, справа — принятые приказы и итоговый счет. Остальные поля являются вспомогательными.
На рис. 8.4 показан интерфейс скрипта. Слева находится справка, в центре-слева редактор скрипта, в центре-справа загруженный скрипт, справа — стандартный вывод и вывод ошибок скрипта.
Члены команды проектируют энергосистему в конкуренции с другими командами. Кто каких потребителей себе подключит и какие электростанции установит, решается через аукцион. На аукционе разыгрываются наборы объектов с фиксированным тарифами, и торг идет на повышение по принципу all-pay (все ставки вычитаются из бюджета и соответственно из результата игры соответствующей команды).
После аукциона участники проектируют сеть, решают задачу оптимизации потерь в энергосистеме и увеличения ее надежности тем, как происходит подключение объектов. Здесь инструменты — подстанции и миниподстанции.
Затем проводится моделирование энергосистемы, в результате которого определяется то, сколько денег она принесет — это и есть счет команды. В этом этапе также участвует скрипт, который реагирует на происходящее в энергосистеме и предпринимает корректировки.
Обратите внимание, что один только скрипт игру точно не выиграет, но без хорошего скрипта за победу бороться трудно.
Энергосистема команды и энергосистемы конкурентов объединены через внешнюю энергосистему — гарантирующего поставщика. Ему и через него можно продавать (или покупать) энергию, в случае дисбаланса в энергосистеме.
Рекомендации не являются инструкцией. Задачу можно решать и по-другому, они приведены для того, чтобы участникам было, с чего начать. Скорее всего, все команды будут решать задачу иначе, но отличия от данных рекомендаций у всех будут разные.
Важное свойство поставленной задачи — она не решается без серьезной подготовки. Более того, ее крайне сложно решить полностью за имеющееся время (но команде достаточно решить ее лучше оппонентов), поэтому крайне важным становится распределение усилий. Допустим, что задача состоит их трех подзадач; команда, решившая каждую на 50%, 50% и 50% выиграет у команды, решившей на 100%, 100% и 0%, со значительным отрывом.
Далее участникам предлагаются рекомендации по этапам игры (еще раз повторим, что это рекомендации, а не предписания!):
- Анализ прогнозов и определение стратегий. Важно определить, на каком фронте состязания команда будет превращать преимущество перед оппонентами в лидировании в результатах. Как именно она станет это выполнять — дело ее членов, но без программирования и электронных таблиц вряд ли можно обойтись.
- Аукцион. Он требует, исходя из выбранной стратегии, знания ценности для каждого из торгуемых объектов. Кроме того, он требует дисциплины в команде. Если участники будут отвлекаться на споры и решение технических вопросов, то в ставках, скорее всего, станут ошибаться.
- Проектирование сети. Проект, скорее всего, будет составлен еще при составлении стратегии, но результаты аукционов могут заставить внести в него правки. Сеть члены команды собирают физически на столе вокруг своей главной подстанции.
- Загрузка скрипта. Скрипт команды должен быть написан и проверен заранее (но понятно, что тестовые игры нужны именно для тестирования), внести в него исправления на ходу вряд ли получится безошибочно. Поэтому настоятельно рекомендуем перед зачетными играми не вносить в скрипт никаких изменений, насколько бы тривиальными и простыми они ни казались.
- Анализ и обсуждение результатов внутри команды, поиск гипотез и составление планов их проверки. Это самый важный этап задачи, и победа будет зависеть от него.
Прогнозы составляются для солнца, ветра и каждого типа потребителей.
Прогноз выдается на каждый такт (48 тактов — одни сутки). Для каждого такта он состоит из единственного числа — центра коридора, в который попадет реальное значение прогнозируемой величины. Размеры коридоров приведены в таблице 1.1.
Значение в 5,2 с коридором в 0,5 означает, что реальное значение будет лежать в интервале от 4,95 до 5,45.
У каждого типа объектов прогнозы свои, и все объекты одного типа полностью идентичны и в прогнозах, и в реальных значениях.
Прогнозы для ветра ведут себя немного иначе, чем остальные. Они отдельны для каждого вентилятора, при этом они похожи, хоть и не одинаковы.
Потребители делятся на три типа:
- заводы,
- дома,
- офисные центры.
Они отличаются потреблением и паттернами потребления.
Если ТЭС или завод подключены обоими входами, то их переток мощности распределяется равномерно по обоим входам. Если произошло отключение по одной из линий подключения, то объект запитывается от второй и его нагрузка полностью ложится на нее.
Каждый потребитель имеет тариф — цену, которую он платит за каждый МВт \(\times\) \(\times\) такт поставляемой ему мощности. Чем тариф больше, тем потребитель выгоднее.
За полное отключение потребителей предусмотрены штрафы.
Первые пять5 отключений объекта третьей категории (дома и офисные центры) не штрафуются. Каждое следующее штрафуется в размере 36 руб. за 1 МВт мощности, которую объект потребил бы на том такте, в котором он находился в отключенном состоянии.
Каждое отключение объекта второй категории (заводы) штрафуется в размере 57 руб. за 1 МВт непотребленной мощности.
Существуют электростанции трех типов:
- тепловые,
- ветровые,
- кибернетические солнечные (киберСЭС).
Ветровые и киберСЭС — это реальные физические измерительные системы, и их расположение на стенде очень важно. Тариф электростанции — это цена, которую нужно платить каждый такт за ее обслуживание. Чем он меньше, тем электростанция выгоднее.
Генерируемая ветряками мощность пропорциональна кубу скорости ветра (точнее, частоте их вращения, что не одно и то же). Есть предельная скорость их вращения8 (около 8 об./с), при достижении которой ветряк отключается и уходит в «штормовую защиту», из которой выходит только при снижении его скорости до 87,5% от этой скорости9. Кроме того, максимум генерации достигается при 86%10 от предельной скорости и далее не растет до самого отключения. Обратите внимание, что скорость вращения ветряка при одном и том же ветре очень сильно зависит от его расположения. Максимальная мощность ВЭС — 20 МВт11.
Физическая инерция ветряков весьма велика и может составлять до 30 с (это не программируемое значение, а физическое). Более точные данные участникам нужно получить самим.
Это солнечные панели, которые могут изменять угол наклона по командам от управляющего скрипта.
Диапазон их наклона составляет около 100°, участники могут устанавливать наклон с градацией в 125 руб., от 0 до 124 включительно. Значению 0 соответствует предельный наклон назад (от разъемов), 124 — предельный наклон вперед (к разъемам). Скриптом участники отдают команду на установку определенного положения, а далее СЭС сама поворачивается к этому углу.
Скорость вращения киберСЭС ограничена и не слишком велика, поэтому если дать команду для изменения угла на большое значение, то поворот может занять более одного такта игры. Впрочем, она гарантированно успевает повернуться на 20 единиц.
Максимальная мощность киберСЭС — 25 МВт12.
Тепловая электростанция проще, чем СЭС и ВЭС в том, что она не имеет физической модели, однако это не обязательно означает, что с нею легче управляться.
На каждом такте ей нужно указывать, какой объем топлива следует сжигать. За топливо команда платит отдельно, сверх ее собственного тарифа. 1 единица топлива превратится в 1 МВт мощности с учетом КПД и с добавлением инерции: к выработке сжиганием топлива добавится часть мощности, выработанной на предыдущем такте. Точнее, 60%13 от предыдущей мощности, уменьшенной на 0,514 МВт.
Единица топлива стоит 0,5 руб15. При КПД в 100% ТЭС перерабатывала бы 1 единицу топлива в 1,2 МВт \(\times\) такт за первый такт16, однако ее КПД не только не идеален, но и не линеен. Он представляет собой параболу, максимум которой в 45%17 достигается при сжигании 12 единиц топлива18, а при сжигании 0 единиц топлива КПД составляет всего 20%19. Предельный объем сжигаемого ТЭС топлива — 20 единиц20.
Например, на прошлом такте ТЭС вырабатывала 10 МВт, на текущем ей указано сжечь 12 единиц топлива. Мощность на текущем такте составит: \(12 \cdot 0{,}45 + 0{,}6 \cdot ( 10 - 0{,}5 ) = 5{,}4 + 5{,}7 = 11{,}1\) МВт.
ТЭС имеют две точки подключения. Как и у заводов, если обе они активны, то мощность между ними распределяется поровну.
Накопители разыгрываются на аукционе наравне с потребителями и электростанциями. Тарифицируются они так же, как электростанции — фиксированная плата за каждый такт.
Емкость накопителя составляет 80 МВт \(\times\) такт21, предельная скорость заряда — 1522 МВт \(\times\) такт, разряда — 2023 МВт \(\times\) такт. Зарядом и разрядом накопителей управляет скрипт.
Кроме того, накопители имеют потери. Каждый такт накопитель теряет 5%24 содержащейся в нем энергии.
Сеть строится вокруг главной подстанции — ее обязательно нужно приобрести на аукционе. Какую именно — нужно решать на основании прогнозов, собственной стратегии команды и стратегии оппонентов. Не приобрести ее нельзя — тогда команда не сможет играть. Поэтому если по завершении аукциона участники окажутся без подстанции, пакет с ней будет выдан случайным образом среди неразыгранных на площадке.
Во время аукциона можно приобрести только одну подстанцию с пакетом объектов, пакеты с другими подстанциями после этого будут недоступны во время аукциона.
Сеть энергосистемы строится при помощи подстанций — главных и миниподстанций А (с тремя выходами). Главные подстанции и миниподстанции разыгрываются на аукционе. Если команда приобрела миниподстанцию, то обязана ее установить.
Миниподстанции должны быть подключены входом в сторону главной подстанции.
От любого объекта должно быть можно пройти по проводу до главной подстанции, иначе до него по-настоящему не дойдет электричество.
Кольца и острова в энергосистеме создавать недопустимо, поэтому топология энергосистемы — дерево. Энергосистема ветками (выходами и входами) подстанций разбивается на энергорайоны, внутри которых находятся потребители или электростанции. Энергорайон — это область «от подстанции до подстанции».
Электростанции и потребителей подключать в один энергорайон нельзя, они должны быть разделены подстанциями.
Ветряки и солнечные электростанции устанавливаются в порядке их адресов независимо от порядка покупки. «КиберСЭС по умолчанию» (в пакете с главной подстанцией) устанавливаются после киберСЭС, купленных в остальных пакетах.
Если объект выигран, но не подключен, или подключен другой командой, то это такая же ошибка монтажа сети, как и смешение генераторов и потребителей в одном энергорайоне. В этом случае игра не начинается. Исключения из этого правила возможны только в случае тренировок, если все затронутые команды согласны продолжить без исправления ошибки с целью сэкономить время. На зачетных играх это запрещено.
В случае, если энергосистема не сбалансирована полностью (а так будет практически всегда), недостаток или избыток мощности ликвидируется через внешнюю по отношению к игроку энергосистему. Есть два способа это сделать:
- Заранее подать заявку на продажу или покупку нужной мощности. Через один ход (не на следующий!) заявка попадет в «биржевой стакан» (про него чуть ниже) и превратится в мощность и деньги.
Ничего не делать. Тогда дисбаланс будет ликвидирован на рынке мгновенной мощности, цены на котором отличаются в менее выгодную сторону:
Биржевой стакан устроен просто. Сначала все заявки делятся на два списка (на покупку и на продажу) и сортируются по невыгодности для своих отправителей. Затем заявки из этих двух списков сочетаются друг с другом, превращаясь в транзакции, начиная с самых невыгодных; цена сделки — средняя от цен заявок. Если мощности в заявках не совпадают, то неудовлетворенная часть большей заявки переходит дальше. Если заявки одного из типов закончились, то оставшиеся будут удовлетворены по фиксированным ценам:
В случае, если цена предложенной заявки выходит из этого диапазона, она будет скорректирована.
На бирже, в случае заключения сделки, между игроками действует комиссия: цена для покупателя поднимается на 10 коп.29 от вычисленной, а цена для продавца — опускается. Пример приведен в таблице 1.2.
| Заявки на покупку | Заявки на продажу |
|---|---|
| Заявка 1: 5 по 3,5 | Заявка 3: 3 по 2,5 |
| Заявка 2: 2 по 2,5 | Заявка 4: 3 по 3 |
Встречаются заявки 1 и 3, заявка 3 удовлетворена полностью, а заявка 1 — частично (таблица 1.3).
| Заявки на покупку | Заявки на продажу |
|---|---|
| Сделка 1.1-3: 3 по 3 (для покупателя 3 по 3,1, для продавца 3 по 2,9) | |
| Заявка 1.2: 2 по 3,5 | Заявка 4: 3 по 3 |
| Заявка 2: 2 по 2,5 | |
Встречаются оставшаяся часть заявки 1 и заявка 4, которая удовлетворяется частично (таблица 1.4).
| Заявки на покупку | Заявки на продажу |
|---|---|
| Сделка 1.1-3: 3 по 3 (для покупателя 3 по 3,1, для продавца 3 по 2,9) | |
| Сделка 1.2-4.1: 2 по 3,25 (для покупателя 3 по 3,35, для продавца 3 по 3,15) | |
| Заявка 2: 2 по 2,5 | Заявка 4.2: 1 по 3 |
Встречаются заявки 2 и остаток заявки 4. Заявка 2 удовлетворена частично (таблица 1.5).
| Заявки на покупку | Заявки на продажу |
|---|---|
| Сделка 1.1-3: 3 по 3 (для покупателя 3 по 3,1, для продавца 3 по 2,9) | |
| Сделка 1.2-4.1: 2 по 3,25 (для покупателя 3 по 3,35, для продавца 3 по 3,15) | |
| Сделка 2.1-4.2: 1 по 2,75 (для покупателя 1 по 2,85, для продавца 1 по 2,65) | |
| Заявка 2.2: 1 по 2,5 | |
Для остатка заявки 2 не осталось встречных заявок. Она удовлетворяется из сети (допустим, ее цена — 5) (таблица 1.6).
| Заявки на покупку | Заявки на продажу |
|---|---|
| Сделка 1.1-3: 3 по 3 (для покупателя 3 по 3,1, для продавца 3 по 2,9) | |
| Сделка 1.2-4.1: 2 по 3,25 (для покупателя 3 по 3,35, для продавца 3 по 3,15) | |
| Сделка 2.1-4.2: 1 по 2,75 (для покупателя 1 по 2,85, для продавца 1 по 2,65) | |
| Сделка 2.2-Сеть: 1 по 10 | |
В стакане, кроме заявок игроков, всегда содержатся также предзаданные заявки, представляющие прочих участников энергобиржи. Таких заявок 10130 на продажу и столько же — на покупку. Их цены равномерно распределены от константы exchangeExternalBuy до exchangeExternalSell (обе цены включены: заявки с этими ценами есть в наличии). Объем каждой заявки — 5 МВт31.
В нашей энергетике действует экономическое давление, направленное на модернизацию оборудования и повышение общей эффективности энергосистем. За использование ТЭС, снабжение заводов и потери на линиях с игроков взимается налог:
- Заводы — 1 руб. за МВт \(\times\) такт потребления32.
- ТЭС — 1,5 руб. за единицу использованного топлива33.
- Потери — 2 руб. за каждый потерянный МВт \(\times\) такт34.
Собранные штрафы накапливаются в специальном «бюджете», который в конце игры распределяется между игроками пропорционально набранным ими «экологическим баллам».
Баллы можно получать:
- за получение энергии от ВЭС: 2 балла за выработанный МВт \(\times\) такт35;
- за получение энергии от киберСЭС: 3 балла за выработанный МВт \(\times\) такт36;
- за изъятие энергии их накопителей: 1 балл за извлеченный МВт \(\times\) такт37.
Кроме того, на начало игры в банке уже находится 10 000 руб.38 и 10039 «судейских» баллов.
В энергосистеме есть потери, и они могут быть значительными. Для простоты вычисляются на выходах подстанций по формуле:
\[r_p(p) = \left(\frac{p}{A}\right)^B\cdot C,\] где \(A = 50\)40; \(B = 1{,}65\)41; \(C = 0{,}3\)42.
Эти потери растут с нуля при нагрузке на энергорайон в 0 МВт до уровня в 30%43 при 50 МВт44 (после чего не растут). Это значит, что если на линии есть генерация в 30 МВт, то потери от нагрузки составят
\[30 \cdot 12{,}9 = 3{,}87~\text{~МВт~(значения~округлены~до~сотых)},\] и реальная нагрузка на линию (и количество энергии, которое из нее выйдет) будет 26,13 МВт.
Если же на линии есть потребление в 20 МВт, то потери составят
\[20 \cdot 6{,}6~=~1{,}32 ~\text{МВт},\] и реальная нагрузка (сколько в нее нужно закачать, чтобы удовлетворить потребителей) будет 21,32 МВт.
Во время работы ЛЭП изнашиваются, и их нужно выводить в ремонт для восстановления. За 1 такт каждая ЛЭП накапливает 1 единицу «усталости», а в случае, если ЛЭП перегружена (нагрузка на ней превышает 40 МВт45), то 2 единицы. При накоплении «усталости» более 14 единиц46 ЛЭП автоматически отключается. Любая отключенная ветка на следующем такте автоматически включится, вмешательство скрипта для этого не нужно.
ЛЭП можно выключить в любой момент и самостоятельно, послав скриптом соответствующую команду.
После включения ЛЭП вся накопленная «усталость» сбрасывается до нуля.
Скрипты пишутся на языке Python 3. Они загружаются в систему через вкладку «Скрипты» пользовательского интерфейса. Загруженный скрипт может находиться в системе продолжительное время, и его можно в любой момент заменить. Внутри он выполняется один раз каждый такт игры. Он видит те же данные, что и участники в интерфейсе анализа, но в отличие от них, может на них реагировать, отправляя управляющие воздействия — приказы. Их немного:
- Произвести включение/отключение энергорайона. Обратите внимание, что отключение энергорайона отключает и все зависимые от него, но включение — нет, и включать нужно будет все по отдельности.
- Отправить заявку на покупку или продажу энергии на бирже. Мощность ограничена 60 МВт47, а цена — вилкой цен гарантирующего поставщика. Подробнее см. главу «Биржа».
- Зарядить или разрядить накопитель на некоторый объем мегаватт в доступных пределах, см. раздел «Накопители».
- Установить угол поворота КиберСЭС. Целое число от 0 до 124.
- Сжечь некоторый объем топлива в ТЭС.
Подробнее о том, как с помощью скрипта получать данные об энергосистеме, смотрите в справке скрипта (она есть в интерфейсе и будет доступна отдельно).
В случае, если было отправлено несколько приказов для одного и того же объекта, действовать будет последний. Исключение составляют приказы для ТЭС — они складываются; повторным приказом можно только увеличить выработку ТЭС, но не уменьшить.
Аукцион проходит по закрытой системе, как тендеры. Участники делают ставки в течение заданного отрезка времени, после чего система подводит итог.
В отличие от прошлых лет, на аукционе разыгрываются пакеты объектов с заранее установленными тарифами (для потребителей — цена за 1 МВт \(\times\) такт потребленной энергии, для остальных объектов — арендная плата за каждый такт).
Ставки на пакеты делаются на повышение по правилам all-pay (платят все), а именно, в виде фиксированных сумм, которые участники готовы заплатить, чтобы пакет лотов достался именно им, но выплачивают свои ставки, даже если они не выиграли лот.
На аукционе действует механика догоняющих ставок: если есть хоть одна ставка, которая отличается от лидирующей хотя бы на 548, то объявляется повторный тур аукциона для владельца лидирующей и догоняющих ставок. При этом ставка all-pay на повторном туре выплачивается отдельно от предыдущей. Если на лот никто не выставил ставку, он исключается из игры.
В конце аукциона можно сбросить один49 лот. Они выставляются на второй круг аукциона, где участвовать в борьбе за них будут те же команды, что и в первом круге, минус команды, их сбросившие.
На аукционе разыгрывается параллельно по три лота, поэтому нужно очень аккуратно налаживать протоколы коммуникации и выставления ставок на аукционе, иначе темп работы команды может оказаться ниже темпа аукциона.
Это количественный состав объектов, разыгрываемых на аукционе. Здесь не приводится, в каком порядке они объединяются в пакеты. Обратите внимание: в локальные включены объекты, идущие в одном пакете с главными подстанциями.
Стартовые объекты — выдаются командам по умолчанию.
Локальные объекты — торгуются только в пределах площадки.
Глобальные объекты — торгуются между обеими площадками.
| Локальные | Глобальные | Всего в игре | Максимум на площадке | Минимум на площадке | |
|---|---|---|---|---|---|
| КиберСЭС | 8 | 15 | 31 | 23 | 8 |
| ВЭС | 5 | 4 | 14 | 9 | 5 |
| ТЭС | 3 | 7 | 13 | 10 | 3 |
| Накопители | 5 | 10 | 20 | 15 | 5 |
| Подстанции | 6 | 0 | 12 | 6 | 6 |
| Миниподстанции | 8 | 12 | 28 | 20 | 8 |
| Дома | 6 | 8 | 20 | 14 | 6 |
| Офисы | 4 | 8 | 16 | 12 | 4 |
| Заводы | 2 | 7 | 11 | 9 | 2 |
Порядок установки объектов важен только для КиберСЭС и ВЭС.
Приоритеты:
- Глобальные КиберСЭС.
- Глобальные ВЭС.
- Локальные ВЭС.
- Локальные КиберСЭС.
Внутри одной группы более высокий приоритет имеет объект с меньшим номером (они торгуются на аукционе раньше). На экране аукциона глобальные объекты имеют номера синего цвета, локальные — красного.
Скрипт пишется на языке Python версии 3.10.
Скрипт выполняется не из файла (без записи на диск). Из-за этого:
- технически текст скрипта не может занимать больше 128 Кб, иначе он не запустится;
- исключения не выдают текст строки, а лишь ее номер.
Сам скрипт выполняется из директории ~/ips3-sandbox, и команды могут читать и записывать файлы в эту директорию. Не забудьте сохранить нужные вам файлы в конце рабочей сессии!
import ips # 1
psm = ips.init() # 2
# ... здесь ваш код ...
psm.save_and_exit() # 3
# команда 3 завершает скрипт,
# после неё приказы не выполнятся
- Импорт библиотеки API стенда.
- Запрос на сервер и создание объекта с данными активного хода.
- Отправка сформированных приказов на сервер и завершение скрипта. Без этой команды скрипт бесполезен.
Каждый такт скрипт получает данные из энергосистемы, и они размещаются в соответствующих полях объекта psm.
Объекты помещены в поле objects и представляют собой список объектов, хранящих данные соответствующего объекта.
for obj in psm.objects:
print("== Объект:", obj.id, "==") # (тип, номер)
print("Тип: ", obj.type) # str, см. ниже
print("Включен:", obj.power.now.online) # bool
print("Тариф:", obj.contract) # float
print("Адрес:", obj.address) # [str]
print("Энергорайоны:",
obj.path) # [ <адрес энергорайона> ]
print("Доход:",
obj.score.now.income) # float
print("Расход:",
obj.score.now.loss) # float
print("Доход за первый ход:",
obj.score.then[0].income)
print("Расход за 5ый ход:",
obj.score.then[4].loss) # float
print("Генерация:",
obj.power.now.generated) # float
print("Потребление:",
obj.power.now.consumed) # float
print("Потребление за первый ход:",
obj.power.then[0].consumed)
print("Заряд (актуально для накопителя):",
obj.charge.now) # float
print("Штормовой режим (актуально для ВЭС):",
obj.failed) # bool
print("Установленный угол (актуально для КСЭС):",
obj.angle.now.current) # аналогично power
print("Количество тактов с отключениями:",
obj.offlineCount) # int
# обозначения типов объектов
obj_types = [
"main" # подстанции
"miniA", # мини-подстанции А
"miniB", # мини-подстанции Б
"houseA", # дом А
"houseB", # дом Б (офисный центр)
"factory", # заводы
"storage", # накопители
"wind", # ветровые электростанции
"solar", # солнечные электростанции
"solarRobot", # кибер-СЭС
"tps", # ТЭС
]
Энергорайоны помещены в поле networks и представляют собой словарь, где ключи — индексы (нумеруются с 1!), а значения — структуры, хранящие в себе информацию о соответствующих районах (состояние, показатели).
for index, net in psm.networks.items():
print("== Энергорайон", index, "==")
print("Адрес:", net.location)
# [ (ID подстанции, № линии) ]
print("Включен:", net.online) # bool
print("Генерация:", net.upflow) # float
print("Потребление:", net.downflow) # float
print("Потери:", net.losses) # float
print("Износ:", net.wear) # int
print("Перегрузка:", net.overloaded) # bool
На каждую величину (потребление и погода) дано по несколько прогнозов. Доступ к ним осуществляется через поле forecasts, после чего идет обращение к типу прогнозов и индекс прогноза.
Каждый прогноз является последовательностью медиан, при этом известно максимальное отклонение значения от медианы. Это отклонение общее для всех прогнозов этого типа.
# дом А, 1ый ход
x = psm.forecasts.houseA[0]
# дом Б, 11ый ход
x = psm.forecasts.houseB[10]
# завод, 6ой ход
x = psm.forecasts.factory[5]
# солнце на востоке, район M56, 2ой ход
x = psm.forecasts.sunEast["M56"][1]
# солнце на западе, район M56, 12ый ход
x = psm.forecasts.sunWest["M56"][11]
# ветер, район M12, 3ий ход
x = psm.forecasts.wind["M12"][2]
# максимальное отклонение прогноза для района M34
spr = psm.forecasts.wind["M34"].spread
print("Сила ветра в районе M56:", psm.wind["M56"].now) # float
print("Была на 1 ходу:", psm.wind["M56"].then[0]) # float
print("Текущая яркость солнца на западе в районе M12:",
psm.sunWest["M12"].now) # float
print("Яркость солнца на востоке в районе M12 на 5 ходе:",
psm.sunEast["M12"].then[4]) # float
print("Фактические контракты:")
for receipt in psm.exchange:
print("Контрагент:", receipt.source)
# "exchange" = оператор,
# "fill" = аноним,
# иначе = другой игрок
print("Объём:", receipt.flux)
# Плюс = покупка, минус = продажа
print("Цена за МВт:", receipt.price)
print("")
Игрок представлен словарем с ключами place и player.
# минимальный тариф за энергию
x = psm.exchangeLog[10].min
# максимальный тариф за энергию
x = psm.exchangeLog[10].max
# все примеры для 11-го хода
Эти поля из объекта стенда не связаны с важными данными, но тоже могут пригодиться.
print("Ход:", psm.tick) # int
print("Всего ходов:", psm.gameLength) # int
print("Изменение счёта:", psm.scoreDelta) # float
print("Всего сгенерировано:",
psm.total_power.generated) # float
print("Всего потреблено:",
psm.total_power.consumed) # float
print("Получено с биржи (минус = отправлено):",
psm.total_power.external) # float
print("Всего потерь:",
psm.total_power.losses) # float
Для управления энергосистемой используются управляющие воздействия (приказы). Участники могут объявлять их с помощью функций из psm.orders. При корректном завершении скрипта (psm.save_and_exit()) эти приказы отправляются в систему.
Приоритет приказов:
- Линии — выполняется последний отправленный.
- Угол КСЭС — выполняется последний отправленный.
- ТЭС — выполняется последний отправленный.
- Накопитель — складываются.
- Биржа — выполняются все по отдельности.
Отмена приказов не предусмотрена!
Все числовые параметры в приказах, кроме данных в графике — ненулевые положительные!
# Отправить 10 МВт в накопитель c3
psm.orders.charge("c3", 10)
# Забрать 5 МВт из накопителя c1
psm.orders.discharge("c1", 5)
# Включить линию 2 на подстанции М2
psm.orders.line_on("M2", 2)
# Выключить линию 1 на мини-подстанции m1
psm.orders.line_off("m1", 1)
# Заявка на продажу 10,2 МВт за 2,5 руб./МВт
psm.orders.sell(10.2, 2.5)
# Заявка на покупку 5,5 МВт за 5,1 руб./МВт
psm.orders.buy(5.5, 5.1)
# Выставить угол КСЭС r5 на 75 ед.
psm.orders.robot("r5", 75)
# Сжечь 5 ед. топлива в ТЭС r4
psm.orders.tps("r4", 5)
Для локальной проверки и отладки скрипта можно использовать локальную среду IDLE со встроенным модулем ips.
В модуле реализованы команды:
Для замены
init():init_test()— данные из вшитого примера;from_json(json_str)— данные изJSON-string;from_file(filename)— данные из файла вJSON-формате.
В дополнение к
Powerstand.save_and_exit(без сервера он не выполняется):print(psm.get_user_data())— вывод данных из пользовательских графиков;print(psm.orders.get())— вывод приказов в чистом виде вstdoutбез завершения скрипта;print(psm.orders.humanize())— то же самое, но приказы представлены в читаемом виде.
Пример отладочной версии скрипта и правок для получения оной см. ниже.
import ips
# psm = ips.init() # было
psm = ips.init_test() # стало
# ... здесь ваш код ...
print("\n".join(psm.orders.humanize()))
# графики в приказах не приводятся, но можно так:
print(psm.get_user_data())
# строку можно оставить, отправка в систему
# не производится, только выход из скрипта
psm.save_and_exit()
- Константа конфига
corridorSun. Далее для всех числовых значений будут приводиться названия их констант, значения которых скрипт может извлечь из конфига игры. Рекомендуем в скрипте опираться на них, чтобы уменьшить число «магических чисел».↩︎ - Константа
corridorClass2.↩︎ - Константа
corridorClass3A.↩︎ - Константа
corridorClass3B.↩︎ - Константа
class3FinePardon.↩︎ - Константа
class3Fine.↩︎ - Константа
class2Fine.↩︎ - Константа
windBreakValue— это доля от максимального значения, которое могут выдавать измерительные цепи ветряков.↩︎ - Константы
windRecoveryValue/windBreakValue.↩︎ - Константы
windSummit/windBreakValue.↩︎ - Константа
maxWindPower.↩︎ - Константа
maxRobotPower.↩︎ - Константа
tpsInertia.↩︎ - Константа
tpsInertiaFriction.↩︎ - Константа
tpsFuelCost.↩︎ - Константа
tpsFuelPower. С учетом инерции вместе с последующими тактами будет выработано больше.↩︎ - Константа
tpsEcePeakValue.↩︎ - Константа
tpsEcePeakPower.↩︎ - Константа
tpsEceZeroValue.↩︎ - Константа
tpsMaxPower.↩︎ - Константа
cellCapacity.↩︎ - Константа
cellChargeRate.↩︎ - Константа
cellDischargeRate.↩︎ - Константа
cellLeak.↩︎ - Константа
exchangeExternalInstantSell.↩︎ - Константа
exchangeExternalInstantBuy.↩︎ - Константа
exchangeExternalSell.↩︎ - Константа
exchangeExternalBuy.↩︎ - Константа
exchangeCommission.↩︎ - Константа
exchangeFillAmount.↩︎ - Константа
exchangeFillPower.↩︎ - Константа
green.taxFactory.↩︎ - Константа
green.taxTPS.↩︎ - Константа
green.taxLosses.↩︎ - Константа
green.awardWind.↩︎ - Константа
green.awardSolarRobot.↩︎ - Константа
green.awardStorage.↩︎ - Константа
green.initBank.↩︎ - Константа
green.initPoints.↩︎ - Константа
lossesThreshold.↩︎ - Константа
lossesRate.↩︎ - Константа
lossesLimit.↩︎ - Константа
lossesLimit.↩︎ - Константа
lossesThreshold.↩︎ - Константа
wear.overloadThreshold.↩︎ - Константа
wear.failLimit.↩︎ - Константа
exchangeMaxAmount.↩︎ - Константа
bidDiff.↩︎ - Константа
dropQuantity.↩︎












