лабораторная работа №6

ЛАБОРАТОРНАЯ РАБОТА №6
ЭВОЛЮЦИОННЫЙ БИОНИЧЕСКИЙ АЛГОРИТМ
Цель работы:
Изучение работы методов оптимизации с глобальными
свойствами на примере бионического эволюционного алгоритма.
Порядок выполнения работы
Порядок выполнения работы
Разработать алгоритм и программу поиска глобального максимума многоэкстремальной
функции
y  1,5x12 e[1 x1 20, 25( x1  x2 ) ]  (0,5x1  0,5) 4 ( x2  1) 4 e[ 2(0,5 x1 0,5)
при ограничениях:
2
-
2
4
( x2 1) 4 ]
 max
параметрических 0  x1 , x2  4 ;
( x1  2,2) 2  ( x 2  1,2) 2  2,25 ,
2
 x1  2   x 2 

     1.
1
,
2

  2
- функциональных
Осуществить несколько запусков программы при различных параметрах алгоритма (число
начальных точек, число генерируемых потомков и т.д.).
При отображении сгенерированных точек на дисплее точки каждого поколения
изображаются различными цветами.
2
Код программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace laba6
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private double Function(double x1, double x2)
{double y=1.5 * Math.Pow(x1, 2) * Math.Pow(Math.E, 1 - Math.Pow(x1, 2) - 20.25 * Math.Pow(x1 - x2, 2)) +
Math.Pow(0.5 * x1 - 0.5, 4) * Math.Pow(x2 - 1, 4) * Math.Pow(Math.E, 2 - Math.Pow(0.5 * x1 - 0.5, 4) - Math.Pow(x2 - 1, 4));
return y;
}
private void BT_SearchMax_Click(object sender, EventArgs e)
{
Chart.Series.Clear();
int d = 0;
double x1, x2,h=2;
double[,] maxX1X2Y=new double[3,200];
for (int i = 0; i < maxX1X2Y.Length / 3; i++)
maxX1X2Y[2, i] = double.MinValue;
Random rnd = new Random();
int
AmountNachPoint=Convert.ToInt32(CB_Nach.Text),AmountChildrenPoint=Convert.ToInt32(CB_Potomkov.Text),AmountGen
erated=Convert.ToInt32(CB_Pokolenii.Text);
for (int k = 1; k <= AmountGenerated; k++)
{
h = h / 2;
d = 0;
Chart.Series.Add("Поколение "+Convert.ToString(k));
Chart.Series[k-1].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point;
while (d < AmountNachPoint)
{
if (k == 1)
{
x1 = 4 * rnd.NextDouble();
x2 = 3 * rnd.NextDouble();
}
else
{
while (true)
{
x1 = (maxX1X2Y[0, k - 1] + h) * rnd.NextDouble();
x2 = (maxX1X2Y[1, k - 1] + h) * rnd.NextDouble();
if (x1 <= maxX1X2Y[0, k - 1] + h && x1 >= maxX1X2Y[0, k - 1] - h && x2 <= maxX1X2Y[1, k - 1] + h &&
x2 >= maxX1X2Y[1, k - 1] - h)
break;
}
}
if ((x1 >= 0) && (x2 <= 4) && (Math.Pow(x1 - 2.2, 2) + Math.Pow(x2 - 1.2, 2) <= 2.25) && (Math.Pow((x1 - 2) /
1.2, 2) + Math.Pow(x2 / 2, 2) >= 1))
{
if (maxX1X2Y[2, k] <= Function(x1, x2))
{
maxX1X2Y[2, k] = Function(x1, x2);
maxX1X2Y[0, k] = x1;
maxX1X2Y[1, k] = x2;
}
Chart.Series[k-1].Points.AddXY(x1, x2);
d++;
}
}
AmountNachPoint = AmountChildrenPoint;
}
LB_Result.Text = "X1=" + Math.Round(maxX1X2Y[0, AmountGenerated], 2).ToString() + " " + " X2=" +
Math.Round(maxX1X2Y[1, AmountGenerated], 2).ToString() + " " + " Y=" + Math.Round(maxX1X2Y[2, AmountGenerated],
2).ToString();
Chart.Series.Add("Максимум").MarkerSize=19;
Chart.Series["Максимум"].Points.AddXY(maxX1X2Y[0, AmountGenerated], maxX1X2Y[1, AmountGenerated]);
Chart.Series["Максимум"].MarkerColor = Color.DarkRed;
Chart.Series["Максимум"].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Star10;
Chart.Series[AmountGenerated].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point;
}
}
}
Результат работы приложения
Вывод: В ходе лабораторной работы изучила методы оптимизации с
глобальными
свойствами на примере бионического эволюционного
алгоритма.