Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Hopeco
16 / 16 / 8
Регистрация: 18.03.2014
Сообщений: 268
1

Генетический алгоритм зависает

20.01.2015, 16:14. Просмотров 525. Ответов 0
Метки нет (Все метки)

Помогите с реализацией. На данный момент есть такой код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
using System;
 
namespace GA
{
    internal class Program
    {
        // Главная задача в данном примере найти значение выражения a+b+c+d = 30
 
        private static Random r = new Random();
 
        private class Ch
        {
            public int[] gens;
            public float fitness;
            public float likelihood;
 
            public Ch(int length)
            {
                gens = new int[length];
                fitness = 0;
            }
 
            public Ch(int length, int min, int max, int answer)
            {
                gens = new int[length];
                fitness = 0;
 
                for (int i = 0; i < gens.Length; i++)
                    gens[i] = r.Next(min, max + 1);
 
                Fitness(answer);
                GenerateLikelihoods();
            }
 
            public void Fitness(int answer)
            {
                foreach (int t in gens)
                    fitness += t;
 
                fitness = Math.Abs(fitness - answer);
            }
 
            public void GenerateLikelihoods()
            {
                likelihood = (float) ((1/(fitness)/0.135266)*100);
            }
 
        }
 
        class GA
        {
            Ch[] ch = new Ch[5];
 
            public GA(int length, int min, int max, int answer)
            {
                for (int i = 0; i < ch.Length; i++)
                    ch[i] = new Ch(length, min, max, answer);
 
                CreateNewPopulation(answer);
            }
 
            private int GetIndex(float val)
            {
                float last = 0;
                for (int i = 0; i < ch.Length; i++)
                {
                    if (last <= val && val <= ch[i].likelihood) return i;
                    else last = ch[i].likelihood;
                }
 
                return 4;
            }
 
            private Ch Breed(Ch parent1, Ch parent2, int answer)
            {
                Ch resault = new Ch(4);
 
                for (int i = 0; i < parent1.gens.Length/2; i++)
                    resault.gens[i] = parent1.gens[i];
 
                for (int i = parent1.gens.Length / 2; i < parent2.gens.Length; i++)
                    resault.gens[i] = parent2.gens[i];
 
                resault.Fitness(answer);
                resault.GenerateLikelihoods();
 
                return resault;
            }
 
            public void CreateNewPopulation(int answer)
            {
                Ch[] ch_temp = new Ch[ch.Length];
                int parent1 = 0;
                int parent2 = 0;
 
                for (int j = 0; j < ch_temp.Length; j++)
                {
                    do
                    {
                        parent1 = GetIndex(r.Next(101));
                        parent2 = GetIndex(r.Next(101));
                    } while (parent1 == parent2);
 
                    Console.WriteLine("Parent 1: " + parent1);
                    Console.WriteLine("Parent 2: " + parent2);
                    Console.WriteLine("Child: ");
                    ch_temp[j] = Breed(ch[parent1], ch[parent2], answer);
                    for (int i = 0; i < ch_temp[j].gens.Length; i++)
                        Console.Write(ch_temp[j].gens[i] + " ");
                    Console.WriteLine();
                    Console.WriteLine();
 
                    ch[j] = ch_temp[j];
                }
            }
        }
 
 
        private static void Main(string[] args)
        {
            GA ga = new GA(4, 1, 30, 30);
 
            Console.ReadKey();
        }
    }
}
Здесь нету мутации, она пока не нужна. Проблема заключается в том что иногда алгоритм виснет. Да и родители как то не правильно выбираются пытался сделать по этой статье. Помогите доделать и как то упростить код, а то чувствую это полная каша.

Добавлено через 1 минуту
И да здесь используется не crossover для скрещивания, а берутся две половины одна от одного родителя и вторая от другого.

Добавлено через 50 минут
Вроде сделал, но не уверен что правильно (ну по крайне мере ответ правильный):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
using System;
 
namespace GA
{
    internal class Program
    {
        // Главная задача в данном примере найти значение выражения a+b+c+d = 30
 
        private static Random r = new Random();
 
        private class Ch
        {
            public int[] gens;
            public float fitness;
            public float likelihood;
 
            public Ch(int length)
            {
                gens = new int[length];
                fitness = 0;
            }
 
            public Ch(int length, int min, int max, int answer)
            {
                gens = new int[length];
                fitness = 0;
 
                for (int i = 0; i < gens.Length; i++)
                    gens[i] = r.Next(min, max + 1);
 
                Fitness(answer);
                GenerateLikelihoods();
            }
 
            public void Fitness(int answer)
            {
                foreach (int t in gens)
                    fitness += t;
 
                fitness = Math.Abs(fitness - answer);
            }
 
            public void GenerateLikelihoods()
            {
                likelihood = (float) ((1/(fitness)/0.135266)*100);
            }
 
        }
 
        class GA
        {
            Ch[] ch = new Ch[5];
 
            public GA(int length, int min, int max, int answer)
            {
                for (int i = 0; i < ch.Length; i++)
                    ch[i] = new Ch(length, min, max, answer);
 
                CreateNewPopulation(answer, min, max);
            }
 
            private int GetIndex(float val)
            {
                float last = 0;
                for (int i = 0; i < ch.Length; i++)
                {
                    if (last <= val && val <= ch[i].likelihood) return i;
                    else last = ch[i].likelihood;
                }
 
                return 4;
            }
 
            private Ch Breed(Ch parent1, Ch parent2, int answer)
            {
                Ch resault = new Ch(4);
 
                for (int i = 0; i < parent1.gens.Length/2; i++)
                    resault.gens[i] = parent1.gens[i];
 
                for (int i = parent1.gens.Length / 2; i < parent2.gens.Length; i++)
                    resault.gens[i] = parent2.gens[i];
 
                resault.Fitness(answer);
                resault.GenerateLikelihoods();
 
                return resault;
            }
 
            public void CreateNewPopulation(int answer, int min, int max)
            {
                Ch[] ch_temp = new Ch[ch.Length];
                int parent1 = 0;
                int parent2 = 0;
 
                for (int j = 0; j < ch_temp.Length; j++)
                {
                    do
                    {
                        parent1 = GetIndex(r.Next(101));
                        parent2 = GetIndex(r.Next(101));
                    } while (parent1 == parent2);
 
                    Console.WriteLine("Parent 1: " + parent1);
                    Console.WriteLine("Parent 2: " + parent2);
                    Console.WriteLine("Child: ");
                    ch_temp[j] = Breed(ch[parent1], ch[parent2], answer);
                    for (int i = 0; i < ch_temp[j].gens.Length; i++)
                        Console.Write(ch_temp[j].gens[i] + " ");
                    Console.WriteLine();
                    Console.WriteLine();
 
                    ch[j] = ch_temp[j];
 
                    Mutation(min, max, ch);
                }
            }
 
            private void Mutation(int min, int max, Ch[] ch)
            {
                int a = r.Next(0, ch.Length - 1);
                int b = r.Next(0, ch[a].gens.Length - 1);
                ch[a].gens[b] = r.Next(min, max+1);
            }
        }
 
 
        private static void Main(string[] args)
        {
            GA ga = new GA(4, 1, 30, 30);
 
            while (true)
            {
                ga.CreateNewPopulation(30, 1, 30);
                Console.ReadKey();
                Console.Clear();
            }
 
            
        }
    }
}
Добавлено через 9 минут
С действиями на + и - решает, а умножение и деление почему то нет.
Вот например a+2b+3c+4d = 30 не ришит выживаемость нахожу так:
C#
1
2
for (int i = 1; i < gens.Length + 1; i++)
                    fitness += i * gens[i - 1];
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2015, 16:14
Ответы с готовыми решениями:

Генетический алгоритм
Здравствуйте! Задали разработать генетический алгоритм. Основную идею понял, но...

Генетический алгоритм. Реализация популяции
Здравствуйте. У меня стоит задача создать приложение, демонстрирующее работу...

Задача о ранце. Генетический алгоритм
Доброго времени суток, коллеги. На днях выдалось относительно свободное время...

Алгоритм А* (алгоритм кратчайшего пути)
Рассмотрел несколько алгоритмов нахождения кратчайщего пути, но к сожалению не...

Генетический алгоритм
Ребятки помогите запилить в Делфи генетический алгоритм,край до четверга...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2015, 16:14

Генетический алгоритм
Уважаемые программисты! Срочная проблема) В этом файле код на vc++ (2010 VS) и...

Генетический алгоритм
Пытаюсь написать программу для поиска минимума функци используя генетический...

Генетический алгоритм
Добрый день. Написал генетический алгоритм, но похоже, что работает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru