【GA】曲面极值寻优&GA-PSO-程序员宅基地

技术标签: # 启发式算法  GA-PSO  

GA对peaks函数进行极值寻优

peaks函数
f ( x , y ) = 3 ( 1 − x ) 2 exp ⁡ ( − x 2 − ( y + 1 ) 2 ) − 10 ( x 5 − x 3 − y 5 ) exp ⁡ ( − x 2 − y 2 ) − 1 3 exp ⁡ ( − ( x + 1 ) 2 − y 2 ) f(x, y)=3(1-x)^2\exp(-x^2-(y+1)^2)-10(\frac{x}{5}-x^3-y^5)\exp(-x^2-y^2)-\frac{1}{3}\exp(-(x+1)^2-y^2) f(x,y)=3(1x)2exp(x2(y+1)2)10(5xx3y5)exp(x2y2)31exp((x+1)2y2)
peaks

使用GA Toolbox进行寻优计算,对比fmincon寻优结果

clc;
clear all;
close all;

peaks
problem = createOptimProblem('fmincon', 'objective', @(x) peaks(x(:, 1), x(:, 2)), 'nonlcon', @circularConstraint, ...
    'x0', [-1, 1], 'lb', [-3, 3], 'ub', [3 3]);

% fmincon for the optimal values
[x1, f1] = fmincon(problem);

% GA for global optimal values
problem.solver = 'ga';
problem.fitnessfcn = problem.objective;
problem.nvars = 2;
problem.options = gaoptimset('PopInitRange', [-3; 3]);

GA-PSO寻优

PSO在计算函数极值时,会出现早熟现象,导致求解函数极值存在较大的偏差,而遗传算法中对于函数采用了Select, Mutation, Cross等算子操作,直接以目标函数作为搜索信息,可以提高PSO算法的全局寻优能力,加快了算法的进化速度,且可以提高算法的收敛精度。

clc;
clear all;
close all;

%% initialize parameters
lenchrom = 3;
pc = 0.7; % probability of cross
pm = 0.3; % probability of mutation

% parameters of PSO
c1 = 1.49445;
c2 = 1.49445;

maxgen = 100;
popsize = 30;

% Velocity of update particles
Vmax = 1;
Vmin = -1;

% Population
popmax = 15;
popmin = 0;

% Range
bound = [popmin popmax; popmin popmax; popmin popmax];

% number of particles for optimizing
par_num = 3;

%% initial particles & velocity
for i=1:popsize
    % generate a population randomly
    pop(i, :) = 3*abs(rands(1, par_num));
    V(i, :) = rands(1, par_num);
    fitness(i) = func(pop(i, :));
end

% find the best chromosome
[bestfitness, bestindex] = min(fitness);
zbest = pop(bestindex, :);
gbest = pop;
fitnessgbest = fitness;
fitnesszbest = bestfitness;

% find the optimal value
for i=1:maxgen
    i
    for j = 1:popsize
        % Velocity: PSO
        V(j, :) = V(j, :)+c1*rand*(gbest(j, :)-pop(j, :))+c2*rand*(zbest- pop(j, :));
        V(j, find(V(j, :)>Vmax)) = Vmax;
        V(j, find(V(j, :)<Vmin)) = Vmin;
        
        % Population: PSO
        pop(j, :) = pop(j, :)+0.5*V(j, :);
        pop(j, find(pop(j, :)>popmax)) = popmax;
        pop(j, find(pop(j, :)<popmin)) = popmin;
        
        % Cross: GA
        GApop = Cross(pc, lenchrom, pop, popsize, bound);
        % Mutation: GA
        GApop = Mutation(pm, lenchrom, GApop, popsize, [i maxgen], bound);
        
        pop = GApop;
        
        % fitness --> constraint
        if pop(j, 1)-pop(j, 2)+pop(j, 3)<=20
            if 3*pop(j, 1)+2*pop(j, 2)+4*pop(j, 3)<=42
                if 3*pop(j, 1)+2*pop(j, 2)<=30
                    fitness(j) = func(pop(j, :));
                end
            end
        end
        
        % update the individual optimal value
        if fitness(j) < fitnessgbest(j)
            gbest(j, :) = pop(j, :);
            fitnessgbest(j) = fitness(j);
        end
        
        % update the population optimal value
        if fitness(j) < fitnesszbest
            zbest = pop(j, :);
            fitnesszbest = fitness(j);
        end
    end
    yy(i) = fitnesszbest;
