Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

IDZ_11_1583_Marchenko

.m
Скачиваний:
0
Добавлен:
26.01.2026
Размер:
4.73 Кб
Скачать
clear all; clc;

featrs = 5;
featrs_bit = 8;
chrom_len = featrs * featrs_bit;
popul_s = 10;
mut_p = 0.3;
elit = 1;

%% начальная популяция
popul = randi([0 1], popul_s, chrom_len);
for i = 1:popul_s
fprintf('Особь %2d: %s\n', i, num2str(popul(i,:)));
end
fprintf('\n');

%% фитнесс-функция
fitness = sum(popul, 2) / chrom_len;
for i = 1:popul_s
fprintf('Особь %2d: сумма бит = %d, фитнесс = %.3f\n', ...
i, sum(popul(i,:)), fitness(i));
end
fprintf('Средний фитнесс: %.3f\n Лучший фитнесс: %.3f\n\n', ...
mean(fitness), max(fitness));

%% пропорциональный отбор с элитизмом
% сортировка по фитнессу
[fitness_sort, idx] = sort(fitness, 'descend');
popul_sort = popul(idx, :);

% сохранение элитных особей
sort_ind = popul_sort(1:elit, :);
sort_fitness = fitness_sort(1:elit);
fprintf('Элитные особи (сохранены):\n');
for i = 1:elit
fprintf(' Особь %2d: %s Фитнесс: %.3f\n', ...
i, num2str(sort_ind(i,:)), sort_fitness(i));
end

% вероятности отбора (пропорциональные)
select_pr = fitness / sum(fitness);
fprintf('Вероятности отбора для каждой особи:\n');
for i = 1:popul_s
fprintf(' Особь %2d: P = %.3f\n', i, select_pr(i));
end

% отбор родителей
parent_indc = randsample(1:popul_s, popul_s - elit, true, select_pr);
parents = popul(parent_indc, :);
fprintf('Отобранные родители:\n');
for i = 1:size(parents, 1)
fprintf(' Родитель %2d (бывшая особь %2d): %s\n', ...
i, parent_indc(i), num2str(parents(i,:)));
end
fprintf('\n');

%% одноточечный кроссовер
children = [];
child_count = 0;

for i = 1:2:size(parents, 1)-1
parent1 = parents(i, :);
parent2 = parents(i+1, :);

% случайная точка разрыва
crossover = randi([1 chrom_len-1]);
fprintf('Родители %d и %d: точка кроссовера = %d\n', i, i+1, crossover);

% создание потомков
child1 = [parent1(1:crossover), parent2(crossover+1:end)];
child2 = [parent2(1:crossover), parent1(crossover+1:end)];

fprintf('Потомок %d: %s\n', child_count+1, num2str(child1));
fprintf('Потомок %d: %s\n', child_count+2, num2str(child2));

children = [children; child1; child2];
child_count = child_count + 2;
end

if mod(size(parents, 1), 2) == 1
fprintf('Нечётное количество родителей: добавляем последнего без изменений\n');
fprintf('Потомок %d: %s\n', child_count+1, num2str(parents(end, :)));
children = [children; parents(end, :)];
end
fprintf('\n');

%% одноточечная мутация
mut_count = 0;

for i = 1:size(children, 1)
if rand() < mut_p
% выбор случайного бита для мутации
mut_point = randi([1 chrom_len]);
% инверсия бита
children(i, mut_point) = 1 - children(i, mut_point);
fprintf('Потомок %d: мутация в позиции %d\n', i, mut_point);
fprintf('После мутации: %s\n', num2str(children(i,:)));
mut_count = mut_count + 1;
end
end
fprintf('Всего мутировало: %d потомков из %d\n\n', mut_count, size(children, 1));

%% новая популяция
new_popul = [sort_ind; children(1:popul_s - elit, :)];
fprintf('Состав новой популяции:\n');
fprintf(' - Элитные особи: %d\n', elit);
fprintf(' - Потомки: %d\n\n', popul_s - elit);

%% фитнесс-функция для новой популяции
new_fitness = sum(new_popul, 2) / chrom_len;

for i = 1:popul_s
if i <= elit
source = 'элитная';
else
source = 'потомок';
end
fprintf('Особь %2d (%s): %s Фитнесс: %.3f\n', i, source, num2str(new_popul(i,:)), new_fitness(i));
end
fprintf('\n');

%% сравнение средних фитнессов
if mean(new_fitness) > mean(fitness)
fprintf('Средний фитнесс улучшился на %.3f\n', mean(new_fitness) - mean(fitness));
elseif mean(new_fitness) < mean(fitness)
fprintf('Средний фитнесс ухудшился на %.3f\n', mean(fitness) - mean(new_fitness));
else
fprintf('Средний фитнесс не изменился\n');
end
Соседние файлы в предмете Математическое моделирование в приборных системах