4 Описание интерфейса
Основное окно программы изображено на рисунке 3.
Рисунок 3 – Главное окно программы
Чтобы привести алгоритм в действие, никаких данных вводить не требуется. Необходимый набор хромосом уже прописан в коде программы и вводится автоматически при запуске программы. Остается только нажать кнопку Эволюция для запуска генетического алгоритма. Историю всех популяций отображается в текстовом поле справа. На рисунке 4 представлена программа в работе с результатами значений функции приспособленности, розыгрыша с помощью колеса рулетки, родительский пул, процесс скрещивания и создание нового поколения.
Рисунок 4 – Работа генетического алгоритма
Рисунок - 5 Работа генетического алгоритма окончание
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1) Microsoft Developer Network(MSDN) [Электронный ресурс]. – Режим доступа: msdn.microsoft.com, свободный, русский;
2) Алешко Р.А., Бачурин И.В. Методические указания по выполнению лабораторных работ и курсового проекта по дисциплине «Интеллектуальные информационные системы». [Электронный ресурс]. – Режим доступа: serv\\ForAll, свободный, русский;
3) Стариков А. Генетические алгоритмы – математический аппарат. [Электронный ресурс].- Режим доступа: www.basegroup.ru, свободный, яз: рус.;
ПРИЛОЖЕНИЕ А
(обязательное)
Листинг программы
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 WindowsFormsApplication2
{
public partial class Form1 : Form
{
string[] hromosoms = new string[9];
int[] prisposoblennosts = new int[9];
double[] veroyatnosts = new double[9];
double[] ruletkas = new double[9];
int[] rozigrish = new int[9];
string[] parents = new string[9];
string[] child = new string[9];
public Form1()
{
InitializeComponent();
}
private void btnDo_Click(object sender, EventArgs e)
{
hromosoms[1] = textBox1.Text;
hromosoms[2] = textBox2.Text;
hromosoms[3] = textBox3.Text;
hromosoms[4] = textBox4.Text;
hromosoms[5] = textBox5.Text;
hromosoms[6] = textBox6.Text;
hromosoms[7] = textBox7.Text;
hromosoms[8] = textBox8.Text;
for (int i = 1; i < prisposoblennosts.Length; i++)
{
prisposoblennosts[i] = GetPrisposoblennost(hromosoms[i]);
}
for (int i = 1; i < veroyatnosts.Length; i++)
{
veroyatnosts[i] = GetVeroyatnost(prisposoblennosts[i]);
tBLog.Text += hromosoms[i] + " - " + prisposoblennosts[i] + " - "+ veroyatnosts[i]+ "\r\n";
}
GetParents();
GetMutaciya();
GetScrewiv(1, 2);
GetScrewiv(3, 4);
GetScrewiv(5, 6);
GetScrewiv(7, 8);
tBLog.Text += "Новое поколение:" + "\r\n";
for (int i=1; i< child.Length; i++)
{
tBLog.Text += child[i] + "\r\n";
}
textBox1.Text = child[1];
textBox2.Text = child[2];
textBox3.Text = child[3];
textBox4.Text = child[4];
textBox5.Text = child[5];
textBox6.Text = child[6];
textBox7.Text = child[7];
textBox8.Text = child[8];
tBLog.Text += "---------------------------------" + "\r\n";
}
private int GetPrisposoblennost(string str)
{
int count = 0;
for (int i = 0; i < str.Length; i++)
{
if (str[i] == '1')
{
count++;
}
}
return count;
}
private double GetVeroyatnost(int prispos)
{
double all = 0;
for (int i = 1; i < prisposoblennosts.Length; i++)
{
all += prisposoblennosts[i];
}
return prispos * 100 / all;
}
private void GetParents()
{
ruletkas[1]=veroyatnosts[1];
for (int i = 2; i < ruletkas.Length; i++)
{
ruletkas[i] = ruletkas[i - 1] + veroyatnosts[i];
}
Random rnd = new Random();
tBLog.Text += "Розыгрыш:";
for (int i = 1; i < rozigrish.Length; i++)
{
rozigrish[i] = rnd.Next(101);
tBLog.Text += rozigrish[i] + " ";
}
tBLog.Text += "\r\n" + "Родительский пул:" + "\r\n";
for (int i = 1; i < rozigrish.Length; i++)
{
if ((rozigrish[i]>=0)&& (rozigrish[i]<ruletkas[1]))
{
parents[i] = hromosoms[1];
}
else if ((rozigrish[i] >= ruletkas[1]) && (rozigrish[i] < ruletkas[2]))
{
parents[i] = hromosoms[2];
}
else if ((rozigrish[i] >= ruletkas[2]) && (rozigrish[i] < ruletkas[3]))
{
parents[i] = hromosoms[3];
}
else if ((rozigrish[i] >= ruletkas[3]) && (rozigrish[i] < ruletkas[4]))
{
parents[i] = hromosoms[4];
}
else if ((rozigrish[i] >= ruletkas[4]) && (rozigrish[i] < ruletkas[5]))
{
parents[i] = hromosoms[5];
}
else if ((rozigrish[i] >= ruletkas[5]) && (rozigrish[i] < ruletkas[6]))
{
parents[i] = hromosoms[6];
}
else if ((rozigrish[i] >= ruletkas[6]) && (rozigrish[i] < ruletkas[7]))
{
parents[i] = hromosoms[7];
}
else if ((rozigrish[i] >= ruletkas[7]) && (rozigrish[i] <= 100))
{
parents[i] = hromosoms[8];
}
tBLog.Text += parents[i] + "\r\n";
}
}
private void GetMutaciya()
{
Random rnd = new Random();
double ver = rnd.NextDouble();
if ((ver >= 0.05)&& (ver<=0.1))
{
int hromos = rnd.Next(1, 9);
int gen = rnd.Next(1, 12);
parents[hromos] = Convert(parents[hromos], gen);
tBLog.Text += "Мутировал " + gen + " ген в " + hromos+ " хромосоме" + "\r\n";
}
else tBLog.Text += "Ни один ген не мутировал" + "\r\n";
}
private string Convert(string str, int position)
{
if (str[position] == '0')
{
str = str.Remove(position, 1).Insert(position, '1'.ToString());
}
else str = str.Remove(position, 1).Insert(position, '0'.ToString());
return str;
}
private void GetScrewiv(int par1, int par2)
{
Random rnd = new Random();
int pos = rnd.Next(1, 11);
tBLog.Text += "Пара:" + parents[par1] + " - " + parents[par2]+ "\r\n";
tBLog.Text += "Точка скрещивания:" + pos + "\r\n";
child[par1] = parents[par1].Remove(pos) + parents[par2].Remove(0, pos);
child[par2] = parents[par2].Remove(pos) + parents[par1].Remove(0, pos);
tBLog.Text += "Потомки:" + child[par1] + " - " + child[par2] + "\r\n";
}
Random rnd = new Random();
private string Rand(string str)
{
for (int i = 0; i < 12; i++)
{
str += rnd.Next(0, 2).ToString();
}
return str;
}
}
}