Многокритериальная оптимизация с использованием МАТЛАБ Из отчета Георгия Жемелева Математическая модель операции: 𝑧1 = −2𝑁𝐴 − 4𝑁𝐵 → min; 𝑧2 = − 2𝑁𝐴 + 4𝑁𝐵 → min; 12𝑁𝐴 + 30𝑁𝐵 3 4 1700 𝑁𝐴 [−12 −30] ⋅ [ ] ≤ [−6000] ; 𝑁𝐵 12 30 9600 𝑁𝐴 ≥ 0, 𝑁𝐵 ≥ 0, 𝑦1 ≥ 0.8𝑦1max . Последнее ограничение на y1 можно будет использовать только после решения однокритериальной задачи оптимизации для целевой функции z1. 1.1. Поиск оптимумов частных критериев Найдем оптимумы каждой из целевых функций независимо от других. Для этого необходимо решить две задачи однокритериальной оптимизации: для z1 и z2 соответственно при тех же ограничениях на NA и NB, что имеют место для задачи многокритериальной оптимизации, поставленной выше. Для задания всех необходимых переменных в пакете MATLAB был исполнен следующий скрипт: %% Многокритериальная оптимизация % Жемелев Г. А., 13541/3 clc; clearvars % Параметры pA = 2; % Прибыль, которую приносит одно изделие A (у.е.) pB = 4; % Прибыль, которую приносит одно изделие B (у.е.) tA = 12; % Время на изготовление изделия A (мин) tB = 30; % Время на изготовление изделия B (мин) dA = 3; % Кол-во досок для изделия A (м2) dB = 4; % Кол-во досок для изделия B (м2) D = 1700; % Максимум досок в нед. (м2) Tmin = 100*60; % Минимально допустимое машинное время в нед. Tmax = 160*60; % Максимально допустимое машинное время в нед. ycoeff = 0.8; % Доля, которую суммарная прибыль составляет от масимальной % Целевые y1 = @(N) y2 = @(N) z1 = @(N) функции pA*N(1) + pB*N(2); % → max y1(N)/(tA*N(1) + tB*N(2)); % → max -y1(N); % → min z2 = @(N) -y2(N); % → min % Функциональные ограничения (в данном случае только линейные) A = [dA, dB; -tA, -tB; tA, tB]; b = [D; -Tmin; Tmax]; Aeq = []; beq = []; % Параметрические ограничения lb = [0; 0]; ub = [Inf; Inf]; Скрипт для поиска оптимумов частных критериев z1 и z2 выглядит следующим образом: %% Поиск оптимумов частных критериев startingPoint = lb; [N, z1_opt] = fmincon(z1, startingPoint, A, b, Aeq, beq, lb, ub) [N, z2_opt] = fmincon(z2, startingPoint, A, b, Aeq, beq, lb, ub) Аддитивная свертка критериев Для использования метода аддитивной свертки необходимо выполнить нормировку критериев, с тем чтобы сделать их значения соизмеримыми, а единицы измерения – безразмерными. Выполним нормировку следующим образом: 𝑧1 = 𝑧2 = 𝑧1 |𝑧1min | 𝑧2 |𝑧2min | = −2𝑁𝐴 − 4𝑁𝐵 𝑁𝐴 + 2𝑁𝐵 =− , 1400 700 =− (2𝑁𝐴 + 4𝑁𝐵 ) ⋅ 6 2𝑁𝐴 + 4𝑁𝐵 =− . 12𝑁𝐴 + 30𝑁𝐵 2𝑁𝐴 + 5𝑁𝐵 Формула аддитивной свертки имеет вид [1, 2]: 𝑟 𝐹(𝑥) = ∑ 𝜆𝑖 𝑓𝑖 (𝑥) , 0 < 𝜆𝑖 < 1, 𝑖=1 ∑ 𝜆𝑖 = 1, 𝑖 где fi(x) – критерии оптимальности, r – их общее число, а λi – параметры важности. Примем λ1 = λ2 = 0.5, считая нормированные критерии одинаково важными. Тогда получим следующую задачу оптимизации: 𝑓 = 0.5𝑧1н + 0.5𝑧2н → min; однокритериальной 1700 3 4 𝑁 −6000 −12 −30 [ ] ⋅ [ 𝐴] ≤ [ ]; 𝑁𝐵 12 30 9600 −2 −4 −1120 𝑁𝐴 ≥ 0, 𝑁𝐵 ≥ 0. Для её решения можно использовать следующий скрипт MATLAB: % Аддитивная свертка z1_norm = @(N) z1(N)/abs(z1_opt); z2_norm = @(N) z2(N)/abs(z2_opt); f = @(N) 0.5*z1_norm(N) + 0.5*z2_norm(N); A = [dA, dB; -tA, -tB; tA, tB; -pA, -pB]; b = [D; -Tmin; Tmax; z1_bound]; [N, f_opt] = fmincon(f, startingPoint, A, b, Aeq, beq, lb, ub) Мультипликативная свертка критериев В итоге получим следующую задачу однокритериальной оптимизации: 𝑓= 1 → min; 𝑧1 ⋅ 𝑧2 1700 3 4 𝑁 −6000 −12 −30 [ ] ⋅ [ 𝐴] ≤ [ ]; 𝑁𝐵 12 30 9600 −2 −4 −1120 𝑁𝐴 ≥ 0, 𝑁𝐵 ≥ 0. Для её решения можно использовать следующий скрипт MATLAB: % Мультипликативная свертка f = @(N) 1/(z1(N)*z2(N)); A = [dA, dB; -tA, -tB; tA, tB; -pA, -pB]; b = [D; -Tmin; Tmax; z1_bound]; [N, f_opt] = fmincon(f, startingPoint, A, b, Aeq, beq, lb, ub) Минимакс max {− 𝑖 𝑧1 ;− min 0.8𝑧1 𝑧2 𝑧2min } → min; 3 4 1700 𝑁𝐴 [−12 −30] ⋅ [ ] ≤ [−6000] ; 𝑁𝐵 12 30 9600 𝑁𝐴 ≥ 0, 𝑁𝐵 ≥ 0. Для решения этой задачи можно использовать функцию fminimax пакета MATLAB. Выполним следующий скрипт: %% В. Минимакс f = @(N) [z1(N)/(-z1_bound), z2(N)/(-z2_min)]; A = [dA, dB; -tA, -tB; tA, tB]; b = [D; -Tmin; Tmax]; [N, f_opt] = fminimax(f, startingPoint, A, b, Aeq, beq, lb, ub) Метод достижения цели (fgoalattain) Задача достижения цели, решаемая функцией fgoalattain может быть сформулирована следующим образом: 𝐹(𝑥) − 𝑤𝛾 ≤ goal, min 𝛾 , где { 𝑥,𝛾 𝐺(𝑥) ≤ 𝑏, где γ – скалярный критерий, называемый attain factor; F(x) = (f1(x), f2(x), … , fr(x)) – вектор критериев оптимизации; goal = (f1*, f2*, … , fr*) – вектор целей, которые могут быть как достижимыми, так и недостижимыми; w – вектор весовых коэффициентов, которые рекомендуется принимать равными |goal| «для того чтобы обеспечить ту же самую долю не- или передостижения активных целей» [4]; и G(x) ≤ b – система ограничений. Так как цели в векторе goal могут быть недостижимы без ущерба для решения задачи, пусть goal = (z1min, z2min), w = (|z1min|, |z2min|). Тогда скрипт для решения задачи будет выглядеть следующим образом: %% Д. Метод достижения цели f = @(N) [z1(N), z2(N)]; goal = [z1_opt, z2_opt]; w = abs(goal); A = [dA, dB; -tA, -tB; tA, tB]; b = [D; -Tmin; Tmax]; startingPoint = [10, 10]; [N, f_opt, af] = fgoalattain(f, startingPoint, goal, w, A, b, Aeq, beq, lb, ub) В данном случае начальная точка для алгоритма оптимизации была изменена с (0, 0) на (10, 10), потому что, начиная из точки (0, 0), функция fgoalattain не находила оптимального решения. программы: Local minimum possible. Constraints satisfied. Результаты работы fgoalattain stopped because the predicted change in the objective function is less than the default value of the function tolerance and constraints are satisfied to within the default value of the constraint tolerance. <stopping criteria details> N = 414.2936 114.2798 f_opt = 1.0e+03 * -1.2857 -0.0002 af = 0.0816 >> y1(N) ans = 1.2857e+03 >> y2(N) ans = 0.1531 Значение переменной af, которая соответствует показателю γ, говорит о том, что полученное решение на 8.2% хуже цели. Итоговое решение имеет вид: 𝑁𝐴 = 414 изделий, 𝑁𝐵 = 114 изделий, 𝑦1 = 1284 у. е. (91.7% от оптимума), 𝑦2 = 0.1531 у. е.⁄мин. (91.8% от оптимума).