Pull to refresh

Разработка мультиагентной системы для рынка электроэнергии

Reading time4 min
Views2.3K

Акт 0. Предисловие

Пока я пишу статью, я еду в поезде и рядом со мной 79 ребят со всей России, которые 18 предыдущих дней занимались проектами в области энергетики, и среди них едут 10 победителей этой смены, которым являюсь и я. Ну a здесь мне хочется рассказать про то, какую лепту я внес в наш проект.

Акт 1. Как все начиналось

Я программирую уже довольно давно (по крайней мере для своего возраста), однако на этот раз получилось так, что я работал в новой для меня области, на новом для меня языке и в новой для меня команде. А именно я работал над мультиагентной системой для рынка энергетики в АЭК. Встретившись впервые с проектной командой и нашим куратором, мы, после долгого обсуждения, продумали основную концепцию и нарисовали базовую схему, в которой фигурировал такой язык как Java, но ее при этом не знал никто кроме куратора. За изучение нового языка взялся именно я, так как оказался одним из самых опытных разработчиков в проекте, и по итогу, как мне кажется, это было правильное решение. Java покорилась мне довольно быстро, хотя потом я еще великое множество раз листал документацию не понимая: "А что теперь не так?". Через полчаса, решив что Java для меня уже слишком проста, я взялся за JADE -фреймворк для написания мультиагентных систем, с помощью которой мы и организовали торги.

Акт 2. А что собственно делалось

Сама схема торгов была не такой уж и сложной, однако с нулевыми знаниями по подобным системам по началу это казалось практически невыполнимым, коими и сейчас для меня кажутся многие из задач.

Торги состояли из трех раундов:

  1. Все агенты совершают торги One-to-One

  2. Не заключившие контрактов агенты торгуют One-to-Many и Many-to-Many В конечном итоге нам пришлось сделать второй раунд аналогичным первому из-за отсутствия времени.

  3. Оставшиеся без продавцов покупатели заключают контракт с центральной компанией

В коде вся эта система была представлена тремя основными классами - BuyerAgent, SellerAgent и Manager.

Manager - это собственно точка входа, это класс который отвечал за создания JADE Runtime и за создания в нем агентов по HTTP запросам.

SellerAgent и BuyerAgent - это две сущности, которые и олицетворяли производителей продающих и потребителей покупающих электроэнергию. Оба этих агента реализовывают сложное поведение на основе FSMBehaviour:

  1. С сайта приходит запрос на создание агентов из пула

  2. Агенты регистрируются в сервисе желтых страниц

  3. Первый раунд

    1. Все покупатели отправляют информацию о своих требованиях всем продавцам (REQUEST)

    2. В ответ все продавцы отправляют свои предложения (INFORM)

    3. Покупатель делает запрос в API математики на Python и после этого отправляет предложение самым подходящим покупателям (CFP)

    4. Продавец собирает сообщения несколько секунд и после этого делает запрос в API математики для выбора лучшего предложения, затем отсылает ответ на предложение покупателю (PROPOSE)

    5. Покупатель принимает первый запрос и сразу отвечает на него согласием (ACCEPT-PROPOSAL)

  4. Второй раунд - только для не заключивших контракт в первом.

  5. Все покупатели возвращают ответ на backend нашего сайта, продавцы дают ответ только если ни с кем не договорились

В целом вся система выглядит довольно просто. И я даже успел ее полностью реализовать, однако...

Акт 3. И как все сломалось

Первые проблемы появились еще на моменте связывания агентов и backend - мы долго пытались понять как нам настроить пул, чтобы случайно не перегрузить систему агентов - в итоге, в качестве подпирающего это соединения костыля, мы установили таймер ограничения на запуск торгов. Однако на этом проблемы с этим соединением не закончились - на этот раз мы разбирались с форматом возвращаемых данных, что, на самом деле, тоже не составило особых проблем.

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

Но самые главные "проблемы" были в последнюю ночь перед защитой - у нас не было макета. Ну то есть он был, но все что он делал - это зажигал светодиоды на ленте по кнопкам. В итоге просидев всю ночь мы кое-как связали макет с агентами и сайтом. Но вот нормально протестировать это соединение мы, конечно, забыли.

Мы перенесли макет в другое здание. До выставки остается полчаса и мы начинаем поднимать сервера чтобы все отладить и выступить во всей красе, однако... Сервера падают после первого теста. Мы начинаем паниковать и в спешке начинаем выяснять в чем причина. Вскоре я узнаю что ошибка была в backend'е и она пофикшена. Мы запускаем еще один тест и все безошибочно работает. К нам подходят судьи и после непродолжительного разговора запускают торги. Вся моя команда видит как побежали огоньки на светодиодной ленте и радуется что все сработало, один лишь я стою с небольшим испугом на лице - передо мной монитор, на котором в логах агентов отображается ошибка. В итоге после презентации мы еще несколько раз проверили код, однако ошибка больше не появлялась.

Акт -1. Эпилог

Этот акт не с проста имеет номер -1, это обозначает что конец - это новое начало. Уже сейчас мы начали заново продумывать структуру проекта, анализировать наши ошибки и пересматривать некоторые решения. Если вы тоже собираетесь начинать новый проект, то, пожалуйста, сразу договоритесь о схемах взаимодействия, ведь это та самая точка, с которой и начинаются все проблемы, как они начались и у нас.

Tags:
Hubs:
+3
Comments3

Articles