Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
1 / 1 / 0
Регистрация: 18.03.2011
Сообщений: 5

Вопросы по генетическим алгоритмам

18.03.2011, 23:43. Показов 2687. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите разобраться с вопросами по генетическим алгоритмам.

1. Если полностью исключить мутацию из алгоритма, что произойдет с результатом и почему?
2. Для чего, по Вашему мнению, необходимо использовать селекцию?
3. Опишите, как в программе осуществляется декодирование хромосомы.
4. Опишите назначение процедуры statistics и как она работает.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.03.2011, 23:43
Ответы с готовыми решениями:

Посоветуйте книги по генетическим алгоритмам
посоветуйте подробные книжечки об генетических алгоритмах

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

Многослойный персептрон обучить генетическим алгоритмом
Помогите в разработке кода. Нужно Многослойный персептрон обучить с помощью генетического алгоритма. На входе вектора значений на выходе n...

6
 Аватар для Norby
66 / 66 / 5
Регистрация: 12.03.2008
Сообщений: 392
19.03.2011, 11:36
Вот тут куча инфы
0
1 / 1 / 0
Регистрация: 18.03.2011
Сообщений: 5
20.03.2011, 19:38  [ТС]
ничего подходящего там не нашел
0
2631 / 1643 / 267
Регистрация: 19.02.2010
Сообщений: 4,362
20.03.2011, 22:35
Цитата Сообщение от satel69 Посмотреть сообщение
Помогите разобраться с вопросами по генетическим алгоритмам.
1. Если полностью исключить мутацию из алгоритма, что произойдет с результатом и почему?
2. Для чего, по Вашему мнению, необходимо использовать селекцию?
3. Опишите, как в программе осуществляется декодирование хромосомы.
4. Опишите назначение процедуры statistics и как она работает.
4. К телепатам. Я процедуру statistics нигде в упор не видел.
3. Может осуществляться разными способами - в зависимости от того, какие значения (булевы, целочисленные (и какой размерности) или плавающие) кодируем в хромосоме и каков желаемый баланс между используемой памятью и процессорными затратами (можно полностью избежать работы по кодированию-декодированию, храня переменные в их реальном виде, а можно тратить время на то, чтобы буквально бит к биту поджать друг к другу все данные и сэкономить на этом память).
2. Можете вообще не использовать. Если есть суперкомпьютер - ведь основная доля расчетов (при неиспользовании селекции) придётся на работу с неоптимальными вариантами решения. Да и память на хранение неотстрелянных неоптимальных хромосом будет расти от поколения к поколению по меньшей мере на константный размер (а при желании - можно и до комбинаторного взрыва по вычислениям и по памяти добраться).
1. Результат перестанет меняться после того, как будут проверены все возможные варианты скрещиваний. И результат (наилучшее решение) будет сильно зависеть от начальной генерации набора хромосом (т.к. именно начальный набор хромосом и будет, при использовании только скрещивания, определять - куда вообще, т.е. к какому результату, можно будет в итоге приползти).
0
1 / 1 / 0
Регистрация: 18.03.2011
Сообщений: 5
21.03.2011, 00:40  [ТС]
спасибо большое, что то хоть начинает проясняться, а то весь интернет перерыл и ничего стоящего.
только вот что касается четвертого вопроса, statistics присутствует в программе и нужно определить какую процедуру он выполняет и как работает. Кстати, вот сама программа по которой и нужно ответить на эти вопросы. Извиняюсь, что сразу не предоставил
Pascal
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
program GAv9;
uses crt; {подключение библиотеки по обслуживанию консоли}
 
const { объявление констант}
maxpop = 80;  {максимальное число популяций}
maxstring = 20;  {максимальная длина строки}
dim = 2;  {размерность пространства поиска}
 
type
     allele = boolean; {Алель - битовое значение гена в битовой строке}
     chromosome = array[1..maxstring*dim] of allele;   {битовая строка}
     fenotype = array[1..dim] of real;
     individual = record
     chrom:chromosome; { генотип = битовая строка }
      x:fenotype; { фенотип = массив вещественных
      координат точки в пространстве поиска }
      fitness:real; {значение целевой функции }
      end;
     population = array[1..maxpop] of individual;
 
