C语言
主页 > 软件编程 > C语言 >

基于Matlab实现多目标粘液霉菌算法的代码

2022-05-14 | 酷站 | 点击:

1.概述

多目标粘液霉菌算法(MOSMA),这是最近开发的粘液霉菌算法(SMA)的多目标变体,用于处理工业中的多目标优化问题。最近,为了处理优化问题,已经为优化社区推荐了几种元启发式和进化优化技术。在评估多目标优化(MOO)问题时,这些方法往往受到低质量解的影响,而不是解决识别帕累托最优解的准确估计和增加所有目标的分布的目标函数。SMA方法遵循从实验室实验中粘液霉菌振荡行为中获得的逻辑。与其他成熟的方法相比,SMA算法显示出强大的性能,它是通过使用正负反馈系统结合最佳食物路径而设计的。所提出的MOSMA算法采用相同的底层SMA收敛机制,结合精英非支配排序方法来估计帕累托最优解。作为后验方法,在MOSMA中保持多目标公式,并利用拥挤距离运算符来确保增加所有目标中最佳解决方案的覆盖范围。为了验证和确认MOSMA的性能,考虑了41个不同的案例研究,包括无约束,约束和现实世界的工程设计问题。将MOSMA的性能与多目标共生生物搜索(MOSOS),基于分解的多目标进化算法(MOEA / D)和多目标水循环算法(MOWCA)在不同的性能指标方面进行了比较,例如代际距离(GD),倒置代际距离(IGD),最大传播(MS),间距和运行时。仿真结果验证了所提算法在实现线性、非线性、连续和离散帕累托最优前沿等多目标问题高质量解方面的优势。结果表明了所提算法在解决复杂的多目标问题方面的有效性。

2.算法过程

3.数值实验

4.Matlab代码实现

1

2

3

4

5

6

7

8

9

%%  (ZDT3)

function f = zdt3 (x)

% 两个目标函数

% 变量数目是 30. x [0,1]

f = [];

n=length(x);

g=1+9*sum(x(2:n))/(n-1);

f(1)=x(1);

f(2)=1-sqrt(x(1)/g)-(x(1)/g)*sin(10*pi*x(1));

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

%%===MOSMA:多目标粘液霉菌算法=====

  

%% 目标函数

% 目标函数描述包含了有关目标函数的信息。M为目标空间的维数,D为决策变量空间的维数,

% LB和UB为决策变量空间中变量的取值范围。

% 用户必须使用决策变量定义目标函数。务必编辑功能‘评估_目标',以适应您的需要。

clc

clear all

D = 30; % 决策变量数目

M = 2; % 目标函数的个数

K=M+D;

LB = ones(1, D).*0; %  LB - 表示每个决策变量的最小值的十进制值的向量。

UB = ones(1, D).*1; % UB - 决策变量的最大可能值向量。

GEN = 200;  % 设置最大生成数

ecosize = 200;      % 种群数量 (NP)

ishow = 10;

%% 开始进化过程

Pareto = MOSMA(D,M,LB,UB,ecosize,GEN,ishow);

Obtained_Pareto= Pareto(:,D+1:D+M); % extract data to plot

Obtained_Pareto=sortrows(Obtained_Pareto,2);

True_Pareto=load('ZDT3.txt');

%% 可视化

%% =========两个目标函数时======================

if M == 2

    plot(Obtained_Pareto(:,1),Obtained_Pareto(:,2),'o','LineWidth',2,...

        'MarkerEdgeColor','r','MarkerSize',2);

    hold on

    plot(True_Pareto(:,1),True_Pareto(:,2),'k');

    title('采用MOSMA算法求解Pareto最优解集');

    legend('MOSMA');

    xlabel('F_1');

    ylabel('F_2');

%% =====3个目标函数时==========================

elseif M == 3  

    plot3(Obtained_Pareto(:,1),Obtained_Pareto(:,2),Obtained_Pareto(:,3),'o','LineWidth',2,...

        'MarkerEdgeColor','r','MarkerSize',2);

    hold on

    plot3(Obtained_Pareto(:,1),Obtained_Pareto(:,2),Obtained_Pareto(:,3),'.','LineWidth',2,...

        'MarkerEdgeColor','k','MarkerSize',6);

    title('采用MOSMA算法求解Pareto最优解集');

    legend('MOSMA');

    xlabel('F_1');

    ylabel('F_2');

    zlabel('F_3');

end

%%  Metric Value

M_IGD=IGD(Obtained_Pareto,True_Pareto);

M_GD=GD(Obtained_Pareto,True_Pareto);

M_HV=HV(Obtained_Pareto,True_Pareto);

M_Spacing=Spacing(Obtained_Pareto,True_Pareto);

M_Spread=Spread(Obtained_Pareto,True_Pareto);

M_DeltaP=DeltaP(Obtained_Pareto,True_Pareto);

display(['The IGD Metric obtained by MOSMA is     : ', num2str(M_IGD)]);

display(['The GD Metric obtained by MOSMA is      : ', num2str(M_GD)]);

display(['The HV Metric obtained by MOSMA is      : ', num2str(M_HV)]);

display(['The Spacing Metric obtained by MOSMA is : ', num2str(M_Spacing)]);

display(['The Spread Metric obtained by MOSMA is  : ', num2str(M_Spread)]);

display(['The DeltaP Metric obtained by MOSMA is  : ', num2str(M_DeltaP)]);

原文链接:https://blog.csdn.net/weixin_46039719/article/details/124765846
相关文章
最新更新