matlab_多目标遗传算法

2023-11-20

前言

之前写过在python中的多目标遗传算法了,但是很可惜的是python调用商用有限元软件比较费事,需要在ironpython的编译环境下调用,然后这个ironpython它又是个老古董,不支持pandas和numpy这些python必备的第三方库(内心是崩溃的)。没办法,被迫向matlab低头。从头学起来吧,好在有了python的基础学matlab也是比较容易的。

代码实现

这个代码水平写得比较low,毕竟我刚学matlab,多多包含。相关的理论说明在我之前的博客中给出了,在此就不赘述了,理论说明贴个链接:

Python_多目标遗传算法_入门学习+代码实现

直接上代码了哈。首先是两个待优化的函数。

function y=fun1(x)
%optimal function one
y=(x-1)^2;
end
function y=fun2(x)
%optimal function two
y=cos(x);
end

接着就是算法进化过程了:

%%get initial parameter
NP=70;  
L=10;    
Pc=0.8;  
Pm=0.2;  
G=30;        %迭代次数 
Xs=pi/2;   
Xx=0;
%% generate Primary population
f=randi([0,1],NP,L);
x=zeros(1,NP*2);
tempx=zeros(1,NP*2);
f1trace=[];
f2trace=[];
%% begin to Iteration
for i=1:1:G
    disp([i]);
    %pause(10);
    f1=zeros(1,NP*2);
    f2=zeros(1,NP*2);
    nf=f;
    for M=1:2:NP
        p=rand();
        if p<Pc
            q=randi([0,1],1,L);
            for j=1:1:L
                if q(j)==1
                    tempsize=nf(M+1,j);
                    nf(M+1,j)=nf(M,j);
                    nf(M,j)=tempsize;
                end
            end
        end
    end
    j=1;
    while j<=NP*Pm
        h=randi(NP);
        for k=1:1:round(NP*Pm)
            g=randi(L);
            nf(h,g)=~nf(h,g);
        end
        j=j+1;
    end
    newf=[f;nf];           %垂直方向合并两个矩阵
    tempsize=size(newf);
    for j = 1:1:tempsize(1)
        U=newf(j,:);
        m=0;
        for k =1:1:L
            m=U(k)*2^(k-2)+m;
        end
        x(j)=Xx+m*(Xs-Xx)/(2^(L-1));
        f1(j)=func(x(j));
        f2(j)=func1(x(j));   %f1,f2都是预先分配好内存了的,避免了append的使用
    end
    lenfs=length(f1)*2;
    fs=zeros(1,lenfs);
    for j=1:2:lenfs
        fs(j)=f1((j+1)/2);
        fs(j+1)=f2((j+1)/2);
    end
    fs=reshape(fs,2,lenfs/2);
    ps=zeros(length(f1),length(f1));
    for k =1:1:length(f1)
        for j = 1:1:length(f1)
            if fs(1,k)<fs(1,j) && fs(2,k)<fs(2,j)
                ps(k,j)=1;
            elseif fs(1,k)<fs(1,j) && fs(2,k)==fs(2,j)
                ps(k,j)=1;
            elseif fs(1,k)==fs(1,j) && fs(2,k)<fs(2,j)
                ps(k,j)=1;
            end
        end
    end
    jishu=zeros(1,length(f1));       %问题记录,把数值大的点筛出来了的,判断语句没问题,但是结果中
    for k = 1:1:length(f1)           %又出现数值大的点了,这些点从何处来?
        tempa=0;
        for j = 1:1:length(f1)
            if ps(j,k)==1
                tempa=tempa+1;
            end
        end
        jishu(k)=tempa;
    end
    [num,index]=sort(jishu);
    uninum=unique(num);     %向量去重
    front=cell(1,length(uninum));
    for k =1:1:length(uninum)
        temmat=[];
        for j =1:1:length(index)
            if num(j)==uninum(k)
                temmat=[temmat,index(j)];  %记录对应索引
            end
        end
        front{k}=temmat;
    end
    f=[];
    for j = 1:1:length(front)
        if length(f)==NP
            break
        end
        tempf=[];
        for k=1:1:length(front{j})
            tempf=[tempf;newf(front{j}(k),:)];
        end
        tempf1=[];
        tempf2=[];
        [widtemf,wif_]=size(tempf);
        for M = 1:1:widtemf
            U=tempf(M,:);
            m=0;
            for k =1:1:L
                m=m+U(k)*(2^(k-2));
            end
            xtemp=Xx+m*(Xs-Xx)/(2^(L-1));
            tempf1=[tempf1,func(xtemp)];
            tempf2=[tempf2,func1(xtemp)];
        end
        [temp1sort,temp1index]=sort(tempf1);
        distance=zeros(1,length(tempf1));
        distance(temp1index(1))=inf;
        distance(temp1index(end))=-inf;
        for k=1:1:length(temp1index)-1
            if abs(distance(temp1index(k)))<10
                distace(temp1index(k))=(tempf1(temp1index(k+1))-tempf1(temp1index(k-1)))/(max(tempf1)-min(tempf1));
            else
                continue
            end
        end
        [temp2sort,temp2index]=sort(tempf2);
        distance1=zeros(1,length(tempf2));
        distance1(temp2index(1))=inf;
        distance1(temp2index(end))=-inf;
        for k=1:1:length(temp2index)-1
            if abs(distance1(temp2index(k)))<10
                distace1(temp2index(k))=(tempf2(temp2index(k+1))-tempf2(temp2index(k-1)))/(max(tempf2)-min(tempf2));
            else
                continue
            end
        end
        
        sumdis=[];
        for k =1:1:length(distance)
            sumdistance=distance(k)+distance1(k);
            sumdis=[sumdis,sumdistance];
        end
        [dis_,disindex]=sort(sumdis,'descend');
        for k=1:1:length(sumdis)
            f=[f;tempf(disindex(k),:)];
            if length(f)==NP
                break
            end
        end
%         f=reshape(f,length(f)/L,L);
        f1=[];
        f2=[];
        [lenf,wid_]=size(f);
        for j=1:1:lenf
            U=f(j,:);
            m=0;
            for k =1:1:L
                m=m+U(k)*(2^(k-2));
            end
            x(j)=Xx+m*(Xs-Xx)/(2^(L-1));
            f1=[f1,func(x(j))];
            f2=[f2,func1(x(j))];
        end
    end
        name=['F:/单轨吊驱动电机/maxwell调用/测试/pic/','pareto',num2str(i),'.png']; %保存图片到指定文件夹并命名
        plot(f1,f2,'o','MarkerSize',7);
        set(gca,'FontName','Times New Roman');
        grid on
        title('优化前沿曲线','FontName','宋体');
        xlabel('f1value')
        ylabel('f2value')
        saveas(gcf, name);
end

最后的话

代码的确写得比较不堪入目,但是结果是好的,功能可以保证实现。

第一代优化结果:

 第30代结果:

 再多说两句,之前一直用python,就不想去学matlab,限制在自己的舒服区了,之后还是要多尝试尝试,不能一直止步不前。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matlab_多目标遗传算法 的相关文章

  • 在 MATLAB 中验证输入的最佳实践

    在验证 MATLAB 函数中的输入时 什么时候使用 inputParser 比使用断言更好 或者还有其他更好的工具可用吗 我个人发现使用 inputParser 不必要地复杂 对于 Matlab 始终需要检查 3 项内容 存在 类型和范围
  • Matlab:如何读取以逗号作为小数分隔符的数字?

    我有很多 数十万 相当大 gt 0 5MB 的文件 其中数据是数字 但以逗号作为小数分隔符 使用像这样的外部工具对我来说是不切实际的sed s g 当分隔符是点时 我只使用textscan fid f f f 但我看不到更改小数点分隔符的选
  • 在matlab中融合2个以上的图像

    在 MATLAB 中 如何融合两个以上的图像 例如 我想要做什么imfuse但对于超过 2 个图像 使用两张图像 这是我的代码 A imread file1 jpg B imread file2 jpg C imfuse A B blend
  • 如何在 MATLAB 中为 4 个子图创建一个通用图例?

    如何在 MATLAB 中为 4 个子图创建一个通用图例 如下所示 又快又脏 hSub subplot 3 1 1 plot 1 1 1 1 1 1 1 1 hLegend legend hello i am legend subplot 3
  • 如何使用 MATLAB 的“等值面”函数创建三角球体

    如何创建一个三角球体 其中每个三角形的面面积相同 我想要这样的东西 http imageshack us a img198 5041 71183923 png http imageshack us a img198 5041 7118392
  • 如何使用神经网络保存 Sift 特征向量进行分类

    SIFT 特征的 Matlab 实现发现于http www cs ubc ca lowe keypoints http www cs ubc ca lowe keypoints 在 stackoverflow 的帮助下 我想将功能保存到 m
  • Matlab 中是否有相当于 R 的 dput() 的函数?

    Matlab 中是否有相当于 R 的 dput 的函数 dput 将 R 对象的 ASCII 文本表示形式写入文件或连接 UPDATE 1 添加了递归和对单元格的支持 UPDATE 2 添加了对结构的支持 UPDATE 3 增加了对逻辑 整
  • 继续在 Matlab 中一遍又一遍地播放声音?

    我正在尝试创建一个 MATLAB 程序来每隔几分钟一遍又一遍地播放声音 现在我将其设置为每隔几秒播放一次 只是为了消除系统中的一些错误 但是 当我的程序尝试重播声音时 我收到此错误 Error using gt audioplayer au
  • 如何将条形图的 XtickLabels 向左移动?

    我目前正在尝试创建频率直方图 为此 我必须创建一个条形图 条形图之间没有空格 然而 这集中于XTickLabels在酒吧的中间 由于它是一个直方图 我希望数值位于每个条形之间的线上 以便它可以直观地指示间隔 本质上 我需要将所有刻度标签移至
  • 在 3d 空间中的两个平面之间进行插值

    我正在开发一种工具 可以让您在 3D 体积 上圈出 包围事物 我想通过标记 切片 1 和 3 并从该信息 填充 切片 2 来节省时间 两个简单的解决方案是 1 slice2 slice1 AND slice3 gets the overla
  • 在 Matlab 中保存当前运行的脚本

    有没有办法保存Matlab中当前运行的脚本 我有一个脚本 它会自动备份一组脚本 但如果我更改了当前脚本 则保存的版本将过期 也许可以调用一些java Thanks 在 Yair Altman 网站上的某个地方 请参阅我的其他答案中的链接 他
  • 在 MATLAB 中检索 spfun、cellfun、arrayfun 等中的元素索引

    有什么办法可以找回index调用函数的元素的cellfun arrayfun or spfun行为 即检索函数范围内元素的索引 为了简单起见 假设我有以下玩具示例 S spdiags 1 4 0 4 4 f spfun x 2 x S 它构
  • Matlab:如何显示数组的“真实”值?

    我有一个在脚本中计算的向量 计算后 我将值显示到命令窗口 显示如下 finalResults 1 0e 05 0 0001 0 0 0005 0 0002 0 0001 0 0027 0 0033 0 0001 0 0000 0 0000
  • MATLAB中如何画水平线和垂直线?

    我目前正在尝试在 MATLAB 中绘制简单的垂直线和水平线 例如 我想绘制线 y 245 我该怎么做呢 MATLAB 根据您提供的向量逐点进行绘图 因此 要创建一条水平线 您需要改变x同时保持y对于垂直线恒定 反之亦然 xh 0 10 yh
  • MATLAB 中时间戳过滤器的优化 - 处理非常大的数据集

    我正在 MATLAB 中编写一个程序 必须使用 MATLAB 并且不能真正使用 MEX 来过滤大量数据 我需要实现的过滤器之一要求我将时间戳向量与其他时间戳不会出现的已知 不良 时间列表进行比较 一个典型的时间戳向量有大约 2 000 00
  • 将自动生成的 Matlab 文档导出为 html

    我想为我开发的 Matlab 工具箱生成完整的帮助 我已经看到如何显示自定义文档 http www mathworks fr fr help matlab matlab prog display custom documentation h
  • 两个 y 轴与相同的 x 轴[重复]

    这个问题在这里已经有答案了 可能的重复 在单个图中绘制 4 条曲线 具有 3 个 y 轴 https stackoverflow com questions 1719048 plotting 4 curves in a single plo
  • Matlab - 如果值包含xxx,则删除元胞数组中的行

    在 Matlab 中 如何删除包含变量字符串的元胞数组中的元胞 假设我的元胞数组是 C svnTrunk RadarLib radarlb utilities scatteredInterpolant m C svnTrunk RadarL
  • MATLAB 中最有效的矩阵求逆

    在 MATLAB 中计算某个方阵 A 的逆矩阵时 使用 Ai inv A should be the same as Ai A 1 MATLAB 通常会通知我这不是最有效的求逆方法 那么什么是更有效率的呢 如果我有一个方程系统 可能会使用
  • 句柄类和值类的区别

    我有一些 C 背景 想使用 Matlab 中的类 句柄和值类有什么区别 我知道如果我想定义一个带有重载运算符 例如 和 的矩阵类 我会使用值类 然而 有时 当我选择一个手柄类时 事情似乎只对我有用 MathWorks 提供了一些有关其用途的