const
     xmax:fenotype=(5.12,5.12);{массив максимальных
     значений для координат  точки в пространстве поиска}
     xmin:fenotype=(-5.12,-5.12);{массив минимальных
     значений для координат точки в пространстве поиска}
 
var { объявление переменных }
   oldpop, newpop, intpop :population;  {Три непересекающихся
                    популяции - старая, новая и промежуточная}
   popsize, lchrom, gen, maxgen: integer; {Глобальные целые переменные}
   pcross, pmutation, sumfitness:real;  {глобальные вещественные переменные}
   nmutation, ncross:integer;  {Статистические целые}
   avg, max, mmin, min:real;  {Статистические вещественные}
   h, psize, razpop, s, b:Integer;
   Otv, Otvet:Real;    {Прочие переменные}
   Povtor : integer;   {количество повторов программы}
   Fres : text;        {текстовый файл для вывода результатов}
   Tmp:string;         {временная текстовая переменная}
   Fname: string;      {Имя файла}
 
{Вероятностные процедуры}
function random_:real; {процедура нахождения случайного числа }
begin
random_:= random(65535)/(65535-1); {вычисление случайного числа}
end;
 
function flip(probability:real):boolean; {функция ->подбрасывание монетки - true если орел}
begin
if probability = 1.0 then
flip := true
else
flip :=(random_<= probability);
end;
 
function rnd(low,high:integer):integer; {Функция  - >  случайный выбор между low и high}
 var
   i:integer;
begin
   if low >= high then
   i := low
else begin
   i := trunc( random_ * (high-low+1) + low); {преобразование  вещественного числа в целое}
   if i > high then i := high;
end;
   rnd := i;
end;
 
{интерфейсные процедуры: decode and objfunc}
 
function objfunc(x:fenotype):real;
begin
 objfunc:= int(x[1])+int(x[2]);  {исходная функция двух переменных}
end;
 
procedure decode(chrom:chromosome; lbits:integer; var x:fenotype);
{Процедура декодирования строки в массив вещественных
 координат точки в пространстве поиска - true=1, false=0}
var
  i,j:integer;
  f, accum, powerof2:real;
begin
for i:=1 to dim do begin
  accum :=0.0; {инициализация переменной для подсчета сумма}
  powerof2 := 1; {инициализация переменной для подсчета произведения}
  f:=1;
for j := 1+lbits*(i-1) to lbits+lbits*(i-1) do begin
 if chrom[j] then accum := accum + powerof2;
  powerof2 := powerof2 * 2;
  f:=f*2;
end;
  x[i] := xmin[i]+(xmax[i]-xmin[i])*accum/(f-1); {выходной массив с координатами x}
end ;
end;
 
{Расчет статистических величин: statistics}
procedure statistics(popsize:integer;var max,avg,min,sumfitness:real;
                     var pop:population);
 {Расчет статистик популяции}
var
   j:integer;
begin
{Инициализация}
   sumfitness := pop[1].fitness;
   min := pop[1].fitness;
   max := pop[1].fitness;
   {Цикл для max, min, sumfitness }
   for j := 2 to popsize do with pop[j] do begin
   sumfitness := sumfitness + fitness;
   {Накопление суммы значений функции пригодности}
   if fitness>max then max := fitness;
   {Новое значение max}
   if fitness<min then min := fitness;
   {Новое значение min}
end;
   {Расчет среднего}
   avg := sumfitness/popsize;
end;
 
{Процедура инициализации initpop}
procedure initpop;
{Инициализация начальной популяции случайным образом }
var
   j, j1:integer;
begin
   for j := 1 to popsize do with oldpop[j] do begin
   for  j1  :=  1 to lchrom*dim do chrom[j1]:=flip(0.5);
   {Бросок монетки}
   decode(chrom,lchrom,x);
   {Декодирование строки}
   fitness := objfunc(x);
   {Вычисление  начальных  значений   функции пригодности}
   end;
end;
 
 {3 генетических оператора: отбора (select), скрещивания (crossover) и мутации (mutation)}
procedure select;   {процедура выбора}
var
 ipick:integer;
procedure shuffle(var pop:population); {процедура перемешивания популяции в процессе отбора}
var
  i,j:integer;   {переменные цикла}
  ind0:individual;
