Основы оптимизации
Итоговый проект
В итоговом проекте мы применим полученные знания для решения оптимизационной задачи, связанной с расчетом дозы радиационного излучения при лечении опухоли головного мозга лучевой терапией.
Введение
Лучевая терапия опухоли головного мозга
Лучевая терапия (радиотерапия) – это один из способов лечения опухолей, при котором воздействие на патологический очаг происходит с помощью ионизирующего излучения. Для воздействия могут применяться различные типы излучения, как волновые, так и корпускулярные (потоки заряженных частиц).
При лечении лучевой терапией необходимо целенаправленно передать достаточную дозу радиации в область патологического очага, при этом минимизировав дозу облучения, полученную здоровыми тканями.
Формы опухолей и их расположение могут значительно варьироваться, а интенсивность радиоактивного излучения снижается, проходя через ткани головного мозга.
В связи с этим, для того чтобы передать необходимую дозу радиации в пораженные участки ткани, минимизировав при этом радиационное поражение здоровых тканей, облучение производится несколькими лучами разных интенсивностей с различных направлений.
1. Создание оптимизационной задачи
Для решения данной задачи мы используем оптимизационную библиотеку JuMP и линейный решатель GLPK. Нам также понадобятся библиотека DataFrames для работы с табличными данными и библиотека Plots для визуализации результатов. Для их использования необходимо выполнить команду ниже:
using JuMP, GLPK, DataFrames, Plots;
✏️Задание 1
Создайте оптимизационную задачу, применив к ней линейный решатель GLPK, и сохраните ее в переменной Rad_opt.
Решение
Rad_opt = Model(GLPK.Optimizer)
2. Зоны радиационного облучения
В данном примере мы рассчитаем переданную дозу радиационного облучения в двумерном пространстве.
Радиационное облучение проводится с двух направлений, по горизонтали и вертикали. На каждом направлении действуют четыре луча. Доза подающегося излучения каждого из лучей может контролироваться по отдельности.
Таким образом, зона облучения может быть представлена в виде матрицы размером 4x4.
Зона облучения содержит три вида регионов:
- Опухоль – ткань, являющаяся целью лучевой терапии.
- Здоровая ткань – ткань, не затронутая опухолью, долю радиационного излучения на которую мы хотим сократить.
- Спинной мозг – регион, где расположен спинной мозг. Доза радиации, поступающая в регионы спинного мозга, не должна превышать установленный порог в связи с рисками повреждения органа.
Интенсивность луча снижается по мере прохождения сквозь ткани головного мозга. Наибольшая интенсивность в первом квадрате выражена коэффициентом 1. Интенсивность в самом удаленном квадрате выражена коэффициентом 0.25.
✏️Задание 2
Создайте оптимизационную переменную D, определяющую дозу радиации, передаваемую каждым из лучей. Используйте D[], чтобы обозначить необходимое количество элементов переменной D по количеству лучей.
Установите нижнюю границу значений переменной D равную 0, так как доза радиации не может быть отрицательной, и верхнюю границу равную 7 как максимальную мощность радиационного луча.
Решение
@variable(Rad_opt, D[1:8], lower_bound = 0.0, upper_bound = 7.0)
3. Формулировка целевой функции
Одной из целей оптимизационной задачи является минимизация дозы радиации, полученной не пораженными опухолью регионами.
Для этого перемножим коэффициент интенсивности радиационного облучения на каждый элемент переменной D (дозу радиации, передаваемую каждым лучом) в регионах здоровой ткани и спинного мозга, пропуская при этом регионы, пораженные опухолью.
✏️Задание 3
Повторите вычисления для D5, D6, D7 и D8. Создайте вектор d, содержащий все восемь коэффициентов.
Решение
d = [2.5, 2.25, 0.5, 1.25, 2.0, 1.75, 2.25, 1.25]
✏️Задание 4
Перемножьте переменную d, содержащую коэффициенты интенсивности радиационного облучения на не пораженные ткани, и оптимизационную переменную D. Сохраните результат в переменной Dose.
Решение
Dose = d .* D
✏️Задание 5
Суммируйте значения переменной Dose и сохраните в переменной Total_dose.
Решение
Total_dose = sum(Dose)
✏️Задание 6
Создайте целевую функцию для оптимизационной задачи Rad_opt. Используйте функцию минимизации на переменной Total_dose, содержащей общую дозу радиационного облучения на не пораженные регионы.
Решение
@objective(Rad_opt, Min, Total_dose)
4. Формулировка условий распределения доз радиоактивного излучения
Целевая функция, описанная нами выше, минимизирует радиационное облучение не пораженных участков головного мозга. В то же время для достижения эффективного результата лучевой терапии необходимо сформулировать дополнительные условия.
✏️Задание 7
В целях минимизации рисков нанесения повреждений спинному мозгу, вызванных радиационным излучением, необходимо ограничить дозу облучения, передаваемую в регионы его расположения.
Задайте условия оптимизационной задачи Rad_opt для двух регионов расположения спинного мозга, указанных на предыдущей картинке, где общая доза переданной радиации не может превышать 2. Дайте условиям имена C1 и C2.
Вы можете проиндексировать регионы по номеру луча (D1-D8) и коэффициенту интенсивности излучения в этом регионе.
Подсказка
Не забудьте, что каждый регион может получить облучение с двух направлений. По горизонтали, от лучей D1-D4, и по вертикали, от лучей D5-D8.
Решение
@constraint(Rad_opt, C1, 0.5*D[2]+0.75*D[7] <= 2);
@constraint(Rad_opt, C2, 0.5*D[3]+0.5*D[7] <= 2);
✏️Задание 8
Для успеха лучевой терапии необходимо задать условия передачи минимальной дозы радиационного облучения в регионы, пораженные опухолью.
Задайте условия оптимизационной задачи Rad_opt для шести регионов, пораженных опухолью, указанных на предыдущей картинке, где общая доза переданной радиации не может быть меньше 4. Дайте условиям имена c1-c6.
Решение
@constraint(Rad_opt, c1, D[3]+0.5*D[5] >= 4);
@constraint(Rad_opt, c2, 0.75*D[3]+0.5*D[6] >= 4);
@constraint(Rad_opt, c3, 0.75*D[4]+0.25*D[6] >= 4);
@constraint(Rad_opt, c4, 0.5*D[4]+0.25*D[7] >= 4);
@constraint(Rad_opt, c5, 0.25*D[2]+0.75*D[8] >= 4);
@constraint(Rad_opt, c6, 0.25*D[3]+0.5*D[8] >= 4);
5. Решение оптимизационной задачи
Теперь решим оптимизационную задачу.
✏️Задание 9
Решите оптимизационную задачу и просмотрите ее параметры с помощью команд optimize!() и print().
Затем выведите информацию о решениях и убедитесь, что они удовлетворяют заданным вами условиям с помощью команды solution_summary().
Решение
optimize!(Rad_opt)
print(Rad_opt)
solution_summary(Rad_opt)
6. Итоговые результаты
✏️Задание 10
Выведите полученное целевое значение оптимизационной задачи Rad_Opt.
Целевое значение показывает минимальную сумму доз радиационного облучения не пораженных участков головного мозга при выполнении всех заданных условий.
Решение
objective_value(Rad_opt)
✏️Задание 11
Выведите оптимизированные значения доз радиационного излучения, передаваемого лучами. Для этого используйте команду value.(). Сохраните результат в переменной Opt_dose.
Решение
Opt_dose = value.(D)
6. Визуализация результатов
Визуализируйте результаты по номерам лучей с помощью команды ниже:
plot(Opt_dose, kind="bar")