Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 19.12.2016
Сообщений: 6
1

Генетический алгоритм hello world

10.10.2018, 22:23. Показов 1186. Ответов 1
Метки нет (Все метки)

Добрый день написал генетический алгоритм hello world, но на 100 строке ошибка выход за пределы, пожалуйста помогите исправить ошибку, а то тысячу итерации выводит одно и тоже..
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
143
144
145
146
147
148
149
150
151
152
153
154
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Collections.ArrayList;
using System.Collections;
 
 
namespace HelloWorld
{
 
 
 
 
 
    class Program
    {
 
        public static int POPULATION_SIZE = 1000;
        public static double ELITE_RATE = 0.1;
        public static double SURVIVE_RATE = 0.5;
        public static double MUTATION_RATE = 0.2;
        public static string TARGET = "Hello World!";
        private static int MAX_ITER = 1000;
        public static Random r = new Random();
 
        class Genome { 
           public String str;
           public int fitness;
            public Genome(String str)
            {
                this.str = str;
                int fitness = 0;
                for (int j = 0; j < str.Length; j++)
                {
                    fitness += Math.Abs(str[j] - GAHelloWorld.TARGET[j]);
                }
                this.fitness = fitness;
            }
 
            public int compareTo(Genome o)
            {
                return fitness - o.fitness;
            }
 
            public String toString()
            {
                return fitness + " " + str;
            }
 
        }
        public class GAHelloWorld
        {
            public static string TARGET = "Hello World!";
 
            public String mutate(String str) //мутация
            {
                int tsize = TARGET.Length;
                int ipos = (int)(r.Next(100) / 10.0 * tsize);
                char delta = (char)(r.Next(100) / 10.0 * 255);
 
                return str.Substring(0, ipos) + delta + str.Substring(ipos + 1);
 
            }
 
            void initializePopulation(List<Genome> population) //объявление популяции
            {
                int tsize = TARGET.Length;
 
                for (int i = 0; i < POPULATION_SIZE; i++)
                {
                    StringBuilder str = new StringBuilder();
                    for (int j = 0; j < tsize; j++)
                    {
 
                        str.Append((char)(r.Next(100) / 10.0 * 255));
                    }
                    Genome citizen = new Genome(str.ToString());
                    population.Add(citizen);
                }
 
            }
            List<Genome> mate(List<Genome> population) //скрещивание 
            {
                int esize = (int)(POPULATION_SIZE * ELITE_RATE);
                int tsize = TARGET.Length;
                List<Genome> children = new List<Genome>();
 
                selectElite(population, children, esize);
 
                for (int i = esize; i < POPULATION_SIZE; i++)
                {
                    int i1 = (int)(r.Next(100) / 10.0 * POPULATION_SIZE * SURVIVE_RATE);
                    int i2 = (int)(r.Next(100) / 10.0 * POPULATION_SIZE * SURVIVE_RATE);
 
                    int spos = (int)(r.Next(100) / 10.0 * tsize);
 
                    String str = population[i1].str.Substring(0, spos) + 
                            population[i2].str.Substring(spos); // тут ошибка скорее всего
                    if (r.Next(100) / 10.0 < MUTATION_RATE)
                    {
                        str = mutate(str);
                    }
                    Genome child = new Genome(str);
                    children.Add(child);
 
 
                }
                return children;
            }
            private void selectElite(List<Genome> population, List<Genome> children, int esize)
            {
                for (int i = 0; i < esize; i++)
                {
                    children.Add(population[i]);
                }
            }
 
            private void go()
            {
                List<Genome> population = new List<Genome>();
                initializePopulation(population);
 
                for (int i = 0; i < MAX_ITER; i++)
                {
                    ArrayList.Adapter(population);
 
                    //Collections.sort(population);
 
                    Console.WriteLine(i + " > " + population[0]);
 
                    if (population[0].fitness == 0)
                    {
                        break;
                    }
 
                    population = mate(population);
                }
 
            }
 
 
            static void Main(string[] args)
            {
                
                GAHelloWorld a = new GAHelloWorld();
                a.go();
 
 
            }
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.10.2018, 22:23
Ответы с готовыми решениями:

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

Генетический алгоритм
Есть две рандомные последовательности каждая из 6 чисел. Как на С# описать такие правила...

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

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

1
18 / 15 / 8
Регистрация: 24.02.2013
Сообщений: 47
10.10.2018, 23:59 2
Пробуйте все-таки пользоваться отладчиком студии, многое станет ясно, это первое.
Второе, собственно причина. Перед строчкой 100 вы рассчитываете i1 и i2. Формула построена таким образом, что диапазон значений будет всегда выше чем количество элементов массива. Пару раз прогнал, были значения в районе 3000, а элементов в массиве всего 1000, OutOfRangeexception налицо.
Так что формулу надо подкорректировать, возможно вместо 100 поставить 10 и тогда случайные числа будут попадать в нужный диапазон.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.10.2018, 23:59

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

Генетический алгоритм
Нужна помощь по лабе. Требуется реализовать генетический алгоритм, который будет решать систему...

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

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


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

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

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