Основы оптимизации
Основы оптимизации в Engee
В данном разделе используются функции из следующих библиотек языка Julia: JuMP, GLPK. Они предустановлены в Engee. Для их использования необходимо выполнить команду ниже:
using JuMP, GLPK;
JuMP (Julia for Mathematical Programming) – это библиотека с открытым исходным кодом, в которой реализован язык алгебраического моделирования, позволяющий пользователям формулировать широкий спектр задач оптимизации (линейные, нелинейные, с ограничениями и без ограничений). Сам язык моделирования не решает задач оптимизации, его цель
– передать задачу в процедуру оптимизации (решатель или солвер). Подробную документацию можно найти на сайте https://jump.dev/.
Задачи, которые должен выполнять язык моделирования, можно
условно разделить на две части:
- загрузить в память задачу, введенную пользователем;
- сгенерировать входные данные, требуемые процедурой оптимизации в соответствии с типом задачи.
Обе эти задачи решает библиотека JuMP, которая использует технику автоматического дифференцирования для вычисления производных выражений, введенных пользователем.
GLPK (GNU Linear Programming Kit library) – библиотека линейной оптимизации. Она предоставляет выбор большого числа решателей. Документацию по этой библиотеке можно найти на сайте.
1. Создание оптимизационной задачи и переменных
Создать оптимизационную задачу можно с помощью команды Model(). В скобках нужно указать название решателя, который будет использован для решения задачи, и сохранить команду в переменной.
Например:
optimization_problem = Model(GLPK.Optimizer)
Решатель можно также добавить позднее с помощью команды set_optimizer(). В скобках через запятую указывается имя оптимизационной задачи, которой присваивается переменная, и название решателя. Например:
set_optimizer(optimization_problem, GLPK.Optimizer)
Для объявления переменной без присваивания ей числового значения в Engee используется команда @variable(). В скобках через запятую указывается имя оптимизационной задачи, которой присваивается переменная, и имя самой переменной.
Например:
@variable(optimization_problem, opt_variable);
Вы также можете задать границы возможных значений для вашей переменной. Например:
@variable(optimization_problem, opt_variable_1 >= 1);
✏️Задание 1
Чтобы добавить свой код в сценарий, нужно щелкнуть по серому полю, предназначенному для ввода кода. Когда нужный код добавлен, вы можете запустить его и узнать результат, щелкнув по кнопке Запуска слева от ячейки.
Создайте оптимизационную задачу, применив к ней линейный решатель GLPK, и сохраните ее в переменной opt_prob.
Решение
opt_prob = Model(GLPK.Optimizer)
✏️Задание 2
Создайте переменную x и присвойте ее вашей оптимизационной задаче opt_prob.
Решение
@variable(opt_prob, x);
✏️Задание 3
Создайте переменную y, присвойте ее вашей оптимизационной задаче opt_prob и задайте границы: y больше или равно 1, но меньше или равно 4.
Решение
@variable(opt_prob, 1 <= y <= 4)
2. Создание целевых функций
Целевая функция – это функция, подлежащая оптимизации для решения оптимизационной задачи.
В зависимости от того, является ли функция линейной или нелинейной, целевая функция задается двумя разными командами. Линейная целевая функция задается командой @objective(), а нелинейная целевая функция – командой @NLobjective().
В скобках через запятую указывается название оптимизационной задачи, Min для минимизации или Max для максимизации и математическое выражение. Например:
@objective(optimization_problem, Min, opt_variable + 3*opt_variable_1)
✏️Задание 4
Создайте линейную целевую функцию для оптимизационной задачи opt_prob с целью максимизировать выражение y - x.
Решение
@objective(opt_prob, Max, y - x)
3. Создание условий оптимизации
Вы также можете задать условия, которые наложат ограничения на поиск оптимального решения задачи.
Так же, как и целевые функции, условия могут быть линейными и нелинейными. Линейные условия задаются командой @constraint(), а нелинейные – командой @NLconstraint().
В скобках через запятую указывается название оптимизационной задачи и математическое выражение для условия. Например:
@constraint(optimization_problem, opt_variable + opt_variable_1 >= 6)
✏️Задание 5
Создайте линейное условие для оптимизационной задачи opt_prob где x + y == 5.
Решение
@constraint(opt_prob, x + y == 5)
4. Решение оптимизационных задач
Решить оптимизационную задачу можно с помощью команды optimize!(). В скобках указывается название оптимизационной задачи. Например:
optimize!(optimization_problem)
Просмотреть оптимизационную задачу можно с помощью команды print(). В скобках указывается название оптимизационной задачи. Например:
print(optimization_problem)
Просмотреть информацию о решении задачи можно с помощью команды solution_summary(). В скобках указывается название оптимизационной задачи. Например:
solution_summary(optimization_problem)
Просмотреть целевое значение можно с помощью команды objective_value(). В скобках указывается название оптимизационной задачи. Например:
objective_value(optimization_problem)
Просмотреть оптимизированные значения переменных можно с помощью команды value(). В скобках указывается имя переменной. Например:
value(opt_variable)
value(opt_variable_1)
✏️Задание 6
Решите оптимизационную задачу opt_prob. Просмотрите задачу с помощью print() и информацию о решениях с помощью solution_summary(). Просмотрите целевое значение задачи и оптимизированные значения обеих переменных x и y.
Решение
optimize!(opt_prob)
print(opt_prob)
solution_summary(opt_prob)
objective_value(opt_prob)
value(x)
value(y)
Тест для получения сертификата
Если вы впервые проходите тестирование на платформе Этюд по ссылке из Engee, то, нажав на ссылку ниже, вы увидите следующее диалоговое окно:
Нажмите на кнопку "Предоставить", чтобы авторизоваться на платформе Этюд с данными вашего профиля Engee ID.
Если вы раньше уже проходили тестирование по ссылке из Engee, то ваша авторизация выполнится автоматически и тестирование начнется сразу же после нажатия на ссылку.