随机推荐

  • STM32 电机教程 0 - MotorControl Workbench下载与安装

    前言 STM32微控制器提供了行业标准Arm Cortex M核心运行矢量控制或FOC模式的性能 广泛应用于空调 家用电器 无人机 建筑和工业自动化 医疗和电动自行车应用的高性能驱动器 STM32 MCSDK 电机控制软件开发工具包 固件
  • 扩散模型:Diffusion models as plug-and-play priors作为即插即用先验的扩散模型

    扩散模型 Diffusion models as plug and play priors作为即插即用先验的扩散模型 0 摘要 1 概述 2 方法 2 1 问题设置 2 2 将去噪扩散概率模型作为先验 3 实验 图像生成 3 1 MNIST
  • 搜狐畅游2018年9月15日校招真题(1)

    通过该道题目 题目描述如下 示例代码 include
  • mysql jdbc allow_mysql的jdbc.url携带allowMultiQueries=true参数的作用及其原理

    如下配置 jdbc url jdbc mysql 127 0 0 1 3306 chubb 2 autoReconnect true useUnicode true characterEncoding UTF 8 allowMultiQue
  • VMware 7.0

    在 vSphere 7 0 中 可以利用 vSphere Client HTML5 中提供的功能 基于 Flash 的 vSphere Web Client 已弃用且不再提供 VMware Host Client 是一个基于 Web 的应用
  • 纪录一下力扣28题越界的问题

    TOC 记录一下力扣28题用严蔚敏教材中的kmp求解出现的问题 ERROR42 不用怀疑数组越界了 贴上源码我们来分析一下 class Solution public void getNext vector
  • Canvas和SVG区别

    Canvas主要用笔刷来绘制2D图形 SVG主要用标签来绘制不规则矢量图 相同点 都是主要用来绘制2D图形 不同点 Canvas主要绘制位图 SVG主要绘制矢量图 不同点 SVG节点过多时渲染慢 Canvas性能更好一些 但写起来更复杂 不
  • 报错:Can‘t locate Win32/Console.pm in @INC (you may need to install the Win32::Console module)

    安装Open SSL中执行命令 perl Configure VC WIN32 no asm prefix C Dpan javaProject OpenSSL openssl 1 1 1b 出现以下错误 Can t locate Win3
  • Hi3516全系统类型烧录教程

    烧录资料下载 https gitee com hihope iot docs tree master HiSpark AI Camera Developer Kit Software tools 第一步 安装好hitool usb 烧写的驱
  • 鼠标右键添加git

    1 打开注册表 win R 输入regedit 2 找到HKEY CLASSES ROOT Directory Background目录 3 查看是否有shell这个目录 如果没有就添加 4 在shell目录下添加 项 鼠标右键点击新建 项
  • java-IO流(5)-IO流中的设计模式(装饰器模式和适配器模式)的介绍

    目录 1装饰器模式 1 1定义 1 2代码实现 1 3装饰器特点 1 4装饰器在IO流中的使用 2配适器模式 2 1Adapter适配器 2 2代码实例 2 3适配器特点 2 4适配器优缺点 2 5适配器在IO中的使用 3装饰器与适配器异同
  • C++中STL的string vector使用笔记

    文章目录 容器 STL使用的基本方式 常用容器的基本概念和使用 string容器的特性 string初始化 拼接 赋值 查找 初始化 赋值操作 取值操作 拼接操作 查找 string替换 比较 字串 插入和删除 替换 比较 截取子串 插入删
  • 对象池GenericObjectPoolConfig

    Apache commons pool本质上是 对象池 即通过一定的规则来维护对象集合的容器 commos pool在很多场景中 用来实现 连接池 任务worker池 等 大家常用的dbcp数据库连接池 也是基于commons pool实现
  • 互联网创业盈利模式指南

    看了很多创业的case 都有点下笔千言 离题万里的 情况 就是很多case都很精彩 但是公司 的价值最终是落实到 给创业者和投资人的回报的 因此 所有的case 最终都是 落实到盈利 模式上 一位投资人士说的很明确 中国的盈利模式很简单 就
  • 一、深度学习之anaconda以及Tensorflow的安装

    1 anaconda安装 在官网Free Download Anaconda下载anaconda5 2 Python3 6 按照下一步直到安装结束 注意 将两个选项都勾选上 将安装路径写入环境变量 2 安装Tensorflow 1 建立一个
  • 围棋吃子问题

    题目 Given a 2D board containing X and O capture all regions surrounded by X A region is captured by flipping all O s into
  • 浮生六记

    浮生六记 目录 浮生六记卷一 闺房记乐 002 浮生六记卷二 闲情记趣 015 浮生六记卷三 坎坷记愁 022 浮生六记卷四 浪游记快 034 浮生六记 2 浮生六记卷一 闺房记乐 余生乾隆癸未冬十一月二十有二日 正值太平盛世 且在 衣冠之
  • Android 性能优化系列:崩溃原因及捕获

    文章目录 崩溃的基本原因 抛出异常导致崩溃分析 AMS 如何承接应用的异常信息上报 对于 native crash 系统如何做处理 系统如何处理 ANR 异常数据 addErrorToDropBox DropBoxManager 在 Cra
  • 用简单易懂的话语来快速入门windows缓冲区溢出

    用简单易懂的话语来快速入门windows的缓冲区溢出教程 准备工具 immunity debugger https www immunityinc com products debugger WINDOWS的程序动态调试工具 Vulnser
  • matlab_多目标遗传算法

    前言 之前写过在python中的多目标遗传算法了 但是很可惜的是python调用商用有限元软件比较费事 需要在ironpython的编译环境下调用 然后这个ironpython它又是个老古董 不支持pandas和numpy这些python必