数学建模暑期集训15:matlab求解多目标规划模型

多目标规划模型的求解方法

1.传统优化算法

1.1主要目标法

在这里插入图片描述

1.2分层序列法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3加权法

在这里插入图片描述

1.4理想点法

在这里插入图片描述

2.智能优化算法

遗传算法等…

例题实战:MATLAB中多目标遗传算法求解法

通用形式

在这里插入图片描述

例1:

在这里插入图片描述
matlab求解:
Fun.m

function y=Fun(x) 
y(1)=x(1)^4-10*x(1)^2+x(1)*x(2)+x(2)^4-x(1)^2*x(2)^2; 
y(2)=x(2)^4-x(1)^2*x(2)^2+x(1)^4+x(1)*x(2); 

main.m

clear 
clc 
fitnessfcn=@Fun;%适应度函数句柄
 nvars=2; %变量个数
 lb=[-5,-5]; %下限
 ub=[5,5]; %上限
 A=[];b=[]; %线性不等式约束
 Aeq=[];beq=[]; %线性等式约束
 
options=gaoptimset('paretoFraction',0.3,'populationsize',200,'generations',200,'stallGenLimit',200,'TolFun',1e-10,'PlotFcns',@gaplotpareto); 
% 最优个体系数paretoFraction为0.3;
%种群大小populationsize为100%最大进化代数generations为200% 停止代数stallGenLimit为200%适应度函数偏差TolFun设为1e-10%函数gaplotpareto:绘制Pareto前沿
[x,fval]=gamultiobj(fitnessfcn,nvars,A,b,Aeq,beq,lb,ub,options)

例2:

在这里插入图片描述
matlab求解:
Fun.m

function y=Fun(x) 
y(1)=x(1); 
y(2)=(1+x(2))/x(1); 

nonlcon.m

function [c,ceq] = nonlcon(x)
c =[];
ceq =[x(1)^2+x(2)^2-2];

main.m

clear 
clc 
fitnessfcn=@Fun;
 nvars=2; 
 lb=[0.1,0]; 
 ub=[1,5]; 
 A=[-9,-1;-9,1];b=[-6;-1]; 
 Aeq=[];beq=[]; 
 nonlinearCons = @nonlcon;
 options=gaoptimset('paretoFraction',0.4,'populationsize',200,'generations',300,'stallGenLimit',300,'TolFun',1e-10,'PlotFcns',@gaplotpareto); 

[x,fval]=gamultiobj(fitnessfcn,nvars,A,b,Aeq,beq,lb,ub,nonlinearCons,options)

例3:

在这里插入图片描述
matlab求解:
fitness.m

function  F = fitness(x)
F(1) = -100*x(1) - 80*x(2)- 90*x(3) - 70*x(4);
F(2) = 30*x(3) + 20*x(4);
F(3) = 50*x(1) +40*x(2)

main.m

clear
clc
fit = @fitness;
nvars = 4;
lb = [0 0 0 0];
ub = [];
A = [3, 2, 0, 0; -3, -2, 0, 0; 0, 0, 3, 2; 0, 0, -3, -2; -1, 0, -1, 0; 0, -1, 0, -1];
b = [120 0 48 0 -30 -30];

options = gaoptimset('paretoFraction',0.4,'populationsize',200,'generations',300,'stallGenLimit',200,'TolFun',1e-10);
[x,fval] = gamultiobj(fit,nvars,A,b,[],[],lb,ub,options)
plot3(fval(:,1),fval(:,2),fval(:,3),'pr')
xlabel('f_1(x)')
ylabel('f_2(x)')
zlabel('f_3(x)')
title('Pareto front')
grid on
以下是一个简单的 Python 代码示例,使用多目标梯度下降法来优化多个目标函数: ``` python import numpy as np # 所有目标函数 def f(X): f1 = 2 * X[0] ** 2 + X[1] ** 2 f2 = X[0] ** 2 + 3 * X[1] ** 2 f3 = X[0] ** 2 + X[1] ** 2 + 2 * X[2] ** 2 return np.array([f1, f2, f3]) # 梯度函数 def grad(X): eps = 1e-8 grad1 = (f([X[0] + eps, X[1]]) - f([X[0] - eps, X[1]])) / (2 * eps) grad2 = (f([X[0], X[1] + eps]) - f([X[0], X[1] - eps])) / (2 * eps) grad3 = (f([X[0], X[1], X[2] + eps]) - f([X[0], X[1], X[2] - eps])) / (2 * eps) return np.array([grad1, grad2, grad3]) # 多目标梯度下降函数 def multi_grad_desc(X0, iterations, alpha): X = X0 for i in range(iterations): G = grad(X) X = X - alpha * G return X # 运行代码 X0 = np.array([1, 1, 1]) # 初始参数值 iterations = 100 # 迭代次数 alpha = 0.1 # 学习率 X_optimal = multi_grad_desc(X0, iterations, alpha) print("最优参数为:", X_optimal) print("最优函数值为:", f(X_optimal)) ``` 解释一下这段代码: 1. 定义了所有的目标函数 `f(X)`,并返回一个包含所有函数值的 Numpy 数组。 2. 定义了梯度函数 `grad(X)`,该函数计算并返回参数点 X 的梯度向量。 3. 定义了多目标梯度下降函数 `multi_grad_desc(X0, iterations, alpha)`,该函数接受初始参数 X0、迭代次数 iterations 和学习率 alpha,并返回经过多次迭代后得到的最优参数 X_optimal。 4. 在主程序中,设定初始参数 X0、迭代次数 iterations 和学习率 alpha,并将它们传递给多目标梯度下降函数 `multi_grad_desc()`,并得到最优参数 X_optimal。 5. 最后,输出最优参数和最优函数值。 需要注意的是,由于该示例中的目标函数较简单,只有三个目标,所以梯度向量可以手动计算。但在实践中,如果目标函数非常复杂,梯度向量将很难手动计算。此时,可以使用自动微分工具(如 TensorFlow)来计算梯度向量。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zstar-_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值