Акт 0. Предисловие
Пока я пишу статью, я еду в поезде и рядом со мной 79 ребят со всей России, которые 18 предыдущих дней занимались проектами в области энергетики, и среди них едут 10 победителей этой смены, которым являюсь и я. Ну a здесь мне хочется рассказать про то, какую лепту я внес в наш проект.
Акт 1. Как все начиналось
Я программирую уже довольно давно (по крайней мере для своего возраста), однако на этот раз получилось так, что я работал в новой для меня области, на новом для меня языке и в новой для меня команде. А именно я работал над мультиагентной системой для рынка энергетики в АЭК. Встретившись впервые с проектной командой и нашим куратором, мы, после долгого обсуждения, продумали основную концепцию и нарисовали базовую схему, в которой фигурировал такой язык как Java, но ее при этом не знал никто кроме куратора. За изучение нового языка взялся именно я, так как оказался одним из самых опытных разработчиков в проекте, и по итогу, как мне кажется, это было правильное решение. Java покорилась мне довольно быстро, хотя потом я еще великое множество раз листал документацию не понимая: "А что теперь не так?". Через полчаса, решив что Java для меня уже слишком проста, я взялся за JADE -фреймворк для написания мультиагентных систем, с помощью которой мы и организовали торги.
Акт 2. А что собственно делалось
Сама схема торгов была не такой уж и сложной, однако с нулевыми знаниями по подобным системам по началу это казалось практически невыполнимым, коими и сейчас для меня кажутся многие из задач.
Торги состояли из трех раундов:
Все агенты совершают торги One-to-One
Не заключившие контрактов агенты торгуют One-to-Many и Many-to-ManyВ конечном итоге нам пришлось сделать второй раунд аналогичным первому из-за отсутствия времени.Оставшиеся без продавцов покупатели заключают контракт с центральной компанией
В коде вся эта система была представлена тремя основными классами - BuyerAgent, SellerAgent и Manager.
Manager - это собственно точка входа, это класс который отвечал за создания JADE Runtime и за создания в нем агентов по HTTP запросам.
SellerAgent и BuyerAgent - это две сущности, которые и олицетворяли производителей продающих и потребителей покупающих электроэнергию. Оба этих агента реализовывают сложное поведение на основе FSMBehaviour:
С сайта приходит запрос на создание агентов из пула
Агенты регистрируются в сервисе желтых страниц
Первый раунд
Все покупатели отправляют информацию о своих требованиях всем продавцам (REQUEST)
В ответ все продавцы отправляют свои предложения (INFORM)
Покупатель делает запрос в API математики на Python и после этого отправляет предложение самым подходящим покупателям (CFP)
Продавец собирает сообщения несколько секунд и после этого делает запрос в API математики для выбора лучшего предложения, затем отсылает ответ на предложение покупателю (PROPOSE)
Покупатель принимает первый запрос и сразу отвечает на него согласием (ACCEPT-PROPOSAL)
Второй раунд - только для не заключивших контракт в первом.
Все покупатели возвращают ответ на backend нашего сайта, продавцы дают ответ только если ни с кем не договорились
В целом вся система выглядит довольно просто. И я даже успел ее полностью реализовать, однако...
Акт 3. И как все сломалось
Первые проблемы появились еще на моменте связывания агентов и backend - мы долго пытались понять как нам настроить пул, чтобы случайно не перегрузить систему агентов - в итоге, в качестве подпирающего это соединения костыля, мы установили таймер ограничения на запуск торгов. Однако на этом проблемы с этим соединением не закончились - на этот раз мы разбирались с форматом возвращаемых данных, что, на самом деле, тоже не составило особых проблем.
После этого оказалось, что, пока я писал мультиагентную систему, математики успели добавить поля в систему ранжирования и мне пришлось дописывать еще и это.
Но самые главные "проблемы" были в последнюю ночь перед защитой - у нас не было макета. Ну то есть он был, но все что он делал - это зажигал светодиоды на ленте по кнопкам. В итоге просидев всю ночь мы кое-как связали макет с агентами и сайтом. Но вот нормально протестировать это соединение мы, конечно, забыли.
Мы перенесли макет в другое здание. До выставки остается полчаса и мы начинаем поднимать сервера чтобы все отладить и выступить во всей красе, однако... Сервера падают после первого теста. Мы начинаем паниковать и в спешке начинаем выяснять в чем причина. Вскоре я узнаю что ошибка была в backend'е и она пофикшена. Мы запускаем еще один тест и все безошибочно работает. К нам подходят судьи и после непродолжительного разговора запускают торги. Вся моя команда видит как побежали огоньки на светодиодной ленте и радуется что все сработало, один лишь я стою с небольшим испугом на лице - передо мной монитор, на котором в логах агентов отображается ошибка. В итоге после презентации мы еще несколько раз проверили код, однако ошибка больше не появлялась.
Акт -1. Эпилог
Этот акт не с проста имеет номер -1, это обозначает что конец - это новое начало. Уже сейчас мы начали заново продумывать структуру проекта, анализировать наши ошибки и пересматривать некоторые решения. Если вы тоже собираетесь начинать новый проект, то, пожалуйста, сразу договоритесь о схемах взаимодействия, ведь это та самая точка, с которой и начинаются все проблемы, как они начались и у нас.