begin
for i:= popsize downto 2 do begin
  j:= random(i-1)+1;
  ind0:=pop[i];
  pop[i]:=pop[j];
  pop[j]:=ind0;
 end;
end;
 
function select_1:integer;
var
 j1,j2,m:integer;
begin
 if (ipick>popsize) then begin
 shuffle(oldpop);
 ipick:=1
end;
 j1:=ipick;
 j2:=ipick+1;
 if (oldpop[j2].fitness<oldpop[j1].fitness) then
 m:=j2
else
 m:=j1;
 ipick:=ipick+2;
 select_1:=m;
end;
var
 j:integer; {переменная  цикла}
begin
 ipick:=1;
for j:=1 to popsize do begin
 intpop[j]:=oldpop[select_1];
end;
 oldpop:=intpop;
end;
 
function mutation (alleleval:allele; pmutation:real;
var nmutation:integer):allele;
{мутация одного бита в строке (аллеля) с вероятностью pmutation}
{подсчет числа мутаций}
var
 mutate:boolean; {логический тип данных True=1,False=0}
begin
 mutate := flip(pmutation); {имитация мутации с вероятностью pmutation}
 if mutate then begin {true если орел} {если мутация произошла}
 nmutation := nmutation + 1;  {увеличиваем счетчик мутаций на 1}
 mutation := not alleleval; {Изменение  битового значения}
end else
 mutation := alleleval; {Нет изменения битового значения}
end;
 
procedure crossover(var parent1, parent2, child1, child2:chromosome;
flchrom:integer; var ncross, nmutation, jcross:integer;
var pcross, pmutation:real); {Процедура скрещивания 2 родительских строк, результат помещается в 2 строках-потомках}
{вещественные переменные вероятности скрещивания и мутации}
 
var
j:integer;  {переменная  цикла}
begin
if flip(pcross) then begin  {Выполняется скрещивание с вероятностью pcross}
jcross := rnd(1,flchrom-1); {Определение точки сечения в диапазоне между 1 и L -1}
 
ncross := ncross + 1;  {Инкрементирование счетчика скрещиваний}
end else
  jcross := flchrom;
  {певая часть обмена обмена, 1 to 1 and 2 to 2 }
  for j := 1 to jcross do begin
   child1[j] := mutation(parent1[j], pmutation, nmutation);
   child2[j] := mutation(parent2[j], pmutation, nmutation);
  end;
  {вторая часть обмена, 1 to 2 and 2 to 1 ]
  if jcross<>flchrom then
  {пропуск, если точка скрещивания равна flchrom--
          скрещивание не происходит}
  for j := jcross+1 to flchrom do begin
   child1[j] := mutation(parent2[j], pmutation, nmutation);
   child2[j] := mutation(parent1[j], pmutation, nmutation);
   end;
end;
{Процедура создания нового поколения: generation}
procedure generation;
{Генерирование нового поколения при помощи отбора, скрещивания и мутации}
{Прим: предполагается, что популяция имеет четный размер}
var
 j,mate1, mate2,jcross:integer;{переменные целого типа, отвечающие за выбор родительской пары}
begin
 select;
 j := 1;
repeat  {выполняются отбор, скрещивание и мутация, пока полностью не сформируется новая популяция - newpop}
 mate1:= j; {выбор родительской пары}
 mate2:= j+1;
 {скрещивание и мутация - мутация вставлена в процедуру скрещивания}
 crossover(oldpop[mate1].chrom, oldpop[mate2].chrom,newpop[j ].chrom, newpop[j+1].
 chrom,lchrom*dim, ncross, nmutation, jcross, pcross, pmutation); {Декодирование строки и вычисление пригодности}
with newpop[j] do begin
 decode(chrom, lchrom,x);   {Декодирование хромосомной последовательности}
 fitness := objfunc(x);     { вычисление пригодности}
end;
with newpop[j+1] do begin
 decode(chrom, lchrom,x);   {Декодирование хромосомной последовательности}
 fitness := objfunc(x);     { вычисление пригодности}
end;
 j := j + 2;
until j>popsize
end;
 
begin {Главная программа}
 BEGIN
clrscr;
 Write('Введите количество повторов программы ');
 Readln(Povtor);
 Writeln;Writeln;
