Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
 public void Add_chromosome(Project_chromosome chromosome)   //добавление хромосомы
 {
     this.chromosome.Add(chromosome);
 }