Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_na_voprosy_KAKIE_NADO.docx
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
452.36 Кб
Скачать
  1. Моделирование сети Кохонена

См. вопрос 13

  1. Пример генетической оптимизации при решении задач

Оптимизация вычислительной сети

Особенностью решения задачи по оптимизации вычислительной сети методом генетического алгоритма является необходимость моделирования функционирования сети при вычислении fitness-функции каждого решения. Такие процедуры моделирования являются трудоёмкими, поэтому генетическая оптимизация вычислительных сетей требует значительных вычислительных ресурсов.

Сложность fitness-функции обычно является критерием для применения генетических алгоритмов.

Генетический алгоритм в псевдокоде.

Начало

Создать начальную популяцию

Оценить приспособленность каждой особи

Остановка = ложь

Пока не остановка выполнять

Начало

Повторить (размер популяции/2) раз

Начало

Выбрать 2 особи с высокой приспособленностью для скрещивания

Скрестить потомков

Оценить приспособленность потомков

Поместить потомков в новое поколение

Конец

Если приспособленность лучшего потомка > порога, то остановка = истина

Конец

Конец.

Задача о диете. Задача составления наиболее дешёвого рациона питания, удовлетворяющего некоторым медицинским требованиям. Известен перечень продуктов из N наименований. Рассматриваются следующие характеристики продуктов:

  • Жиры

  • Белки

  • Углеводы

  • Калории

Приемлем рацион, удовлетворяющий медицинским нормам, оптимальным является самый дешёвый из них.

Данная задача реализована с использованием турнирного отбора, который организует n турниров, чтобы выбрать n особей (n – вводится пользователем с клавиатуры).

Исходные данные – набор продуктов, для составления пункта меню (белки, жиры, углеводы, ккал, цена за 100 грамм). В данной программе он представлен в виде двумерного массива products:

public double[,] products = new double[10, 5]{

{7.5, 2.6, 62.3, 303, 3}, //рис

{12.6, 3.3, 57.1, 308, 5}, //гречка

{3, 3.2, 4.7, 60, 3}, //молоко

{18.6, 16, 0, 218, 25}, //говядина

{18.2, 18.4, 0, 238, 45}, //курица

{0.8, 0.1, 2.5, 14, 15}, //огурец

{0.6, 0.2, 4.2, 19.9, 12}, //томаты

{6.8, 1.3, 39.8, 201, 15}, //хлеб бородинский

{0.9, 0.2, 8.1, 43, 30}, //апельсин

{9.2, 14.1, 67.7, 417.6, 15} //крекеры

};

Суточная медицинская норма потребления белков, углеводов, ккал представляет собой одномерный массив norm:

public double[] norm = new double[4] { 61, 67, 289, 2000 };

Рацион питания представляет собой структуру, которая хранит

public struct Ration {

public double[] products; //количество каждого продукта в меню (хромосома)

public double fitness; //оптимальная цена меню (значение fitness функции)

public bool allowably; //допустимо (проходит по медицинским нормам)

public double[] contentProduct;

}

Популяция – population – массив типа Menu (Menu – класс, в котором хранится структура Ration)

Размер популяцииsizePopulation

public Menu[] population = new Menu[sizePopulation];

Хромосома – каждая строка массива – возможный вариант решения (каждый объект класса Menu – структура Ration).

Функция оптимальности – функции fitnessFunction и allowableNormони оценивают приспособленность хромосомы, allowableNorm проверяет удовлетворяет ли она медицинским нормам, результат записывается в переменную allowably структуры Ration.

public bool allowableNorm() {

ration.contentProduct = new double[4];

for (int i = 0; i < 4; i++) { ration.contentProduct[i] = 0; }

for (int i = 0; i < Form1.countProducts; i++) {

for (int j = 0; j < 4; j++) {

ration.contentProduct[j] += ration.products[i] * products[i, j] / 100;

}

}

int allow = 0;

for (int i = 0; i < 4; i++) {

if (ration.contentProduct[i] >= norm[i]) { allow += 1; }

}

if (allow == 4) { return ration.allowably = true; }

else {return ration.allowably = false;}

}

fitnessFunction ищет минимальный рацион питания (цена минимальна за весь рацион, а не за отдельный продукт).

public double fitnessFunction() {

sum = 0;

for (int i = 0; i < Form1.countProducts; i++) {

sum += (ration.products[i] * products[i, 4] / 100);

}

sum = Math.Round(sum, 2);

return ration.fitness = sum;

}

Для скрещивания используется одноточечный кроссовер, он осуществляется в функции crossover. 2 родителя – 2 потомка.

public Menu[] crossover(Menu[] listRation) {

int[] mas = new int[sizePopulation];

<...>

Menu[] populationTmp = new Menu[sizePopulation];

int l = 0;

while (l < sizePopulation - 1) {

int tmp1 = mas[l];

int tmp2 = mas[l + 1];

int barrier = rnd.Next(Form1.countProducts);//выбор точки разрыва

populationTmp[l] = new Menu();

populationTmp[l + 1] = new Menu();

//кроссовер – получаем генотипы 2-х потомков

for (int j = 0; j < barrier; j++) {

populationTmp[l].ration.products[j] = listRation[tmp1].ration.products[j];

populationTmp[l + 1].ration.products[j] = listRation[tmp2].ration.products[j];

}

for (int j = barrier; j < Form1.countProducts; j++) {

populationTmp[l].ration.products[j] = listRation[tmp2].ration.products[j];

populationTmp[l + 1].ration.products[j] = listRation[tmp1].ration.products[j];

}

<...>

//если оба доступны (удовлетворяют медицинским нормам), то переходим к другой хромосоме (через 2)

if ((populationTmp[l].ration.allowably == true) && (populationTmp[l + 1]. ration. allowably == true)) {

l = l + 2;

}

}

<...>

return population;

}

Мутация осуществляется по жирно выделенной формуле, т.е. берётся k-ый продукт и все его характеристики умножаются на произвольное число, на 0.5 и к ним прибавляется случайное число, умноженное на 10.

public void mutation() {

rnd = new Random(Form1.rndCount++);

int k = rnd.Next(Form1.countProducts);

ration.products[k] = Math.Round(ration.products[k] * (rnd.NextDouble() * 1 + 0.5) + rnd.NextDouble() * 10, 0);

fitnessFunction();

allowableNorm();

}

Результатом задачи является n-ое количество рационов питания, удовлетворяющих медицинским нормам и имеющих наименьшую цену.

Пример:

Дано n = 2

Исходные продукты:

Медицинская норма:

Популяция начальная (представлена лишь её часть). Последний пункт – цена.

Мутация (представлена лишь её часть).

Рационы питания – n + 1рационов питания (должно выводиться n), удовлетворяющих медицинским нормам и имеющих минимальную цену за рацион.

45

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]