数学建模系列:遗传算法

简介

遗传算法(Genetic Algorithms,GA)是一种基于自然选择原理和自然遗传机制的搜索(寻优)算法,它是模拟自然界中的生命进化进制,在人工系统中实现特定目标而优化。遗传算法的实质是通过群体搜索技术,更具适者生存的原则逐代进化,最终得到最优解或准最优解。它必须做以下操作:初始群体的产生、求每一个体的适应度、根据适者生存的原则选择优良个体、被选出的优良个体两两配对,通过随机交叉其染色体的基因并随机变异某些染色体的基因生成下一代群体,按此方法使群体逐代进化,直到满足进化终止条件。

生物遗传概念 遗传算法中的作用
适者生存 算法停止时,最优目标值的可行解有最大可能被留住
个体 可行解
染色体 可行解的编码
基因 可行解中每一分量的特征
适应性 适应度函数
种群 根据适应度函数值选取的一组可行解
交配 通过交配原则产生一组新可行解的过程
变异 编码的某一分量发生变化的过程

——《数学建模算法与应用》(司守奎)

模型及算法

用遗传算法解决前面的文章实例2中提到的问题

种群大小M=50;最大代数G=1000;

交叉率\(p_c=1\),交叉概率为1能保证种群的充分进化;

变异率\(p_m=0.1\),一般而言,变异发生的可能性较小。

  1. 编码策略

    采用十进制编码,用随机数列\(w_1,w_2,···,w_{21}\)作为染色体,其中\(0 \le w_i \le 1(i=2,3,···,20),w_1=0,w_21=1\);每一个随机序列都和种群中的一个个体一一相对应

  2. 初始种群

    先利用经典的近似算法——改良圈算法求得一个较好的初始种群。

    对于随机产生的初始圈
    \[
    C=C_1···C_{u-1}C_uC_{u+1}···C_{v-1}C_vC_{v+1}···C_{21} ,2 \le u < v \le 20,2 \le C_u <C_v \le 20
    \]
    交换 uv 之间顺序,新的路径为
    \[
    C_1···C_{u-1}C_vC_{v+1}···C_{u+1}C_uC_{v+1}···C_{21}
    \]
    记 \(\Delta f=(d_{c_{u-1}c_v}+d_{c_{u}c_{v+1}})-(d_{c_{u-1}c_u}+d_{c_{v}c_{v+1}})\),若\(\Delta f<0\),则以新路径修改旧的路径,直到不能够修改为止,就得到一个可行解

    直到产生M个可行解,并把这M个可行解转换成染色体编码

  3. 目标函数

    目标函数为侦察所有目标的路径长度,适应度函数就取为目标函数。要求
    \[
    min f(C_1,···,C_{21})=\sum_{i=1}^{21}d_{c_ic_{i+1}}
    \]

  4. 交叉操作

    交叉操作采用单点交叉。对于选定的两个父代个体\(f_1=w_1w_2···w_{21},f_2=w_1^,w_2^,···w_{21}^,\)随机的选取第 t 个基因处为交叉点,则经过交叉运算后得到的子代个体为\(s_1\)和\(s_2,s_1\)的基因由\(f_1\)的前 t 个基因和\(f_2\)的后21 - t个基因构成,\(s_2\)的基因由\(f_2\)的前 t 个基因和\(f_1\)的后21 - t个基因构成。

  5. 变异操作

    按照给定的变异率,对选定变异的个体,随机的选取三个整数,满足 1<u<v<w<21 ,把 u,v 之间(包括)的基因段插到 w的后面

  6. 选择

    采用确定性的选择策略,也就是在父代种群和子代种群中选择目标函数值最小的M个个体进化到下一代,这样可以保证父代的优良特性被保存下来。

Matlab代码

clc,clear;
close all;

% 读取数据
data=load('data.txt');
x = data(:, 2);
y = data(:, 3);
start=[data(1,2),data(1,3)];
data = [data(:,[2 3]); start];

% 计算距离的邻接表
count = length(data(:, 1));
d = zeros(count);  %距离矩阵d初始化
for i = 1:count-1
    for j = i+1:count
        d(i,j)=( sum( ( data( i , : ) - data( j , : ) ) .^ 2 ) ) ^ 0.5 ;
    end
end
d =d + d';  % 对称  i到j==j到i
w=50;   % 种群个数
g=100;  % 进化代数
rand('state', sum(clock));  % 初始化随机数发生k器

