genes[j] = (Math.Sqrt(a2 * a2 + 9 * 9 ) / 8) + ((15 - a2 + 0.1 - 0.1) / 10);
summa = summa + genes[j];
if (bad < genes[j]) bad = genes[j];
if (good > genes[j]) good = genes[j];
}
if (max < bad) max = bad;
if (min > good) min = good;
koef_prisp[i]=summa/population;
obrsumma = Convert.ToInt32((bad * population - summa) * 1000);
for (int para=0; para < population; para++)//отбор и скрещивание
{
phenotype[para] = "";
roditel1 = 0;
roditel2 = 0;
r = rand.Next(0, obrsumma);
otbor = 0;
for (int j = 0; j < population; j++)
{
otbor = otbor + (bad - genes[j])*1000;
if (otbor > r)
{
roditel1 = j;
j = population;
}
}
r = rand.Next(0, obrsumma);
otbor = 0;
for (int j = 0; j < population; j++)
{
otbor = otbor + (bad - genes[j]) * 1000;
if (otbor > r)
{
roditel2 = j;
j = population;
}
}
//кроссовер
r = rand.Next(1, Convert.ToInt32(amountGenes*numericUpDown5.Value)); //точка разрыва
char[] ch = pt[roditel1].ToCharArray();
for (int j = 0; j < r; j++)
{
if (rand.Next(0, 10000) <= mut && mut > 0) //мутация
{
phenotype[para] =phenotype[para]+ rand.Next(0, 2).ToString();
}
else
{
phenotype[para] = phenotype[para]+ch[j];
}
}
char[] ch2 = pt[roditel2].ToCharArray();
for (int j = r; j < amountGenes * numericUpDown5.Value; j++)
{
if (rand.Next(0, 10000) <= mut && mut>0) //мутация
{
phenotype[para] = phenotype[para] + rand.Next(0, 2).ToString();
}
else
{
phenotype[para] = phenotype[para] + ch2[j];
}
}
}
}
double t = 3;
int p=0;
int b = 0;
double c = 0;
string osobi = "";
for (int i = 0; i < population; i++)
{
char[] ch = pt[i].ToCharArray();
string osob2="";
for (int simvol2=0; simvol2 < numericUpDown5.Value; simvol2++) osob2 = osob2 + ch[simvol2];
b = Convert.ToInt32(osob2, 2);
int b2 = Convert.ToInt32(b * 15 / (tochnost + 0.001 - 0.001));
c = (Math.Sqrt(b2 * b2 + 9 * 9) / 8) + (15 - b2 + 0.001 - 0.001) / 10;
if (t > c) { t = c; p = b; }
osobi = osobi +(i+1).ToString() + ") " + c.ToString()+" - "+b + "\n";
}
richTextBox2.Text = osobi;
richTextBox2.Text = richTextBox2.Text + "\n" + "Лучшее время: " + t.ToString() + "\n"+
"Лучшая точка: " + p.ToString() + "\n";
decimal endLong = DateTime.Now.Ticks;
decimal time = (endLong - startLong) / 10000000;
label2.Text = time.ToString();
string koef = "";
for (int i = 0; i < koef_prisp.Length; i++)
{
koef = koef +(i+1).ToString() + ") " + koef_prisp[i].ToString()+ "\n";
}
richTextBox3.Text = koef;
Bitmap image = new Bitmap(pictureBox1.Width+2, pictureBox1.Height+1);
label3.Text = max.ToString("F3");
label4.Text = min.ToString("F3");
label11.Text = generation.ToString();
Graphics g = Graphics.FromImage(image);
Pen pe = new Pen(Color.Red);
for (int i = 0; i < pictureBox1.Width; i++)
{
image.SetPixel(i, 0, Color.Blue);
image.SetPixel(i, pictureBox1.Height-10, Color.Green);
}
int x = 0;
int y = 0;
int x2 = 0;
int y2 = 0;
double k = pictureBox1.Width / (koef_prisp.Length + 0.000001-0.000001);
for (int i = 0; i < koef_prisp.Length; i++)
{
x2 = x;
y2 = y;
x = Convert.ToInt32(i * k) + 1;
y = Convert.ToInt32((max - koef_prisp[i]) * pictureBox1.Height / (max - min)) - 10;
if (i > 0 && checkBox1.Checked == true) g.DrawLine(pe, x, y, x2, y2);
image.SetPixel(x, y, Color.Red);
if (y >= pictureBox1.Height - 10)
{
image.SetPixel(x, y + 5, Color.Yellow);
image.SetPixel(x, y + 6, Color.Yellow);
image.SetPixel(x, y + 7, Color.Yellow);
image.SetPixel(x, y + 8, Color.Yellow);
}
if (pictureBox1.Width / 2 > koef_prisp.Length)
{
image.SetPixel(x + 1, y, Color.Red);
image.SetPixel(x, y + 1, Color.Red);
image.SetPixel(x + 1, y + 1, Color.Red);
}
if (pictureBox1.Width / 3 > koef_prisp.Length)
{
image.SetPixel(x - 1, y, Color.Red);
image.SetPixel(x, y - 1, Color.Red);
image.SetPixel(x - 1, y - 1, Color.Red);
image.SetPixel(x + 1, y - 1, Color.Red);
image.SetPixel(x - 1, y + 1, Color.Red);
}
}
pictureBox1.Image = image;
Результаты работы программы:
Лучшей точкой является точка №207 (15/256*207=12.1 км шоссе от точки шоссе ближайшей к буровой вышке). Если курьер пойдет через эту точку, то он дойдет до населенного пункта за минимальное время (2.175 часа).
Результат исследования влияния начальных параметров на скорость и точность нахождения в виде графиков:
Влияние количества особей:
Наиболее оптимальное число особей в популяции – 20.
Влияние вероятности мутации:
Наиболее оптимальная вероятность мутации – 0,03 %
Результаты решения задачи аналитическим методом и при помощи ГА, а также их процентное отличие:
Лучшее время |
||||
аналитическим методом |
2,175 |
|||
ГА |
2,175 |
|||
Расхождение |
0 |
% |
Вывод:
Решение задачи оптимизации наиболее легко находится при использовании ГА.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.