基于遗传算法和模拟退火算法改进的混合模拟退火算法(解决求函数极值问题,MATLAB代码已实现)_改进模拟退火算法-程序员宅基地

技术标签: 智能优化方法  混合模拟退火  函数优化  

基本思想:

混合模拟退火算法时遗传算法和模拟退火算法的结合,在混合模拟退火算法中使用了大量的样本作为问题的可能解决方案而不是将单个样本作为一个问题的可能解决方案。对遗传算法中适应的概念进行相应改进。

混合模拟退火的算法步骤如下:

1)将系统温度T设置为足够高的值。

2)随机的初始化人口。

3)人口随机初始化从现有种群中重复生成每个新种群,直到系统温度T达到一个令人满意的最小值。

1)执行N/2次;

2)从N个人口中随机选择两个父母;

3执行交叉操作产生两个后代,然后进行变异操作

4)在子女和父母之间进行玻尔兹曼试验;

5玻尔兹曼实验获胜者复写父母代染色体

6)周期性地降低系统温度T

4得出最优解

其中涉及到的相关改进操作如下:

交叉:
1.如果选择的父母要进行交叉,在他们的染色体上的一个随机点进行单点交叉产生两个孩子,然后转到变异操作。
2.如果父母不在交叉概率范围内,父母将进行比较。更好的父进程会覆盖另一个父进程。不进行变异操作。

变异:
1.生成的每个子节点将执行步骤24
2.随机选择邻居作比较,一个后代的n个邻居的扰动为N*Pn
3.比较扰动状态下的解,如果邻居比孩子好,就把孩子换掉。
4.基于变异操作重新复写子代染色体

玻尔兹曼试验:
1.用抛硬币的方式选择一个或两个接受/拒绝。
2.如果选择双重接受/拒绝,则取Ei = Eparent1 + Eparent2;Ej = Echild1 + Echild2 
3.
如果选择单一的接受/拒绝,取Ei = Eparent;Ej = Echild。这样做是为了测试每个孩子的父母。
4.最后用实验的获胜的来复写父代染色体

clear;
tic;
%%%%%%%%%%%%%%%%%%%%%%%%%%%INPUT ARGUMENTS%%%%%%%Sir Joel, dito po%%%%%%%%%
CostF = 2; % | 1 - DE JONGS | 2 - AXIS PARALLEL HYPER-ELLIPSOID | 3 - ROTATED HYPER-ELLIPSOID | 4 - RASTRIGINS | ow - ACKLEYS |
nVar = 3;
VarSize = zeros(nVar);
VarMin = -5.12; %upper bound of variable value
VarMax = 5.12; %lower bound of variable value
MaxIt = 100000;
T0 = 100000;
Tf = 0.0000000000000001;
alpha = 0.7;
nPop = 1000;
nMove = 50;
mu = 0.05;
sigma = 0.9;
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%Initialization Section%%%%%%%%%%%%%%%%%%%%%%%%%%%
initial_T = T0;                       %initial temperature of the system
cooling_stop = Tf;      %cooling stops when it reaches this temperature
test_func = CostF;  %sets the number of w/c test function to be solved
popsize = nPop;                         %Population Size
pc = sigma;                               %crossover rate
pm = mu;                               %mutation rate
cooling_ratio = alpha;      %sets the cooling ratio to 0.8  i.e. 0.7 < 0.8 < 0.9
ub = VarMax;
lb = VarMin;
ulb = ub;        %upper and lower bound
tpl = nVar;        %dimensions
num_neigh = nMove;                 %number of neighbors to consider
iteration_array = zeros(1);
fittest_array = zeros(1);
solution_array = VarSize;
%%
%%%%%%%%%%%%%%%%%%%%%%%%%HYBRID SIMULATED ANNEALING%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%I
cooling_sched = zeros(1);               %pre-allocation for speed
cooling_sched(1) = initial_T;                 %initializes the cooling schedule T0
%II
Chromosome = zeros(popsize,tpl);
for i=1:popsize
    Chromosome(i,:) = 2*ulb*(rand(1,tpl)-0.5);  %initializing first generation