% 通过改良图算法选取初始种群w
for k = 1:w
    c = randperm(count-2);  % 产生一个1-19的全排列
    c1 = [1,c+1,count]; % 生成初始解
for t = 1:count  % 修改圈
        flag = 0;  % 退出标志
        for m = 1:count-2
            for n = m+2:count-1
                if d(c1(m),c1(n))+d(c1(m+1),c1(n+1)) < d(c1(m),c1(m+1))+d(c1(n),c1(n+1))
                    c1(m+1:n) = c1(n:-1:m+1);
                    flag = 1;
                end
            end
        end
        if flag == 0
            J(k,c1)=1:count;
            break     % 记录下较好的解并退出当前循环
        end
    end
end
J(:,1) = 0;
J = J/count;  % 把整数序列转换成[0,1]区间上的实数,即转换成染色体编码

% 遗传算法
for k = 1:g
    A = J;  % 交配产生子代A的初始染色体
    c = randperm(w);  % 产生下面交叉操作的染色体对
    for i = 1:2:w
        F = 2+floor((count-2)*rand(1));  % 产生交叉操作的地址
        temp = A(c(i),[F:count]);  % 中间变量的保存值
        A(c(i+1), [F:count]) = A(c(i+1),[F:count]);  % 交叉操作
        A(c(i+1),F:count) =  temp;
    end
    by = [];  % 为了防止下面产生空地址,先初始化
    while isempty(by)
        by = find(rand(1,w)<0.1);  % 产生变异操作的地址
    end
    B=A(by,:);  % 产生变异操作的初始染色体

    for j=1:length(by)
        bw=sort(2+floor((count-2)*rand(1,3)));  % 产生变异操作的3个地址
        B(j,:)=B(j,[1:bw(1)-1,bw(2)+1:bw(3),bw(1):bw(2),bw(3)+1:count]);% 交换位置
    end
    G=[J;A;B];  % 父代和子代种群合在一起

    [SG,ind1] = sort(G,2); % 把染色体翻译成1···21的序列ind1
    num = size(G,1);
    long = zeros(1,num); %路径长度的初始值
    for j = 1:num
        for i = 1:count-1
            long(j)=long(j)+d(ind1(j,i),ind1(j,i+1)); % 计算每条路径长度
        end
    end
    [slong,ind2]=sort(long);  % 对路径长度从小打到排序

end
path = ind1(ind2(1),:);
flong=slong(1);

for i =1:count
   data1(:, i) = data(path(1,i), :)';
end

plot(x, y, '*', data1(1, :), data1(2, :), 'r');
title( [ '近似最短路径如下,路程为' , num2str( flong ) ] ) ;
disp(flong);

原文地址:https://www.cnblogs.com/CH42e/p/12286336.html

时间: 2024-10-25 14:24:08

数学建模系列:遗传算法的相关文章

数学建模系列:模拟退火算法

引言 模拟退火算法基于Monte-Carlo迭代求解策略的一种随机寻优算法,其出发点是基于物理中固体物质的退火过程与一般组合优化问题之间的相似性.模拟退火算法从某一较高初温出发,伴随温度参数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概率性地跳出并最终趋于全局最优.模拟退火算法是一种通用的优化算法,理论上算法具有概率的全局优化性能,目前已在工程中得到了广泛应用,诸如VLSI.生产调度.控制工程.机器学习.神经网络.信号处理等领域. 模拟退火算法是通过赋予搜

[数学建模(三)]遗传算法与旅行商问题

