Matlab实现 遗传算法 无向图结点分成两类使得两类间边数最少 数学建模作业

这篇具有很好参考价值的文章主要介绍了Matlab实现 遗传算法 无向图结点分成两类使得两类间边数最少 数学建模作业。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

输入:一个图的邻接矩阵G,n1,n2 (举例n1=16,n2=1)

输出:节点的分类id(第一类为0,第二类为1,0的个数为n1个, 1的个数为n2个)

目标:使得两类之间的边数最少

算法:遗传算法

目录

步骤1:初始化种群,种群个数,随机生成初始种群

步骤2:交叉算子

步骤3:突变算子

步骤4:计算适应度,进行种群的优化选择

步骤5:将代码组合起来

步骤6:画图


给出如下邻接矩阵

0    1    0    0    0    0    0    0    0    0    0    1    0    0
0    1    0    0    0    0    0    0    0    0    1    0    0    0
0    0    0    0    0    0    0    1    1    0    0    0    1    0
0    0    0    0    0    0    0    0    0    0    0    0    0    0
0    0    0    0    0    0    0    0    0    0    0    0    0    0
0    0    0    0    0    0    0    0    0    0    0    0    0    0
0    0    0    0    0    0    0    0    0    0    0    0    0    0
0    0    0    0    0    0    0    0    0    0    0    0    0    0
0    0    0    0    0    0    0    0    0    0    1    0    1    1
0    0    0    0    0    0    0    0    0    0    0    0    0    1
0    0    0    0    0    0    0    0    0    0    0    0    0    0
0    0    0    0    0    0    0    0    0    0    0    0    0    0
0    0    0    0    0    0    0    0    0    0    0    0    0    0
0    0    0    0    0    0    0    0    0    0    0    0    0    1
0    0    0    0    0    0    0    0    0    0    0    0    1    1
0    0    0    0    0    0    0    0    0    0    0    0    1    1
0    0    0    0    0    0    0    0    0    0    0    0    0    0
0    0    0    0    0    0    0    0    0    0    0    0    0    0
0    0    0    0    0    0    0    0    0    0    0    0    1    1
0    0    0    0    0    0    0    0    0    0    0    0    0    1
0    0    0    0    0    0    0    0    0    0    0    0    1    1
0    0    0    0    0    0    0    0    0    0    0    0    0    0
0    0    0    0    0    0    0    0    0    0    0    0    1    1
0    0    0    0    0    1    0    1    0    1    0    0    1    1
0    0    0    0    0    1    0    1    0    0    0    1    0    0
0    0    0    1    1    0    0    0    0    0    0    1    0    0
0    0    0    0    0    0    0    0    0    1    0    0    0    1
0    0    0    1    1    0    0    0    0    0    0    0    0    1
0    0    0    0    0    0    0    0    0    0    0    1    0    1
0    0    0    1    0    0    1    0    0    0    0    0    1    1
0    0    0    0    0    0    0    0    0    0    0    0    1    1
0    0    0    0    1    1    0    0    1    0    0    0    1    1
1    0    1    1    0    0    0    0    0    1    1    1    0    1
1    0    1    1    0    0    1    1    1    1    1    1    1    0


步骤1:初始化种群,种群个数,随机生成初始种群

population = cell(1,100);
k=1;
 %随机选取100个种群
for i = 1:100
    a = randperm(34);
    a(find(a <= n1)) = 1;
    a(find(a > n1)) = 0;
    population(i) = {a};
end

        randperm():此 MATLAB 函数 返回行向量,其中包含从 1 到 n 没有重复元素的整数随机排列。找到1~16在数组a的位置,将此位置的数值置1,同理,17~34置0。

        这样就得到了一个值全是0或1的数组,0和1各表示一个分类,将34个点分为两类。重复100次,形成一个元胞数组,即为100个将结点分为两类的种群。

        更详细的一般编码步骤可以在其他文章搜到,但本题不涉及故不提及。


步骤2:交叉算子

 %交叉
    g = 1;
    count = 1;
    %总交叉次数小于500或得到40对交叉后存活的新个体
    while g <= 500 && count <= 40    
    e = sort(randperm(34,2));
    f = randperm(20,2);
    ransetia = cell2mat(population(f(1)));
    ransetib = cell2mat(population(f(2)));
    %存活条件为交叉前后两组点的数量不变
    if sum(ransetia(e(1):e(2))) == sum(ransetib(e(1):e(2)))
        lingshi = ransetia(e(1):e(2));
        ransetia(e(1):e(2)) = ransetib(e(1):e(2));
        ransetib(e(1):e(2)) = lingshi;
        population(19+2*count) = {ransetia};
        population(20+2*count) = {ransetib};
        count = count+1;
    end
    g = g+1;
    end

让我们先设定词义  种群=染色体

        编码的交叉类比染色体交叉,交叉的编码段位置及长度由randperm随机出来,在此题中要满足分出的两类数量为16和18,故交叉出的染色体也要满足条件,ransetia、ransetib中1的数量仍然保持为16,不满足的则直接被淘汰,满足的加入种群。

        总交叉次数500可以自己视情况设定,count达到40停止,意思是生成40*2=80个新种群,更新元胞数组21~100位置的种群,前20个是上一次迭代保留的优秀种群,下文会提到。


步骤3:突变算子

        任选一个种群,选出两个结点,如果一个是0一个是1,将其突变为1和0,即在交换所属于不同类两个结点的位置。突变次数counter设置为80次,可以视情况改变。

%变异
    counter = 1;
    while counter <= 80
        c = randperm(34,2);
        r = cell2mat(population(randperm(100,1)));
        if sum(r(c)) == 1
            r(c) = r(c)*(-1)+1;
            population(20+counter) = {r};
            counter = counter+1;
        end
    end  

步骤4:计算适应度,进行种群的优化选择

        适应度的测度:1/(两类结点之间连接的边数+1) 分母加一是以防分成互相之间没有边连通的两类时导致分母变为0出错。

 %适应度
    fitness = [];
    %计算适应度
    for i = 1:100
        x = cell2mat(population(i));
        b = Adjacency_matrix-x ;
        fitness(i) = 1/(length(find(b(find(x == 1),:)==1))+1);
    end

    [fitness,Index] = sort(fitness,"descend");
    %将每次迭代的最大适应度保存,便于后续画图
    maxfit(k) = fitness(1);
    %保存该次迭代的总体适应度水平
    general_fit(k) = mean(fitness);
    %淘汰80个种群
    population(Index(21:100)) = [];      
    

        精英数量直接设置成了最优的前20个,并没有根据优劣程度排序进行轮盘赌选择,也没有根据迭代次数设置精英个数的递增保留。(因为这题这样已经够用了,可以去设置一下,不难)


步骤5:将代码组合起来

function finalans=GA(Adjacency_matrix,n1,n2)

% Adjacency_matrix= w
% n1 = 16,n2 = 18

if (n1+n2)~=size(Adjacency_matrix,1) ||...
    size(Adjacency_matrix,1)~=size(Adjacency_matrix,2)||...
    n1<1 || n2<1
    error('参数格式不合法')
end

population = cell(1,100);
k=1;
 %随机选取100个种群
for i = 1:100
    a = randperm(34);
    a(find(a <= n1)) = 1;
    a(find(a > n1)) = 0;
    population(i) = {a};
end

while k <= 100
    %交叉
    g = 1;
    count = 1;
    %总交叉次数小于500或得到40对交叉后存活的新个体
    while g <= 500 && count <= 40    
    e = sort(randperm(34,2));
    f = randperm(20,2);
    ransetia = cell2mat(population(f(1)));
    ransetib = cell2mat(population(f(2)));
    %存活条件为交叉前后两组点的数量不变
    if sum(ransetia(e(1):e(2))) == sum(ransetib(e(1):e(2)))
        lingshi = ransetia(e(1):e(2));
        ransetia(e(1):e(2)) = ransetib(e(1):e(2));
        ransetib(e(1):e(2)) = lingshi;
        population(19+2*count) = {ransetia};
        population(20+2*count) = {ransetib};
        count = count+1;
    end
    g = g+1;
    end


    %变异
    counter = 1;
    while counter <= 80
        c = randperm(34,2);
        r = cell2mat(population(randperm(100,1)));
        if sum(r(c)) == 1
            r(c) = r(c)*(-1)+1;
            population(20+counter) = {r};
            counter = counter+1;
        end
    end   
    %适应度
    fitness = [];
    %计算适应度
    for i = 1:100
        x = cell2mat(population(i));
        b = Adjacency_matrix-x ;
        fitness(i) = 1/(length(find(b(find(x == 1),:)==1))+1);
    end

    [fitness,Index] = sort(fitness,"descend");
    %将每次迭代的最大适应度保存
    maxfit(k) = fitness(1);
    %保存该次迭代的总体适应度水平
    general_fit(k) = mean(fitness);
    %淘汰80个种群
    population(Index(21:100)) = [];      
    k = k+1;
end

步骤6:画图

        画图风格因人而异,这里不贴代码直接贴出成品

Matlab实现 遗传算法 无向图结点分成两类使得两类间边数最少 数学建模作业,算法,matlab

        易知最小边数为10(分类结果不唯一)文章来源地址https://www.toymoban.com/news/detail-674450.html

到了这里,关于Matlab实现 遗传算法 无向图结点分成两类使得两类间边数最少 数学建模作业的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (转载)多种群遗传算法的函数优化算法(matlab实现)

            以下内容大部分来源于《MATLAB智能算法30个案例分析》,仅为学习交流所用。         遗传算法是一种借鉴生物界自然选择和进化机制发展起来的高度并行、随机、自适应的全局优化概率搜索算法。由于优化时不依赖于梯度,具有很强的鲁棒性和全局搜索能力

    2024年02月07日
    浏览(47)
  • 遗传算法决策变量降维的matlab实现

            遗传算法是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。它最初由美国Michigan大学的J. Holland教授提出,1967年, Holland 教授的学生 Bagley在其博士论文中首次提出了“遗传算法”一词,他发展

    2024年02月11日
    浏览(39)
  • Matlab实现遗传算法仿真(附上20个仿真源码)

    遗传算法(Genetic Algorithm,GA)是一种基于生物进化理论的优化算法,通过模拟自然界中的遗传过程,来寻找最优解。 在遗传算法中,每个解被称为个体,每个个体由一组基因表示,每个基因是解空间中的一个变量。算法通过不断地交叉、变异、选择等操作,来寻找最优解。

    2024年02月08日
    浏览(34)
  • Matlab实现遗传算法仿真(附上40个仿真源码)

    字节流抽象基类 InputStream:这个抽象类是表示字节输入流的所有类的超类 OutputStream:这个抽象类是表示字节输出流的所有类的超类 子类名特点:子类名称都是以其父类名作为子类名的后缀 4.1 IO流概述和分类 IO流概述 : IO: 输入/输出(Input/Output) 流:是一种抽象概念,是对数据

    2024年02月14日
    浏览(39)
  • Matlab实现遗传算法(附上30个完整仿真源码)

    遗传算法(Genetic Algorithm,GA)是一种基于生物进化理论的优化算法,通过模拟自然界中的遗传过程,来寻找最优解。 在遗传算法中,每个解被称为个体,每个个体由一组基因表示,每个基因是解空间中的一个变量。算法通过不断地交叉、变异、选择等操作,来寻找最优解。

    2024年02月13日
    浏览(46)
  • 基于遗传算法的BP神经网络优化算法(matlab实现)

            BP网络是一类多层的前馈神经网络。它的名字源于在网络训练的过程中,调整网络的权值的算法是误差的反向传播的学习算法,即为BP学习算法。BP算法是Rumelhart等人在1986年提出来的。由于它的结构简单,可调整的参数多,训练算法也多,而且可操作性好,BP神经网

    2024年01月16日
    浏览(54)
  • (转载)神经网络遗传算法函数极值寻优(matlab实现)

            对于未知的非线性函数,仅通过函数的输入输出数据难以准确寻找函数极值。这类问题可以通过神经网络结合遗传算法求解,利用神经网络的非线性拟合能力和遗传算法的非线性寻优能力寻找函数极值。本章用神经网络遗传算法寻优如下非线性函数极值,该函数表达式

    2024年02月16日
    浏览(38)
  • 基于遗传算法的柔性生产调度研究(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 摘要:针

    2024年02月08日
    浏览(59)
  • 【无人机】基于遗传算法混合粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)

      💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 对于

    2024年04月25日
    浏览(48)
  • 超详细 | 遗传-粒子群自适应优化算法及其实现(Matlab)

    作者在前面的文章中介绍了两种经典的优化算法——遗传算法(GA)和粒子群算法(PSO),这些智能优化算法解决问题的方式和角度各不相同,都有各自的适用域和局限性,对智能优化算法自身做的改进在算法性能方面得到了一定程度的提升,但算法缺点的解决并不彻底。 为了克服

    2024年01月21日
    浏览(75)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包