end
%%
sched = 1;                              %index / iteration
while cooling_sched(sched) > cooling_stop     %iteration will stop if the cooling temperature reached less than 0.00000001 迭代终止条件
    T = cooling_sched(sched);               %设置温度T的值
    %执行N/2次
    for j=1:popsize/2
        %III.a.i. Select two parents at random随机选择两个父母
        red = abs(floor(popsize*rand(1))) + 1;  %two random chromosomes to compete
        blu = abs(floor(popsize*rand(1))) + 1;  %red and blu hold the index of the parents
        %III.a.ii. Generate two offsprings产生两个后代
        %%Recombination Operator (CROSSOVER)重新结合,交叉
        pc_trial = rand(1);
        if pc_trial < pc     %if trial made it in the crossover rate是否实验在交叉率下进行
            cp = floor(abs((tpl-1)*rand(1)))+1;   %random crossover point随机交叉点
            Child_Chromosome(1,:) = CROSSOVER(Chromosome(red,:),Chromosome(blu,:),cp,tpl);     %crossover red and blu两个父母进行交叉
            Child_Chromosome(2,:) = CROSSOVER(Chromosome(blu,:),Chromosome(red,:),cp,tpl);     %they will have two children产生两个孩子
            %%Neighborhood Operator (MUTATION)变异操作
            for k=1:2
                x_sol = Child_Chromosome(k,:);               
                for i=1:num_neigh
                    adrs = abs(floor(popsize*rand(1))) + 1; %获取人口中某个邻居的随机地址
                    x_tmp = Chromosome(adrs,:);    %随机选择额一个邻居做比较. with a decreasing amount of randomness
                    if OBJFUNC(x_tmp,tpl,test_func) < OBJFUNC(x_sol,tpl,test_func)  %比较之后选择好的
                        x_sol = x_tmp;
                    elseif OBJFUNC(x_tmp,tpl,test_func) > OBJFUNC(x_sol,tpl,test_func)  %if not, change the solution if it is lucky
                        delta = OBJFUNC(x_tmp,tpl,test_func) - OBJFUNC(x_sol,tpl,test_func);
                        p = P(delta,T);
                        q = rand(1);
                        if q <= p
                            x_sol = x_tmp; 
                        end
                    end
                end
                Child_Chromosome(k,:) = x_sol;           %基于变异操作重新复写子代染色体
            end
            %%III.a.iii. Boltzman Trials进行玻尔兹曼实验
            ARpossibility = rand(1);                    % <0.5 - Single Acceptance/Rejection | >=0.5 - Double Acceptance/Rejection
            if ARpossibility < 0.5 %%Case 1: Double Acceptance/Rejection
                E1 = OBJFUNC(Chromosome(red,:),tpl,test_func) + OBJFUNC(Chromosome(blu,:),tpl,test_func);
                E2 = OBJFUNC(Child_Chromosome(1,:),tpl,test_func) + OBJFUNC(Child_Chromosome(2,:),tpl,test_func);
                bp = BOLTZMAN(E1,E2,T);
                bp_trial = rand(1);
                if bp_trial >= bp
                    %%III.a.iv. Overwrite Parents with the Trial Winner
                    Chromosome(red,:) = Child_Chromosome(1,:);
                    Chromosome(blu,:) = Child_Chromosome(2,:);
                end
            else %%Case 2: Single Acceptance/Rejection
                E1 = OBJFUNC(Chromosome(red,:),tpl,test_func);
                E2 = OBJFUNC(Child_Chromosome(1,:),tpl,test_func);
                bp = BOLTZMAN(E1,E2,T);
                bp_trial = rand(1);
                if bp_trial >= bp
                    %%III.a.iv. Overwrite Parents with the Trial Winner
                    Chromosome(red,:) = Child_Chromosome(1,:);  %offsprings wins the trial
                end

                E1 = OBJFUNC(Chromosome(red,:),tpl,test_func);
                E2 = OBJFUNC(Child_Chromosome(2,:),tpl,test_func);
                bp = BOLTZMAN(E1,E2,T);
                bp_trial = rand(1);
                if bp_trial >= bp
                    %%III.a.iv. Overwrite Parents with the Trial Winner
                    Chromosome(red,:) = Child_Chromosome(2,:);  %offsprings wins the trial
                end

                E1 = OBJFUNC(Chromosome(blu,:),tpl,test_func);
                E2 = OBJFUNC(Child_Chromosome(1,:),tpl,test_func);
                bp = BOLTZMAN(E1,E2,T);
                bp_trial = rand(1);
                if bp_trial >= bp
                    %%III.a.iv. Overwrite Parents with the Trial Winner
                    Chromosome(blu,:) = Child_Chromosome(1,:);  %offsprings wins the trial
                end

                E1 = OBJFUNC(Chromosome(blu,:),tpl,test_func);
                E2 = OBJFUNC(Child_Chromosome(2,:),tpl,test_func);
                bp = BOLTZMAN(E1,E2,T);
                bp_trial = rand(1);
                if bp_trial >= bp
                    %%III.a.iv. Overwrite Parents with the Trial Winner
                    Chromosome(blu,:) = Child_Chromosome(2,:);  %offsprings wins the trial
                end
            end
            %%
        else                    %if the whole trial did not make it inside the crossover rate, it will have a tournament
            if OBJFUNC(Chromosome(red,:),tpl,test_func) > OBJFUNC(Chromosome(blu,:),tpl,test_func)    %competition
                Chromosome(red,:) = Chromosome(blu,:);      %Blue Wins the tournament and overwrites Red
            else
                Chromosome(blu,:) = Chromosome(red,:);      %Red Wins the tournament and overwrites Blue
            end
        end
    end
    %III.b. Periodically Lower T周期性的降低温度T
    %%
    %Post-Iteration-Evaluation
    F_obj = zeros(1);
    for i=1:popsize
       F_obj(i) = OBJFUNC(Chromosome(i,:),tpl,test_func);
    end
    %%
    fittest = F_obj(1);
    for i=1:popsize
        fi = 1;
        if fittest > F_obj(i)
           fittest = F_obj(i);
           fi = i;
        end
    end
    %%
    fittest_array(sched) = fittest;
    iteration_array(sched) = sched;
    solution_array(sched,:) = Chromosome(fi,:);

    cooling_sched(sched+1) = T*(cooling_ratio)^sched;
    sched = sched+1;
    if sched > MaxIt
        break;
    end
