МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ.ПРОФ.М.А.БОНЧ-БРУЕВИЧА»
(СПбГУТ)
Факультет: «Институт магистратуры»
Кафедра: «Систем автоматизации и робототехники»
Направление подготовки: |
Автоматизация технологических процессов и производств |
Направленность (профиль): |
Интеллектуальные технологии в автоматизации |
ЛАБОРАТОРНАЯ РАБОТА № 2
по дисциплине:
Методы и модели искусственного интеллекта в управлении техническими системами
|
на тему:
Программная реализация структур генетического алгоритма
Вариант: 1
-
Выполнили студенты группы:
дата, подпись
Фамилия И. О.
Принял к.т.н., доцент
Верхова Г.В.
дата, подпись
Фамилия И. О.
Цель работы: приобретение навыков разработки и программной реализации на C# структур и операторов генетических алгоритмов
Задание: Разработать модель хромосомы, фитнес-функцию, операторы мутации и кроссинговера согласно 1 варианту. Выполнить тестирование моделей и операторов с помощью xUnit.Net.
Ход работы
1. Хромосома
1.1. Модель хромосомы
Вектор рабочих параметров для задач непрерывного нелинейного математического программирования X = {x1, x2, xn}, xi ϵ R ; разрядность гена (отдельного рабочего параметра) – 8; количество рабочих параметров задается специальным методом и может быть от 2 до N; целочисленное кодирование с помощью двоичных чисел; диапазон изменения вектора рабочих параметров от xmin до xmax. Декодирование i-го гена битовой строки c= (c1…c8) в вещественное xi по формуле:
Мутация: с вероятностью pmut∈[0,09,0,99] выбирается случайный ген и в нём один случайный бит инвертируется.
Кроссовер: для каждого гена выполняется двухточечный побитовый обмен фрагментами между родителями.
1.2. Код программной реализации хромосомы
using System;
using System.Collections.Generic;
namespace EvolutionaryAlgorithmBinary
{
/*
Класс Chromosome (Хромосома)
8-битное целочисленное кодирование одного параметра.
Свойства:
GeneBits – число бит в гене (8).
Genes – список bit-массивов bool[8].
XMin, XMax– границы декодирования.
Dimension – число рабочих параметров (генов).
Методы:
• Chromosome(dimension, xmin, xmax, rnd) – случайная генерация генов.
• DecodeAll() – получение List<double> рабочих параметров.
• TwoPointCrossover(other, rnd) – двухточечный побитовый кроссовер.
• Mutate(prob, rnd) – мутация (инверсия одного бита).
*/
public class Chromosome
{
public const int GeneBits = 8;
private readonly int _dimension;
public List<bool[]> Genes { get; }
public double XMin { get; }
public double XMax { get; }
private int MaxCode => (1 << GeneBits) - 1;
public int Dimension => _dimension;
// Конструктор: инициализируем случайными битами
public Chromosome(int dimension, double xmin, double xmax, Random rnd)
{
if (dimension < 2)
throw new ArgumentException("Dimension ≥ 2 required.");
_dimension = dimension;
XMin = xmin; XMax = xmax;
Genes = new List<bool[]>(_dimension);
for (int i = 0; i < _dimension; i++)
{
var bits = new bool[GeneBits];
for (int b = 0; b < GeneBits; b++)
bits[b] = rnd.Next(2) == 1;
Genes.Add(bits);
}
}
// Клонирующий конструктор
public Chromosome(List<bool[]> genes, double xmin, double xmax)
{
_dimension = genes.Count;
XMin = xmin; XMax = xmax;
Genes = new List<bool[]>(_dimension);
foreach (var g in genes)
{
var copy = new bool[GeneBits];
Array.Copy(g, copy, GeneBits);
Genes.Add(copy);
}
}
// Декодирование одного гена
private double DecodeGene(bool[] bits)
{
int k = 0;
for (int j = 0; j < GeneBits; j++)
if (bits[j])
k += 1 << (GeneBits - j - 1);
return XMin + k * (XMax - XMin) / MaxCode;
}
// Декодирование всех генов
public List<double> DecodeAll()
{
var values = new List<double>(_dimension);
foreach (var bits in Genes)
values.Add(DecodeGene(bits));
return values;
}
