背景
给定64个物体的质量,选中16个进行分组,组间质量差异最小。
重点和难点
组间质量差异最小,使用组重量的方差计算就行了。
遗传算法进行求解的问题,需要注意的是,经过交配和变异以后,染色体不符合原来的规律了。我们需要进行越界检查,然后
进行回调。
代码
%%%%%%%%%%%%%%遗传算法求取16/64 物体分组问题%%%%%%%%%%%%%%
clear ; %清除所有变量
close all; %清图
clc; %清屏
%%%%%%% 加载数据%%%%%%%%%%%%%%%
objweights=table2array(readtable("质量.xlsx")); %加载表格,并转换为矩阵方便计算
idx=randperm(64,16)'; %产生1-64之间的随机数,数量为16,作为待分组物体的编号
global obj16
obj16=objweights(idx,2);
%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%
D = 16; %基因数目
NP = 100; %染色体数目
G = 100; %最大遗传代数
f=zeros(D,NP); %初始种群赋空间
nf = zeros(D,NP); %子种群赋空间
Pc = 0.8; %交叉概率
Pm = 0.1; %变异概率
for i=1:NP
f(:,i)=randperm(D,D)'; %随机获得初始种群
end
%%%%%%%%%%%%%%%%按适应度升序排列%%%%%%%%%%%%%%%%
for np = 1:NP
MSLL(np) = func2(f(:,np));
end
[SortMSLL,Index] = sort(MSLL);
Sortf = f(:,Index);
%%%%%%%%%%%%%%%%%遗传算法循环%%%%%%%%%%%%%%%%%
for gen = 1:G
%%%%%%%%%%采用君主方案进行选择交叉操作%%%%%%%%%%%%
%%% 绘图表示
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
%%%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%
function result = func2(x)
结果
![](https://img-blog.csdnimg.cn/img_convert/09b11e0081b67e4ce15ec144da46dd98.png)
![](https://img-blog.csdnimg.cn/img_convert/7aabba8d608c02c87c28a110712e9720.png)