end
%%
%SOLUTION
if test_func == 1
fprintf('====================DE JONGS FUNCTION=============================\n');
elseif test_func == 2
fprintf('==============AXIS PARALLEL HYPER-ELLIPSOID FUNCTION==============\n');
elseif test_func == 3
fprintf('===============ROTATED HYPER-ELLIPSOID FUNCTION====================\n');
elseif test_func == 4
fprintf('====================RASTRIGINS FUNCTION===========================\n');
else
fprintf('=====================ACKLEYS FUNCTION=============================\n');
end
fprintf('==================HYBRID SIMULATED ANNEALING=======================\n');
fprintf('Population Size: %d\tCrossover Rate: %.2f\tMutation Rate: %.2f\tCooling Ratio: %.1f\n',popsize,pc,pm,cooling_ratio);
fprintf('Minimum Energy:\t\t\t\t\t\t\t\t\t%.16f\nTotal Runtime:\t\t\t\t\t\t\t\t\t%f seconds\nFinal Temperature:\t\t\t\t\t\t\t\t%.16f\n',fittest,toc,cooling_sched(sched));
fprintf('Global Minimum is at:\t\t\t\t\t\t');
disp(Chromosome(fi,:))
fprintf('===================================================================\n');
%%
figure
subplot(2,1,1);
plot(iteration_array,fittest_array);
legend('Cost Function Value');
xlabel('Generation');
ylabel('Fitness of fittest Chromosome');

solution_array = transpose(solution_array);
subplot(2,1,2);
plot(iteration_array,solution_array);
xlabel('Generation');
ylabel('Solution of fittest Chromosome');
%%

对于一个基准测试函数所做实验结果如下:

