Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- namespace lab_6_met
- {
- class Person
- {
- public string Name;
- public List<int> Genotip ; //генотип
- public int Fenotip; // фенотип, максимальный критерий
- public List<Person> Perents;//родитель
- public bool Mutation;//мутировал ли
- public int Index_mutation;//индекс мутации
- public Person(string name, List<int> genotip, int fenotip) { Name = name; Genotip = genotip; Fenotip = fenotip; }
- public Person(string name, List<int> genotip, int fenotip, List<Person> perens) { Name = name; Genotip = genotip; Fenotip = fenotip; Perents = perens; }
- public Person(string name, List<int> genotip, int fenotip, bool mutation, int index_mutation) { Name = name; Genotip = genotip; Fenotip = fenotip; Mutation=mutation; Index_mutation=index_mutation;}
- }
- class Program
- {
- public static List<int> Matrix(int m, int t1, int t2)
- {
- var rnd = new Random();
- List<int> matrix = new List<int>();
- for (int i = 0; i < m; i++)
- {
- int lot = rnd.Next(t1, t2);
- matrix.Add(lot);
- //Console.Write($"{lot}{'\t'}");
- }
- Console.WriteLine();
- matrix.Sort();
- foreach (int i in matrix)
- {
- // Console.Write($"{i}{'\t'}");
- }
- return matrix;
- }
- public static List<int> Genotip(int m)
- {
- var rnd = new Random();
- List<int> genotip = new List<int>();
- for (int i = 0; i < m; i++)
- {
- int gen = rnd.Next(0, 255);
- genotip.Add(gen);
- // Console.Write($"{gen}{'\t'}");
- }
- return genotip;
- }
- public static int Fenotip(List<int> matrix, List<int> genotip, int n)
- {
- int[] interval = new int [n]; // интервалы верхнии границы
- int iter = Convert.ToInt32(Math.Floor(255 / Convert.ToDouble(n))); // округление промежутка интервала в меньшую сторону
- int last = iter;
- for (int i = 0; i < n; i++)
- {
- interval[i] = last;
- last += iter;
- }
- int[] rez = new int[n];
- for (int i = 0; i < genotip.Count; i++)
- {
- int index = 0;
- for (int j = 0; j < n; j++)
- {
- if((genotip[i] <= interval[j]) & (genotip[i] >= interval[j]-iter))
- {
- index = j;
- }
- else if((genotip[i]>=iter*n) & (genotip[i] <= 255))
- {
- index = n - 1;
- }
- }
- rez[index] += matrix[i];
- }
- int kriter = rez[0];
- for (int i = 0; i < n; i++)
- {
- if(kriter < rez[i])
- {
- kriter = rez[i];
- }
- }
- return kriter;
- }
- public static Person Star( List<Person> persons) //лучшая особь
- {
- Person stars = persons[0];
- int star = persons[0].Fenotip;
- foreach (var item in persons)
- {
- if (star > item.Fenotip)
- {
- star = item.Fenotip;
- stars = item;
- }
- }
- Console.WriteLine($"Лучшая особь в поколении:{stars.Name} Фенотип:{stars.Fenotip}");
- return stars;
- }
- public static bool Veroyat(double pk, string person) //метод вероятности участия красовера
- {
- int n = 10;
- int[] mas = new int[n];
- var rnd = new Random();
- double kol = 10 * pk;
- for (int i = 0; i < 10; i++)
- {
- if (i < kol)
- {
- mas[i] = 1;
- }
- else { mas[i] = 0;}
- }
- while (n > 0)
- {
- n--;
- int k = rnd.Next(n + 1);
- int value = mas[k];
- mas[k] = mas[n];
- mas[n] = value;
- }
- bool ver;
- int val_ver = rnd.Next(0, 10);
- if (mas[val_ver] == 1)
- {
- ver = true;
- } else { ver = false; }
- if (ver)
- {
- Console.WriteLine($"Особь:{person} в скрешевании участвует!");
- }
- else { Console.WriteLine($"Особь:{person} в скрешевании не участвует!"); }
- return ver;
- }
- public static bool Veroyat_M(double pm) //вероятность мутации
- {
- int n = 10;
- int[] mas = new int[n];
- var rnd = new Random();
- double kol = 10 * pm;
- for (int i = 0; i < 10; i++)
- {
- if (i < kol)
- {
- mas[i] = 1;
- }
- else { mas[i] = 0; }
- }
- while (n > 0)
- {
- n--;
- int k = rnd.Next(n + 1);
- int value = mas[k];
- mas[k] = mas[n];
- mas[n] = value;
- }
- bool ver;
- int val_ver = rnd.Next(0, 10);
- if (mas[val_ver] == 1)
- {
- ver = true;
- }
- else { ver = false; }
- return ver;
- }
- public static void Mutation(Person person) // мутация
- {
- var rnd = new Random();
- int index_mut = rnd.Next(0, person.Genotip.Count);
- int gen_mut = person.Genotip[index_mut];
- Console.WriteLine($"Индекс: {index_mut}: Ген: {gen_mut}");
- person.Index_mutation = index_mut;
- string BinaryCode = Convert.ToString(gen_mut, 2);
- Console.WriteLine($"{BinaryCode}");
- char[] convert_str = BinaryCode.ToCharArray();
- int [] bit = new int [8];
- int kol_elem = convert_str.Length;
- int iter = 7;
- for (int i = convert_str.Length-1; i >=0 ; i--)
- {
- bit[iter] = convert_str[i]-'0';
- iter--;
- }
- for (int i = iter; i >= 0; i--)
- {
- bit[i] = 0;
- }
- int index_change = rnd.Next(0, bit.Length);
- if (bit[index_change] == 0)
- {
- bit[index_change] = 1;
- }
- else
- {
- bit[index_change] = 0;
- }
- string bit_change = String.Join("", bit);
- int gen_change = Convert.ToInt32(bit_change, 2);
- Console.WriteLine($"строка {bit_change}, После перевода {gen_change}");
- person.Genotip[index_mut] = gen_change;
- }
- public static Person Crossing(Person person1, Person person2, double pm, List<int> matrix, int n)
- {
- string new_name = person1.Name+"_"+ person2.Name;
- var rnd = new Random();
- int k = rnd.Next(0, person1.Genotip.Count); // точка разбиения
- List<int> genotip_cild1 = new List<int>();
- List<int> genotip_cild2 = new List<int>();
- for (int i = 0; i < person1.Genotip.Count; i++)
- {
- if (i < k)
- {
- genotip_cild1.Add(person1.Genotip[i]);
- genotip_cild2.Add(person2.Genotip[i]);
- }
- else
- {
- genotip_cild1.Add(person2.Genotip[i]);
- genotip_cild2.Add(person1.Genotip[i]);
- }
- }
- List<Person> P = new List<Person>();
- P.Add(new Person(new_name, genotip_cild1, Fenotip(matrix, genotip_cild1, n), new List<Person>{person1, person2}));
- P.Add(new Person(new_name, genotip_cild2, Fenotip(matrix, genotip_cild2, n), new List<Person> { person1, person2 }));
- if (Veroyat_M(pm))
- {
- Mutation(P[0]);
- P[0].Mutation = true;
- }
- if (Veroyat_M(pm))
- {
- Mutation(P[1]);
- P[1].Mutation = true;
- }
- int new_fenotip_1 = Fenotip(matrix, P[0].Genotip, n);
- P[0].Fenotip = new_fenotip_1;
- int new_fenotip_2 = Fenotip(matrix, P[1].Genotip, n);
- P[1].Fenotip = new_fenotip_2;
- if (new_fenotip_1 < new_fenotip_2)
- {
- return P[0];
- }
- else
- {
- return P[1];
- }
- }
- public static void Print(Dictionary<int,List<Person>> generation)
- {
- foreach (var val in generation)
- {
- Console.WriteLine();
- Console.WriteLine($"Поколение: {val.Key}");
- foreach (var item in val.Value)
- {
- Console.WriteLine($"Имя:{item.Name}; Фенотип: {item.Fenotip}; Мутация:{item.Mutation}; Индек мутации:{item.Index_mutation}");
- Console.WriteLine("Генотип:");
- foreach (var gen in item.Genotip)
- {
- Console.Write($"{gen} {'\t'}");
- }
- Console.WriteLine();
- Console.Write("Родители:");
- foreach (var pen in item.Perents)
- {
- if(pen==null)
- {
- Console.Write($"Начальное поколение!");
- break;
- }
- else
- {
- Console.Write($"{pen.Name} {'\t'}");
- }
- }
- Console.WriteLine();
- Console.WriteLine();
- }
- Console.WriteLine();
- }
- Console.WriteLine();
- }
- static void Main(string[] args)
- {
- Console.WriteLine("Введите данные:");
- Console.WriteLine("Число задач:");
- int m = Convert.ToInt32(Console.ReadLine());
- Console.WriteLine("Число процессоров:");
- int n = Convert.ToInt32(Console.ReadLine());
- Console.WriteLine("Диапазон 1:");
- int t1= Convert.ToInt32(Console.ReadLine());
- Console.WriteLine("Диапазон 2:");
- int t2 = Convert.ToInt32(Console.ReadLine());
- Console.WriteLine("Вероятность красовера (указывать значение через запятую):");
- double pk = Convert.ToDouble(Console.ReadLine()); //вероятность кросовера
- Console.WriteLine("Вероятность мутации:");
- double pm= Convert.ToDouble(Console.ReadLine()); //вероятность мутации
- Console.WriteLine("Количество особей в начале:");
- int k = Convert.ToInt32(Console.ReadLine()); // количесвто особей в поколении
- Console.WriteLine("Колличество раз повторений особей в поколениях:");
- int kpovtor = Convert.ToInt32(Console.ReadLine()); // количество раз сколько особь повторяется в поколениях
- List<int> matrix = Matrix(m, t1, t2);
- Dictionary<int, List<Person>> generation = new Dictionary<int, List<Person>>(); //библиотека поколений
- int key = 0;
- List<Person> persons = new List<Person>();
- for (int i= 0; i < k; i++)
- {
- string name = "O" + Convert.ToString(i);
- List<int> genotip = Genotip(m);
- int fen = Fenotip(matrix, genotip, n);
- List<Person> parens = new List<Person> { null, null };
- persons.Add(new Person(name, genotip, fen,parens));
- }
- generation.Add(key, persons);
- foreach (var item in generation[0])
- {
- Console.WriteLine();
- Console.WriteLine($"Name:{item.Name}");
- Console.WriteLine("Genotip:");
- foreach (var i in item.Genotip)
- {
- Console.Write($"{i} {'\t'}");
- }
- Console.WriteLine();
- Console.WriteLine($"Fenotip:{ item.Fenotip}");
- }
- Console.WriteLine();
- List<Person> person_star_gener = new List<Person>();
- person_star_gener.Add(Star(generation[0])); // лучшая особь среди первого поколения
- //слудующие поколения
- var rnd = new Random();
- int index_pokolen = 1;
- string lastBestGenotype = "";
- int sameGenotypeCount = 0;
- while (sameGenotypeCount <= kpovtor)
- {
- List<Person> Gener = new List<Person>();
- for (int i = 0; i < k; i++)
- {
- bool flag_one = false;
- Person person_gen1 = generation[index_pokolen-1][0];
- while (flag_one == false)
- {
- int index_gener1 = rnd.Next(0, k);
- flag_one = Veroyat(pk, generation[index_pokolen-1][index_gener1].Name);
- if (flag_one)
- {
- Gener.Add(generation[index_pokolen - 1][index_gener1]);
- person_gen1 = generation[index_pokolen - 1][index_gener1];
- break;
- }
- }
- List<Person> sort_person = generation[index_pokolen - 1].GetRange(0, persons.Count); //индекс 0 поколения ключ
- sort_person.Remove(person_gen1);
- bool flag_tuo = false;
- while (flag_tuo == false)
- {
- int index_gener2 = rnd.Next(0, sort_person.Count);
- Person person_gener = sort_person[index_gener2];
- flag_one = Veroyat(pk, person_gener.Name);
- if (flag_one)
- {
- Gener.Add(person_gener);
- break;
- }
- }
- }
- int index_k = 0;
- List<Person> next_generation = new List<Person>();
- for (int i = 0; i < Gener.Count - 1; i++)
- {
- Person star_person = generation[index_pokolen - 1][index_k];
- Console.WriteLine();
- if (i % 2 == 0)
- {
- Console.WriteLine();
- Person cildren1 = Gener[i];
- Person cildren2 = Gener[i + 1];
- Person cildren_rez = Crossing(cildren1, cildren2, pm, matrix, n);
- Console.WriteLine(cildren_rez.Name, cildren_rez.Fenotip, cildren_rez.Perents);
- Console.WriteLine();
- index_k++;
- if (star_person.Fenotip < cildren_rez.Fenotip)
- {
- next_generation.Add(star_person);
- Console.WriteLine($"{star_person.Name}:{star_person.Fenotip}");
- }
- else
- {
- next_generation.Add(cildren_rez);
- Console.WriteLine($"{cildren_rez.Name}:{cildren_rez.Fenotip}");
- }
- }
- }
- generation.Add(index_pokolen, next_generation);
- var bestPerson = Star(next_generation);
- person_star_gener.Add(bestPerson);// лучшая особь следующего поколения
- if(!(String.Equals(lastBestGenotype, String.Join("", bestPerson.Genotip))))
- {
- lastBestGenotype = String.Join("", bestPerson.Genotip);
- sameGenotypeCount = 0;
- }
- else
- {
- sameGenotypeCount++;
- }
- index_pokolen =index_pokolen+1;
- }
- Print(generation);
- foreach (var item in person_star_gener)
- {
- Console.WriteLine($"Имя:{item.Name}; Фенотип: {item.Fenotip}; Мутация:{item.Mutation}; Индек мутации:{item.Index_mutation}");
- Console.WriteLine("Генотип:");
- foreach (var gen in item.Genotip)
- {
- Console.Write($"{gen} {'\t'}");
- }
- Console.WriteLine();
- }
- Console.WriteLine();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement