public static List <Genotip> Start_population(List <int> projects, List <int> employees, int max_count_employees, int genotip_count, Random rnd) //формирование стартовой популяции //входные данные - массив идентификаторов проектов, массив идентификаторов сотрудников, максимальное число сотрудников на проект, число хромосом, рандомайзер //выходные данные - массив генотипов (стартовая популяция) { List <int> empl_st = new List <int>(); //список сотрудников List <int> empl_temp = new List <int>(); //временный список сотрудников List <int> project_st = new List <int>(); //список проектов List <int> project_temp = new List <int>(); //временный список проектов List <Genotip> start_pop = new List <Genotip>(); //стратовая популяция foreach (int employee in employees) //копирование идентификаторов сотрудников в список сотрудников { int j = employee; empl_st.Add(j); } foreach (int project in projects) //копирование идентификаторов проектов в список проектов { int j = project; project_st.Add(j); } while (start_pop.Count < genotip_count) //пока количество генотипов в стратовой популяции не достигло заданного { project_temp.Clear(); //очистка временного массива проектов foreach (int proj in project_st) //заполнение временного массива проектов { int i = proj; project_temp.Add(i); } List <Project_chromosome> pr_chrom = new List <Project_chromosome>(); //массив хромосом empl_temp.Clear(); //очистка временного массива сотрудников foreach (int empl in empl_st) //заполнение временного массива сотрудников { int i = empl; empl_temp.Add(i); } while (pr_chrom.Count < projects.Count) //для всех проектов сначала выбираем случайный проект из списка, затем распределяем для него сотрудника со случайным номером { Project_chromosome chromosome = new Project_chromosome(); int proj_id = rnd.Next(project_temp.Count); chromosome.ID = project_temp.ElementAt(proj_id); project_temp.RemoveAt(proj_id); int num = rnd.Next(empl_temp.Count); chromosome.Add_employees(empl_temp.ElementAt(num)); empl_temp.RemoveAt(num); pr_chrom.Add(chromosome); } List <int> max_empl_in_project = new List <int>(); //число проектов с максимально возможным числом сотрудников while (empl_temp.Count > 0 & max_empl_in_project.Count < projects.Count) //пока не опустошиться список сотрудников или все проекты достигнут максимально возможного числа сотрудников { //выбор случайного сотрудника int num = rnd.Next(empl_temp.Count); int employee = empl_temp.ElementAt(num); bool flag = false; bool del_flag = true; while (flag == false) { foreach (Project_chromosome pr in pr_chrom) //проход по проектам и добавление сотрудника в соответствии с случайной выборкой { int ch = rnd.Next(2); if (ch == 1) { if (pr.Get_count_employees() < max_count_employees) //если число сотрудников меньше максимально допустимого, то добавляем в проект { pr.Add_employees(employee); flag = true; break; } else if (pr.Get_count_employees() == max_count_employees) { if (max_empl_in_project.IndexOf(pr.ID) == -1) { max_empl_in_project.Add(pr.ID); } if (max_empl_in_project.Count == projects.Count) { flag = true; del_flag = false; } break; } } } } pr_chrom = InsertionSort(pr_chrom); //сортировка проектов по возрастанию количсества сотрудников if (del_flag) { empl_temp.RemoveAt(num); } } start_pop.Add(new Genotip(pr_chrom)); //добавление хромосомы } return(start_pop); }
private static Genotip Mutation(Genotip parent, List <int> employees, int max_count_employees, Random rnd) //мутация //входные данные - генотип из родительского пула, список идентификаторов сотрудников, максимальное число сотрудников на проект, рандомайзер //выходные данные - генотип { //мутация заключается в формировании новой хромосомы. //формирвоание аналогично формированию хромосом для стартовой популяции List <int> empl_temp = new List <int>(); List <int> prog_id = new List <int>(); foreach (Project_chromosome pr in parent.Chromosome) { prog_id.Add(pr.ID); } List <Project_chromosome> pr_chrom = new List <Project_chromosome>(); foreach (int em in employees) { int i = em; empl_temp.Add(i); } // foreach (Project_chromosome pr in parent.Chromosome) while (pr_chrom.Count < parent.Chromosome.Count) { Project_chromosome mut_pr = new Project_chromosome(); int proj_id = rnd.Next(prog_id.Count); mut_pr.ID = prog_id.ElementAt(proj_id); prog_id.RemoveAt(proj_id); int num = rnd.Next(empl_temp.Count); mut_pr.Add_employees(empl_temp.ElementAt(num)); empl_temp.RemoveAt(num); pr_chrom.Add(mut_pr); } List <int> max_empl_in_project = new List <int>(); while (empl_temp.Count > 0 & max_empl_in_project.Count < parent.Get_chromosome_count()) { int num = rnd.Next(empl_temp.Count); int employee = empl_temp.ElementAt(num); bool flag = false; bool del_flag = true; while (flag == false) { foreach (Project_chromosome pr in pr_chrom) { int ch = rnd.Next(2); if (ch == 1) { if (pr.Get_count_employees() < max_count_employees) { pr.Add_employees(employee); flag = true; break; } else { if (max_empl_in_project.IndexOf(pr.ID) == -1) { max_empl_in_project.Add(pr.ID); } if (max_empl_in_project.Count == parent.Get_chromosome_count()) { flag = true; del_flag = false; } break; } } } } pr_chrom = InsertionSort(pr_chrom); if (del_flag) { empl_temp.RemoveAt(num); } } Genotip mut_individ = new Genotip(pr_chrom); return(mut_individ); }
public void Add_chromosome(Project_chromosome chromosome) //добавление хромосомы { this.chromosome.Add(chromosome); }