end

%% results & plot
disp '*********************best particle number**********************'
zbest

plot(yy, 'linewidth', 1.5);
grid on;
title(['Fitness Curve ' 'Generations of Stopping: ' num2str(maxgen)]);
xlabel('Generation of evolution');
ylabel('Fitness');

GA-PSO

Issue: Code

二进制编码的结构不能直接反映问题的固有结构,精度不高,个体长度大以及占用较多的内存。解决该问题的方法有:

  1. 动态编码,在保持串长不变的情况下减少搜索区域,当算法收敛到某局部最优时增加搜索精度,使得算法可以在全局最优点附近进行更加精细化的搜索。
  2. 对于问题变量时实向量的情况,可以直接采用实数编码
  3. 复数编码是为了描述和求解二维问题
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_18822147/article/details/116480442

智能推荐

监听器Listener_listener监听器-程序员宅基地

文章浏览阅读1.6k次,点赞4次,收藏13次。(1) 实现了特定接口的类为监听器,用来监听另一个java类的方法调用或者属性改变; (2)当被监听的对象发生了方法调用或者属性改变后,监听器的对应方法就会立即执行。 监听器涉及到以下几个组成部分: 1、事件源:被监听的对象,即:request、session、servletContext三大域对象。 2、监听器:监听事件源对象,事件源对象状态的变化都会触发监听器 3、注册_listener监听器

django.core.exceptions.ImproperlyConfigured: SQLite 3.9.0 or later is required (found 3.7.17)-程序员宅基地

文章浏览阅读5.8k次,点赞11次,收藏22次。各版本信息:python版本[root@test ~] python3 --versionPython 3.8.5Django版本:>>> import django>>> django.get_version()'3.2.7'sqlite3版本:>>> import sqlite3>>> sqlite3.sqlite_version'3.6.20'启动报错:[root@test ~] python3 _django.core.exceptions.improperlyconfigured: sqlite 3.9.0 or later is requir

centos安装mysql怎么远程访问_centos上安装mysql并设置远程访问的操作方法-程序员宅基地

文章浏览阅读180次。1.下载mysql的repo源2.安装mysql-community-release-el7-5.noarch.rpm包$ sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm安装这个包后,会获得两个mysql的yum repo源:/etc/yum.repos.d/mysql-community.repo,/etc/yum.repos.d/m..._centos6.2 mysql5.1 远程访问

Vue组件(三)-内置组件component、transition、 transition-group、keep-alive、slot_小程序类似transtion-group组件-程序员宅基地

文章浏览阅读1.1k次。Vue 的内置组件component组件动态绑定组件,根据数据不同更换不同的组件,component通过属性is的值可以渲染不同的组件。<component :is="currentTabComponent"></component>transition组件为组件的载入和切换提供动画效果transition-group组件作为多个元素/组件的过渡效果keep-alive组件能在组件切换过程中将状态保留在内存中,防止重复渲染DOM。包裹动态组件时,会缓存不活动的组件_小程序类似transtion-group组件

STM32与陀螺仪、加速度计传感器的数据融合与姿态估计_加速度计和陀螺仪数据融合-程序员宅基地

