Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Симулятор энергосети

Запуск

Запуск в консольном режиме

Тест с избытком генерации (полный перебор)

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) и сравнивает результаты.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages