Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
Hopeco
16 / 16 / 1
Регистрация: 18.03.2014
Сообщений: 268
#1

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

20.01.2015, 16:14. Просмотров 514. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Генетический алгоритм зависает (C#):

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

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

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

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

Генетический алгоритм - C#
Добрый день. Написал генетический алгоритм, но похоже, что работает неправильно. Прошу помощи.

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

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

Генетический алгоритм - Java SE
Пытаюсь написать программу для поиска минимума функци используя генетический алгоритм. Вот мой код: import java.util.List; import...

Генетический алгоритм - Turbo Pascal
Всем привет. В этой теме хочу узнать различные тонкости, прямо или косвенно связанные с генетическим алгоритмом. Если подобная тема...

Генетический алгоритм - Delphi
Помогите пожалуйста не могу понять даже принципа генетического алгоритма. Необходимо разработать компьютерную программу, которая...

Генетический алгоритм - C (СИ)
Здравствуйте. Помогите написать программу, работающую по генетическому алгоритму. Искал на форуме, либо ссылка скрыта или таких случаев...


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

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

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