单目标遗传算法matlab代码
时间: 2023-07-24 08:26:05 浏览: 40
以下是一个简单的单目标遗传算法的Matlab代码实现,其中涉及到了选择、交叉、变异等基本操作。
```matlab
function [bestFitness, bestSolution] = GA_singleobjective(fitnessfcn, nvars, lb, ub, maxGen, popSize, crossoverProb, mutationProb)
% 初始化种群
pop = repmat(lb, popSize, 1) + repmat((ub-lb), popSize, 1).*rand(popSize, nvars);
bestFitness = inf;
bestSolution = zeros(1, nvars);
% 开始迭代
for i = 1:maxGen
% 计算适应度
fitness = feval(fitnessfcn, pop);
% 选择操作
parents = SUS_selection(pop, fitness, popSize);
% 交叉操作
offspring = crossover(parents, crossoverProb);
% 变异操作
offspring = mutation(offspring, mutationProb, lb, ub);
% 合并父代和子代
pop = [parents; offspring];
% 计算新一代的适应度
fitness = feval(fitnessfcn, pop);
% 选择最优解
[bestFitness_new, bestIdx] = min(fitness);
if bestFitness_new < bestFitness
bestFitness = bestFitness_new;
bestSolution = pop(bestIdx, :);
end
end
end
% 选择操作 - 稳态竞争选择
function parents = SUS_selection(pop, fitness, popSize)
fitness = fitness - min(fitness) + 1; % 适应度不能为0
fitness = fitness / sum(fitness); % 归一化
cumProb = cumsum(fitness); % 累积概率
stepSize = 1 / popSize; % 步长
startPtr = rand() * stepSize; % 随机起点
ptrs = startPtr:stepSize:(startPtr + (popSize-1)*stepSize); % 按步长选出指针
parents = zeros(popSize, size(pop, 2)); % 初始化
for i = 1:popSize
idx = find(cumProb >= ptrs(i), 1, 'first'); % 找到第一个满足条件的个体
parents(i, :) = pop(idx, :); % 选择该个体作为父代
end
end
% 交叉操作 - 一点交叉
function offspring = crossover(parents, crossoverProb)
nParents = size(parents, 1);
offspring = parents;
for i = 1:2:nParents
if rand() < crossoverProb
p1 = parents(i, :);
p2 = parents(i+1, :);
pos = randi([1, size(p1, 2)], 1); % 随机选择交叉点
offspring(i, 1:pos) = p2(1:pos);
offspring(i+1, 1:pos) = p1(1:pos);
end
end
end
% 变异操作 - 高斯变异
function offspring = mutation(pop, mutationProb, lb, ub)
sigma = (ub-lb) / 10; % 标准差
offspring = pop;
for i = 1:size(pop, 1)
for j = 1:size(pop, 2)
if rand() < mutationProb
offspring(i, j) = pop(i, j) + sigma * randn();
end
% 边界处理
if offspring(i, j) < lb(j)
offspring(i, j) = lb(j);
elseif offspring(i, j) > ub(j)
offspring(i, j) = ub(j);
end
end
end
end
```
其中,`fitnessfcn`为适应度函数的函数句柄,`nvars`为变量数,`lb`和`ub`为变量的上下界,`maxGen`为最大迭代次数,`popSize`为种群大小,`crossoverProb`为交叉概率,`mutationProb`为变异概率。`bestFitness`和`bestSolution`分别为最优适应度和最优解。