参数设置:

人口数:1000  交叉率:0.9 变异率:0.05  冷却比率:0.7

最小能量值:0.0149937292529736

邻居数:50

最大迭代次数:100000

初试温度:T0 = 100000

最终温度:Tf = 0.000000000000001;

温度下降率:alpha = 0.7;

目标函数值:0.0000005086849880

运行时间:1.743826 s

最终冷却温度:0.0000000000000000

全局最小值(-0.0444   -0.1056    0.0432)

鉴于很多同学问相关完整的代码实现,我把完整的代码和大家分享,希望能给大家帮助啦~

项目完整代码

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xs1997/article/details/103357654

智能推荐

openstack keystone 添加工程以及用户_openstack将用户加入到用户组-程序员宅基地

文章浏览阅读2.3k次。keystone用户管理可以通过rest api进行,也可以通过相关的命令行进行。python-keystone是keystone认证组件的一个客户端,提供了两种使用方式,(1)python编程接口 (2)命令行接口# Using token auth env variablesexport SERVICE_ENDPOINT=http://127.0.0.1:3535_openstack将用户加入到用户组

基于Python爬虫江苏南京餐厅餐馆数据可视化系统设计与实现(Django框架) 研究背景与意义、国内外研究现状-程序员宅基地

文章浏览阅读2.2k次,点赞21次,收藏19次。基于Python爬虫江苏南京餐厅餐馆数据可视化系统设计与实现(Django框架) 研究背景与意义、国内外研究现状毕设毕业设计源代码,经营者可以了解顾客的消费习惯、评价意见等信息,从而调整经营策略,提供更好的服务,增加顾客的满意度和忠诚度。消费者可以通过系统获得餐厅餐馆的基本信息、价格、评价等数据,从而能够更好地了解餐厅餐馆的情况,减少了选择就餐场所时的盲目性,提高了消费者的就餐体验。通过数据可视化的方式,餐厅餐馆可以直观地展示自己的特色、菜品、评价等信息,提高了餐厅餐馆的知名度和曝光率,吸引更多的潜在顾客。

AltiumDesigner学习笔记(一)——创建工程与原理图文件-程序员宅基地

文章浏览阅读472次。一、创建工程与原理图文件1、通过菜单创建PCB工程(1)File - New - Project - PCB Project,即可在当前工作区创建新的PCB工程(2)新建工程并不直接在硬盘中创建文件,需要保存:在工程面板中,右键单击新建的工程名 - Save Project,在弹出的对话框中,选择工程存储目录(一般需要为新建的工程新建一个专属目录)并命名工程。2、通过菜单或者工..._简述新建一个项目文件并在该项目文件下新建一个原理图文件的操作

自己动手编写 Windows 防止锁屏脚本程序_防锁屏脚本-程序员宅基地

文章浏览阅读1.4w次,点赞25次,收藏108次。背景介绍有些公司处于安全和保密工作考虑,会通过 Windows 组策略强制所有办公电脑在无操作的情况下 5 分钟或者 10 分钟自动锁屏,避免无关人士看到不该看的内容。作为程序员,十分反感这种一刀切的方案,一来很容易打断思路,比如正在写代码或者向别人展示时,突然锁屏了就挺恶心的;二来每次锁屏后都要输入密码,这简直就是浪费生命,不能忍!为了解决这个问题,我们可以编写一个简单的 vbs 脚本,在锁屏周期内模拟按键操作,从而避免 Windows 桌面被锁屏。之所以使用 vbs 脚本,而不是 Python、Ja_防锁屏脚本

MFC总结_mfc报告总结-程序员宅基地

文章浏览阅读559次。一、MFC类库概述MFC(Microsoft Foundation class)微软基本类(库),有时候也有人叫做微软基本类库,因为它确实是一个类库(物理上讲),而且非常庞大;它也是一个面向对象的应用程序架构(逻辑上),程序员利用它可以很方便搭建应用程序框架。MFC结合了面向对象的编程技术和WINDOWS消息驱动的编程技术,并封装了WIN32API,其设计好处:消除了WIN32API的复杂性,封装了WIN32API,统一了程序的概念,而且可扩展。MFC由AFX项目小组进化而来,还有一些AFX代码,如Af_mfc报告总结

