Тест с избытком генерации (полный перебор)
python simulator.py tests/test_surplus.json # Windows
python3 simulator.py tests/test_surplus.json # Linux
Тест с дефицитом генерации (полный перебор)
python simulator.py tests/test_deficit.json # Windows
python3 simulator.py tests/test_deficit.json # Linux
С DP алгоритмом
# Windows
python simulator.py tests/test_surplus.json --method dp
python simulator.py tests/test_deficit.json --method dp
# Linux
python3 simulator.py tests/test_surplus.json --method dp
python3 simulator.py tests/test_deficit.json --method dp
Создать и активировать окружение
python -m venv venv
venv\Scripts\activate # Windows
source venv/bin/activate # Linux
Установить зависимости
pip install -r requirements.txt
Запуск streamlit
streamlit run app.py
python 3.14.3
Для версии с интерфейсом/генератором тестов все зависимости находятся в requirements.txt
Симулятор разбивает общую задачу по распределению работы генераторов за день на подзадачи по выбору оптимального набора генераторов для максимально возможного числа потребителей в конкретные часы.
При выборе потребителей используется жадный алгоритм - выбираются потребители с наименьшим потреблением до тех пор, пока суммарный запрос не превысит максимально возможную отдачу всех генераторов в этот час.
При выборе генераторов способом полного перебора ('brute'), перебираются все возможные подмножества генераторов, и выбирается подмножество с наименьшей ценой и достаточной отдачей энергии.
При выборе генераторов методом динамического программирования ('dp') используется подход,
аналогичный задаче о рюкзаке: строится таблица минимальных стоимостей для каждого возможного
объёма выдачи энергии. Поскольку мощности генераторов могут быть дробными, значения
масштабируются умножением на 10 для перевода в целые числа. Метод работает эффективнее
полного перебора при большом числе генераторов - O(n*W) против O(2^n), где n - число
генераторов, W - максимальная суммарная мощность.
При решении задачи не учитывается приоритет потребителей - потребители выбираются от наименьшего потребления к наибольшему.
Задача решается с предположением, что генераторы нельзя включить частично
При решении задачи все часы считаются независимыми друг от друга
Не учитывается стоимость запуска и остановки генератора - предполагается что
включение/выключение бесплатно.
- Поддержка накопителей энергии (батарей) - хранение излишков для использования в часы дефицита
- Учёт стоимости запуска генератора
- Приоритеты потребителей (критические объекты получают энергию первыми)
- Частичная нагрузка генераторов с решением через линейное программирование
Использовал Claude Sonnet 4.6:
- Для генерации тестовых данных (test_surplus.json, test_deficit.json)
- Для поиска алгоритма выбора генератора при большом кол-ве генераторов (DP)
- При разработке интерфейса на Streamlit
- Для отладки багов (например, бесконечный rerun при загрузке файла)
- При доработке README.md файла (например, при описании DP алгоритма) Промпты писал в разговорном стиле на английском языке. При возникновеении проблем, отправлял участок кода и ошибку.
Корректность алгоритмов проверялась вручную - для каждого тестового часа
считался ожидаемый результат и сравнивался с выводом симулятора.
Также была реализована функция test_methods_of_selecting, которая запускает оба
метода (DP и brute) и сравнивает результаты.