clc,clear sj=load('data3.txt') %加载敌方100 个目标的数据 x=sj(:,1); y=sj(:,2); d1=[70,40]; sj0=[d1;sj;d1]; %增加一个点[70,40]作为首尾 sj=sj0; d=zeros(102); %距离矩阵d % 通过向量化的方法计算距离矩阵 amount = size(sj,1); dist_matrix = zeros(amount, amount); coor_x_tmp1 = sj(:,1) * ones(1,

在数学建模中学MATLAB

为期三周的数学建模国赛培训昨天正式结束了,还是有一定的收获的,尤其是在MATLAB的使用上. 1. 一些MATLAB的基础性东西: 元胞数组的使用:http://blog.csdn.net/z1137730824/article/details/39206823 对于任意文件夹的同一格式的图片的批量读取:http://blog.csdn.net/haizimin/article/details/39646595 关于MATLAB在微分/偏微分方程以及其他高等数学问题中的应用. 关于MATLAB在

数学建模需掌握的知识总纲

数学建模需要掌握许多知识,这里我列出总纲: 学建模中的算法 穷举法 神经网络 模拟退火 遗传算法 图论算法 蒙特卡洛算法 所需基础知识 高等数学 线性代数(矩阵加减乘除) 概率论与数理统计(概率论,参数估计,假设检验,回归分析) 评价 AHP模型(层次分析) 模糊评价 预测 分析场景 曲线拟合 模糊预测 神经网络 灰色理论 马尔科夫链 运筹 整数规划(分支界定法) 01规划 灵敏度分析 影子价格 概率统计 排队论 主成分分析法 回归分析法 曲线拟合 图论 动态规划 网络最大流 最小费用流 最短路

数学建模竞赛题目

建模意义 思考方法 数学建模是一种数学的思考方法,是运用数学的语言和方法,通过抽象.简化建立能近似刻画并"解决"实际问题的一种强有力的数学手段. 数学建模就是用数学语言描述实际现象的过程.这里的实际现象既包涵具体的自然现象比如自由落体现象,也包含抽象的现象比如顾客对某种商品所取的价值倾向.这里的描述不但包括外在形态,内在机制的描述,也包括预测,试验和解释实际现象等内容. 我们也可以这样直观地理解这个概念:数学建模是一个让纯粹数学家(指只研究数学而不管数学在实际中的应用的数学家)变成物理

数学建模常用的十大算法

数学建模常用的十大算法==转 (2017-07-16 11:26:14) 转载▼ 1. 蒙特卡罗算法.该算法又称随机性模拟算法,是通过计算机仿真来解决问题的算法,同时可以通过模拟来检验自己模型的正确性,几乎是比赛时必用的方法. 2. 数据拟合.参数估计.插值等数据处理算法.比赛中通常会遇到大量的数据需要处理,而处理数据的关键就在于这些算法,通常使用MATLAB 作为工具. 3. 线性规划.整数规划.多元规划.二次规划等规划类算法.建模竞赛大多数问题属于最优化问题,很多时候这些问题可以用数学规划算

2015 数学建模竞赛 入门与提高 读书笔记

<数学建模竞赛入门与提高> 第1章:数学建模概述 近半个多世纪以来,数学已经走进了各大领域,而与其他学科相结合形成交叉学科,首要的关键一步就是建立研究对象的数学模型,并加以计算求解,数学建模和计算机技术在知识经济时代的作用可谓是如虎添翼. 1.1  初入门径--认识数学模型与数学建模 数学建模就是用数学语言描述实际现象的过程,这里的实际现象包含具体的自然现象,也包含抽象的比如顾客对某种商品所取的价值倾向.这里的描述不但包括外在形态,内在机制的描述,也包括预测,试验和解释评价实际现象等内容. 数

数学建模学习笔记(建模中的十大常用算法总结)

数学建模中的十大常用算法 1.    蒙特卡洛方法: 又称计算机随机性模拟方法,也称统计实验方法.可以通过模拟来检验自己模型的正确性. 2.    数据拟合.参数估计.插值等数据处理 比赛中常遇到大量的数据需要处理,而处理的数据的关键就在于这些方法,通常使用matlab辅助,与图形结合时还可处理很多有关拟合的问题. 3.    规划类问题算法: 包括线性规划.整数规划.多元规划.二次规划等:竞赛中又很多问题都和规划有关,可以说不少的模型都可以归结为一组不等式作为约束条件,几个函数表达式作为目标函

2015年“深圳杯”数学建模夏令营-B题:DNA序列的k-mer index 问题

这是一个山科大的同学给我的一个问题,向我询问一下思路,对于数学建模,我没太多的了解,所以只能用计算机程序的方法来解答. 这是具体的问题: 这个问题来自 DNA序列的k-mer index问题. 给定一个DNA序列,这个系列只含有4个字母ATCG,如 S ="CTGTACTGTAT".给定一个整数值k,从S的第一个位置开始,取一连续k个字母的短串,称之为k-mer(如k= 5,则此短串为CTGTA), 然后从S的第二个位置, 取另一k-mer(如k= 5,则此短串为TGTAC),这样直至