Python机器学习笔记——随机森林算法-程序员宅基地

文章浏览阅读2.1k次。随机森林算法的理论知识  随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法。随机森林非常简单,易于实现,计算开销也很小,但是它在分类和回归上表现出非常惊人的性能,因此,随机森林被誉为“代表集成学习技术水平的方法”。一,随机森林的随机性体现在哪几个方面?1,数据集的随机选取  从原始的数据集中采取有放回的抽样(bagging),构造子数据集,子数据集的数据量是和原始数..._python随机森林算法

随便推点

Axure RP医疗在线挂号问诊原型图医院APP原形模板_医疗app原型-程序员宅基地

文章浏览阅读1.1k次。本套原型图主要功能有医疗常识科普、医院挂号、排队预约、在线问诊、医院查找等,基本所有模块都是原创设计。同时页面中使用了大量的动态面板效果,制作了仿真的预约弹窗、医院详情介绍等。你可以将页面直接套用在类似项目上,或直接在模板上拓展页面,快速搭建出高质量的医疗类APP。医疗在线挂号问诊Axure RP原型图医院APP原形模板,是一款原创的医疗类APP,设计尺寸采用iPhone13(375*812px),原型图上加入了仿真手机壳,使得预览效果更加逼真。_医疗app原型

深度缓存算法-程序员宅基地

文章浏览阅读3.5k次,点赞2次,收藏4次。通常用z轴来计算各对象的距观察平面的距离。处理每一面时,将其到观察平面的深度与前面已经处理表面进行比较。如果一个表面比任一已处理表面都近,则计算其表面颜色并和深度一起存储。场景的可见面由一组在所有表面处理完后存储的表面来表示。该算法需要两个缓存器,一个用来存放颜色的颜色缓存器,一个用来存放深度的深度缓存器。利用深度缓存器进行可见性的判断,消除隐藏对象。其具体做法是首先对深度缓存器和颜色缓存器进行初..._深度缓存算法

正弦交流电电压电流峰值与有效值关系的推导-程序员宅基地

文章浏览阅读8k次,点赞2次,收藏3次。类似的,设有效电流为I_电流有限值推导

MVC ViewModel_mvc viewmodel name id-程序员宅基地

文章浏览阅读1.4k次。项目图我们来看看自动生成的T_UserInfo.cs类下面我们创建一个T_UserInfoValidate.cs类 作为与T_UserInfo对应的实体类using System;using System.Collections.Generic;using System.ComponentModel;using System.ComponentModel._mvc viewmodel name id

使用ZooKeeper实现队列_zookeeper中要实现优先队列-程序员宅基地

文章浏览阅读6.1k次。实现原理先进先出队列是最常用的队列,使用Zookeeper实现先进先出队列就是在特定的目录下创建PERSISTENT_SEQUENTIAL节点,创建成功时通知等待的队列,队列消费序列号最小的节点。此场景下Zookeeper的znode用于消息存储,znode存储的数据就是消息队列中的消息内容,SEQUENTIAL序列号就是消息的编号,按序取出即可。由于创建的节点是持久化的,所以不必_zookeeper中要实现优先队列

Python爬虫——爬取淘宝商品做数据挖掘分析实战篇 教程_python爬虫淘宝图片-程序员宅基地

文章浏览阅读4k次,点赞14次,收藏93次。项目内容本案例选择>> 商品类目:沙发;数量:共100页 4400个商品;筛选条件:天猫、销量从高到低、价格500元以上。项目目的1. 对商品标题进行文本分析 词云可视化2. 不同关键词word对应的sales的统计分析3. 商品的价格分布情况分析4. 商品的销量分布情况分析5. 不同价格区间的商品的平均销量分布6. 商品价格对销量的影响分析7. 商品价格对销售额的影响分析8. 不同省份或城市的商品数量分布9.不同省份的商品平均销量分..._python爬虫淘宝图片

推荐文章

热门文章

相关标签