文章浏览阅读626次,点赞5次,收藏6次。下面是一个简单的示例代码,演示了如何在STM32上实现对陀螺仪和加速度计数据的读取和融合,以实现姿态估计功能。本文将介绍如何将陀螺仪和加速度计传感器与STM32微控制器结合使用,通过数据融合算法实现对物体姿态的估计。提供稳定的电源以满足STM32、陀螺仪和加速度计的工作需求,建议采用稳压电源或者电池供电。将陀螺仪和加速度计的引脚连接到STM32的对应引脚,通常通过I2C或SPI接口进行通信。通过合理的硬件设计和软件编程,可以针对具体的应用和需求进行姿态估计算法的优化和定制。_加速度计和陀螺仪数据融合

git 命令-程序员宅基地

文章浏览阅读60次。为什么80%的码农都做不了架构师?>>> ...

随便推点

dpdk l2fwd 应用流程分析-程序员宅基地

文章浏览阅读431次。intMAIN(int argc, char **argv){ struct lcore_queue_conf *qconf; struct rte_eth_dev_info dev_info; int ret; uint8_t nb_ports; uint8_t nb_ports_available; uint8_t portid, l..._cause: all available ports are disabled. please set portmask.

上下文切换,你确定了解吗?-程序员宅基地

文章浏览阅读1.7k次,点赞4次,收藏14次。上下文是指进程(或线程)的运行环境,它包括了当前执行的代码位置、寄存器内容、栈指针、内存映像、打开的文件、网络连接等状态信息。而上下文切换则是指当一个进程由于某种原因需要放弃 CPU 的控制权时,操作系统将它的上下文保存下来,并恢复另一个进程的上下文以便让其继续执行。_上下文切换

基于SSM+VUE的药品销售管理系统的设计与实现-程序员宅基地

文章浏览阅读2.5k次,点赞3次,收藏59次。研究的背景与意义随着互联网技术的快速发展,网络时代的到来,网络信息也将会改变当今社会。各行各业在日常企业经营管理等方面也在慢慢的向规范化和网络化趋势汇合。药店药品销售系统的信息化程度体现在将互联网与信息技术应用于经营与管理,以现代化工具代替传统手工作业。无疑,使用网络信息化管理使信息管理更先进、更高效、更科学,信息交流更迅速。对于之前药店系统的管理,大部分都是使用传统的人工方式去管理,这样导致了管理效率低下、出错频率高。而且,时间一长的话,积累下来的数据信息不容易保存,对于查询、更新还有维护会带来不少问

Centos8上安装中文字符集zh_CN.UTF-8_zh_cn.utf8和zh_cn.utf-8-程序员宅基地

文章浏览阅读5.7k次。先查看当前的字符集locale #查看环境字符集locale -a #查看平台所有字符集$ echo $LANGen_US.UTF-8安装中文字符集 yum install glibc-common yum install -y langpacks-zh_CN vim /etc/locale.conf # 修改locale.conf文件 LANG=zh_CN.utf8 source /etc/locale.conf查看修改后字符集$ echo $LANGzh_CN._zh_cn.utf8和zh_cn.utf-8

navicat查看mysql连接数据库_使用Navicat for MySQL数据库连接服务器中的MySQL服务-程序员宅基地

文章浏览阅读2.8k次。本文主要向大家介绍了使用Navicat for MySQL数据库连接服务器中的MySQL服务,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。第一步:登录mysql服务器,新建一个用户。在mysql安装中,默认的有root用户,但是root用户的默认连接Host也是localhost或127.0.0.1,也就是限制了root用户作为本地连接使用。登录mysql服务进入到mys..._navicat怎么查看已连数据库的账号连接信息

小组查经分享《创世记》--概述-程序员宅基地

文章浏览阅读5.6k次。我们知道整本圣经分为新约和旧约,从这个划分上可以看出,圣经其实可以用一个字来概括,即“约”字。什么是约呢?约就是神人关系的规范。所以我们首先从约的角度来看看创世纪的信息。 一、亚当之约(行为之约) 创世纪第一章记载了神六天的创造之工,第二章就让我们看到人被造的详细过程,并亚..._亚当之约的内容是什么