4.3. Код юнит-тестов оператора кроссинговера
using System;
using System.Collections.Generic;
using Xunit;
using EvolutionaryAlgorithmBinary;
public class ChromosomeCrossoverTests
{
private class FakeRandom : Random
{
private Queue<double> _vals;
public FakeRandom(IEnumerable<double> vals) { _vals=new Queue<double>(vals); }
public override double NextDouble() => _vals.Dequeue();
}
[Fact]
public void TwoPointCrossover_ShouldExchangeBitsBetweenParents()
{
// Arrange: создаём две хромосомы-«родителя» с известными битами
// Для простоты: оба генома из 1-го гена по 8 бит
bool[] p1 = new bool[8]{0,0,0,0,0,0,0,0};
bool[] p2 = new bool[8]{1,1,1,1,1,1,1,1};
var parent1 = new Chromosome(new List<bool[]>{p1}, 0,1);
var parent2 = new Chromosome(new List<bool[]>{p2}, 0,1);
// FakeRandom вернёт точки разреза p1=2, p2=5
var rnd = new FakeRandom(new[]{ 2/7.0, 5/7.0 });
// Act
var (c1,c2) = parent1.TwoPointCrossover(parent2, rnd);
// Assert: в диапазоне [2,5) у c1 должны быть биты p2, а за пределами — p1
for(int i=0;i<8;i++)
{
bool expected1 = (i<2||i>=5) ? p1[i] : p2[i];
bool expected2 = (i<2||i>=5) ? p2[i] : p1[i];
Assert.Equal(expected1, c1.Genes[0][i]);
Assert.Equal(expected2, c2.Genes[0][i]);
}
}
}
4.4. Итог юнит-тестов оператора кроссинговера
Рис.5 — Скриншот прохождения юнит-тестов оператора кроссинговера
Заключение
В ходе работы была разработана и реализована бинарная модель хромосомы с 8-битным кодированием каждого рабочего параметра, что позволяет надёжно представлять вектор непрерывных переменных в заданном диапазоне [xmin, xmax] без потерь точности при преобразованиях. Инверсия отдельных битов при мутации и побитовый двухточечный кроссовер обеспечивают эффективное исследование пространства решений на уровне отдельных разрядов.
Реализована фитнес-функция, основанная на функции сферы. Реализация оператора мутации с использованием метода альтернативной случайной мутации позволила обеспечить разнообразие генетического материала.
Оператор мутации реализован как инверсия одного случайного бита в одном случайном гене с настраиваемой вероятностью, что обеспечивает достаточное разнообразие генетического материала. Побитовый двухточечный кроссовер надёжно комбинирует информацию родителей, позволяя контролировать области поиска за счёт выбора двух точек разреза.
Проведение тестирования с помощью xUnit.Net подтвердило корректность работы разработанных моделей и операторов, что демонстрирует их пригодность для решения поставленных задач.
Санкт Петербург
2025
