Ускорение оптимизации формы рабочего колеса гидротурбины за счёт использования метамодели
Участники проекта
Руководитель
Задача
Гидроэлектростанции преобразуют энергию течения воды в электричество. Вода вращает вал или рабочее колесо гидротурбины — за счёт этого происходит преобразование. От формы вала зависит, как много электричества мы получим за единицу объема воды, прошедшей через турбину.
Задача расчёта оптимальной формы вала — сложная математическая задача, которую гидроэлектростанции часто делегируют институтам. В ИВТ СО РАН придумали один из способов расчета, но вычисления, которые они проводили, занимали достаточно много времени. Целью моей практики было сократить вычислительную сложность этого алгоритма.
Предметная область
Гидравлическая турбина преобразует механическую энергию потока воды в энергию вращающегося вала. Лопастное вращающееся колесо — основной рабочий орган гидравлической турбины. Оно соединено валом с ротором гидрогенератора. Здесь происходит преобразование энергии.
От формы лопасти рабочего колеса зависит то, как много воды турбина способна пропустить в единицу времени, её КПД и даже срок её службы. Расчёт формы лопасти — это нетривиальная многоцелевая задача оптимизации, в которой ищут не просто объект с оптимальными значениями функционалов, а целый набор таких объектов —фронт Паретто.
В ИВТ СО РАН форму рассчитывают при помощи многоцелевого перебора огромного числа вариантов генетическим алгоритмом. Мне часто доводилось слышать, что генетический алгоритм почти неприменим на практике. Этот случай — исключение. Алгоритм построения оптимальной формы лопасти отлично работает. Вот только чтобы оценить качество спроектированной формы, нужно смоделировать для нее 3D-течение. Процесс моделирования для только одного варианта лопасти может занять около двух часов. А при высокой точности описания потребуется расчёт примерно 3 000 вариантов! Поэтому расчёты продолжительностью в неделю — обычная практика.
Чтобы ускорить процесс, я решил попробовать применить машинное обучение. Осталось лишь придумать, как это сделать.
Идея
Форма лопасти описывается целым набор числовых параметров, которые удобно представлять в виде вектора. Любой такой вектор с фиксированными значениями параметров будем называть индивидуумами. Поколением будем называть набор индивидуумов. Если поколение начальное, то оно формируется как набор случайных индивидуумов. В противном же случае поколение формируется с использованием генетического алгоритма.
Исходный алгоритм расчёта формы лопасти работал по такому принципу:
- Генерируются случайные формы лопасти. Это начальное поколение индивидуумов.
- Для каждого индивидуума из начального поколения производится расчёт функционалов. Например, КПД и долговечность.
- Отбирается «элита» — индивидуумы, для которых функционалы принимают оптимальные среди прочих значения. Строго говоря, отбираются объекты, принадлежащие фронту Паретто.
- При помощи генетического алгоритма формируется новое поколение.
- Пункты 1-3 повторяются уже для нового поколения.
Я опустил всю математику процесса, но звучит все равно не очень понятно. Думаю, с покемонами станет проще:
Процесс останавливается, когда, например, проделано достаточное количество итераций — оно определяется эвристикой. Или когда фронт Паретто перестанет существенно меняться.
Прежде, чем думать о том, как добавить сюда машинное обучение, важно обратить внимание на следующее:
1. Возможные значения параметров формы лопасти могут меняться от задачи к задаче.
2. Задача решается для конкретной гидротурбины. То есть от задачи к задаче принципы расчёта функционалов могут меняться.
Для того, чтобы обучить модель, нужны данные. Но поскольку модель придётся строить для каждой задачи отдельно, то данные придется формировать в процессе расчётов. Эксперименты показали, что для формирования хорошей модели нужно примерно 3 000 объектов. Увы, это приблизительно столько, сколько и вычислял исходный алгоритм. То есть для того, чтобы построить хорошую модель, нужно сначала целиком решить задачу.
Подойдем к задаче с другого края: возьмём её не количеством объектов, а количеством моделей:
→ Рассчитаем функционалы для начального поколения, обучим на них модель
→ В дальнейшем функционалы будем вычислять уже при помощи построенной регрессионной модели (1)
→ Проведя несколько итераций уже привычного алгоритма с такой моделью, сформируем «элиту»
→ Для этой «элиты» пересчитаем значения функционалов и добавим их к обучающей выборке (2)
→ Обучим модель заново и повторим все вновь.
Первая модель будет строить крайне грубые приближения. Но чем больше моделей обучим, тем качественнее будет решение. Выглядит это примерно так:
Результаты
Вопрос, на который ушло порядочно времени, — какую модель использовать? После огромного числа экспериментов, выбор пал на модель гауссовой регрессии, большим плюсом которой является построение для любого объекта не только предсказания, но и доверительного интервала. Это позже помогло улучшить качество решения.
Следующее, что нужно было выбрать — ядро регрессии. Ниже на графиках для ядра «Rational Quadratic» синей линией отображено точное значение одного из функционалов (значения упорядочены по возрастанию), красными точками — предсказание, зелёным — доверительный интервал.
После долгих часов внедрения, отладки и тестирования алгоритма с подобранной метамоделью я получил результат, который превзошёл ожидания — никто не верил, что получится хоть что-то. Я протестировал алгоритм на реальной, пусть и упрощенной задаче поиска формы лопасти, максимизирующей только КПД в разных режимах работы гидротурбины. Ниже на первом изображении показаны результаты после первого дообучения модели, а на втором — результаты в конце работы алгоритма: затея сработала. Самое приятное — то, что за все время расчётов течение моделировалось только 365 раз. Это как минимум в 9 раз меньше, чем в исходном алгоритме.