For h:=1 to 2 do begin {Выбор количества поколений}
 case h of
 1 : psize:=40; {Количество поколений}
 2:  psize:=80;
 end;
 for s:=1 to 3 do begin
  Case s of
  1: razpop:=8; {Размеры популяций}
  2: razpop:=12;
  3: razpop:=20;
 end;
  {Формирование имени файла}
   Str(psize,Tmp);
   Str(razpop,Tmp);
   Fname:=Fname+'-'+Tmp+'.txt';
   Otv:=0; {Инициализация переменной ответа}
   Writeln('Поиск минимума: Размер популяции ',razpop:2,' Количество поколений ', psize:2 );
   {открытие файла для вывода результатов}
   Assign(FRes,FName);   Rewrite(FRes);
   Writeln(FRes,'Поиск минимума: Размер популяции ',razpop:2,' Количество поколений ', psize:2 );
  For b:=1 to Povtor do begin {Программа прогоняется Povtor раз для более точного ответа ответа}
   popsize:=razpop; {размер популяции}
   lchrom:=20; {число битов на один кодируемый параметр. Каждая переменная кодируется 20 битами}
   maxgen:=psize; {максимальное число поколений}
   pmutation:=0.01; {вероятность скрещивания}
   pcross:=0.9; {вероятность мутации}
   randomize;{Инициализация генератора случайных чисел}
   nmutation := 0; {Инициализация счетчика мутаций}
   ncross := 0; {Инициализация счетчика количества скрещиваний}
   initpop;    {Инициализация популяции}
   statistics(popsize, max, avg, min, sumfitness, oldpop);
   gen := 0; {Установка счетчика поколений в 0}
   
         if b=1 then mmin:=min;
         
  repeat {Главный итерационный цикл}
   gen := gen + 1;  {инкрементация счетчика поколений}
   generation;  {создания нового поколения}
   statistics(popsize,  max,  avg,  min,  sumfitness, newpop);
   Writeln(Fres, 'N=',b:3,' Минимум функции= ',min:10:4);
   oldpop := newpop; {переход на новое поколение }
   until (gen >= maxgen);
   Otv:=Otv+min;
   
   if mmin>min then mmin:=min;
 
             
  end;{End циклов основной программы}
   Otvet:=Otv/Povtor;{Находим среднее значение ответа.}
   Writeln('Средний минимум функции  ',otvet:10:4);
   Writeln(FRes,'Средний минимум функции ',otvet:10:4);
   
    writeln('Лучшее значение функции=',mmin);
    
   writeln;
   Otv:=0; {Очищаем переменную}
   Close(FRes);
  End;{End цикла выбора количества популяций}
  End; {End цикла выбора количества поколений}
   Readln;
 End;
End. {Конец Главной программы)
0
0 / 0 / 0
Регистрация: 07.06.2012
Сообщений: 5
06.12.2012, 07:52
Добрый день!
Подскажите, как вы ответили на вопрос №4. Опишите назначение процедуры statistics Вашей программы и как она работает.
Заранее, спасибо.
0
0 / 0 / 0
Регистрация: 23.07.2016
Сообщений: 4
23.07.2016, 22:58
VTsaregorodtsev, Генетические алгоритмы помоги пожалуйста
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.07.2016, 22:58
Помогаю со студенческими работами здесь

Задача о 8 ферзях генетическим алгоритмом (бинарная кодировка)
Добрый день! Нужно решить задачу о 8 ферзях генетическим алгоритмом. Алгоритм, в сущности, ясен, но сразу возникли трудности с бинарной...

Когда вопросы кончаются, сделать кнопку неактивной и вывести сообщение о том, что вопросы кончились
Кто знает ребят подскажите в чем проблема, есть метод обновляющий текст в TextView (всего 6 вопросов). Так вот когда вопросы кончаются...

Задача по алгоритмам
Доброй ночи ! Есть такая задачка повышенной сложности. По большому счету надо в метод public static void sort(String array)...

Книги по алгоритмам
Всем привет! Хочу подтянуть свои знания в области алгоритмов, алгоритмики и иже с ними. Нужны какие-нибудь книги по данной тематике...

книги по алгоритмам
Ищу книгу по основам алгоритмизации. Главный требование это простой и доступный стиль изложения материала в книге и была предназначена для...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru