O
okwell5
Задача: есть цель(круг), к которой за определенное количество шагов особи-круги либо достигают, либо не достигают. Достижение с помощью генетического алгоритма.
Сам алгоритм я написал, все уже вроде готово. Но с визуализацией мне дается тяжело. Осталось только в цикле шагов рисовать объекты(как движение или хотя бы новые как на картинке). Должно получиться примерно такое движение(или посекундное рисование)(см. картинку).
Вот код:
По коду: координаты х,y - это H.genes[0] и H.genes[1] соответственно
Сам алгоритм я написал, все уже вроде готово. Но с визуализацией мне дается тяжело. Осталось только в цикле шагов рисовать объекты(как движение или хотя бы новые как на картинке). Должно получиться примерно такое движение(или посекундное рисование)(см. картинку).
Вот код:
C++:
// moveC.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <stdlib.h>
#include<stdio.h>
//#include <gl/glut.h"
#include <math.h>
#include<glut.h>
GLint Width = 512, Height = 512;
//--------------------------------
const int N=3;
const int n=4;
float L=400;
float h=1;
//--------------------------------
class hromos{
public:
float genes[n];
};
//--------------------------------
hromos *H;
//--------------------------------
hromos mutation(hromos hr)
{
if(hr.genes[0]<L/2) hr.genes[0]+=hr.genes[2];//x
if(hr.genes[0]>L/2) hr.genes[0]-=hr.genes[2];//x
hr.genes[1]+=hr.genes[3];//y
hr.genes[3]+=h;//hy
return hr;
}
//--------------------------------
void crossover_and_mutation()
{
int g1,g2;
float c;
hromos *ocross;
ocross=new hromos[N];
hromos *mas;
mas=new hromos[3*N];
//выбор 2х особей
int io1,io2;
//разные индексы
for(int i=0;i<N/2;++i)
{
do
io1=rand();
while(io1>=N && io1>=n);
io2=io1;
while(io2=io1 && io2>=n)
io2=rand();
//копируем выбранные особи в отдельный массив для кроссинговера
ocross[i]=H[io1];
ocross[i+1]=H[io2];
//выбираем 2 случайных гена для обмена
do
g1=rand();
while(g1>=N && g1>=n);
g2=g1;
while(g2=g1 && g2>=n)
g2=rand();
//обмен первыми генами
c=ocross[i].genes[g1];
ocross[i].genes[g1]=ocross[i+1].genes[g1];
ocross[i+1].genes[g1]=c;
//обмен вторыми генами
c=ocross[i].genes[g2];
ocross[i].genes[g2]=ocross[i+1].genes[g2];
ocross[i+1].genes[g2]=c;
//мутация потомков
ocross[i]=mutation(ocross[i]);
ocross[i+1]=mutation(ocross[i+1]);
}
//помещаем всех особей(поп.+потомки) в 1 массив для сортировки
for(int i=0;i<N;++i)
mas[i]=H[i];
int k=0;
for(int i=N;i<(N+N);++i)
{
mas[i]=ocross[k];
k++;
}
//сортируем по лучшим показателям x,y по убыванию
hromos d;
for(int i=0;i<(N+N+N);++i)
for(int j=i;j<(N+N+N);++j)
{
if((mas[i].genes[0]+mas[i].genes[1])<(mas[j].genes[0]+mas[j].genes[1]))
{
d=mas[i];
mas[i]=mas[j];
mas[j]=d;
}
}
//из mas создаем новую популяци из лучших особей
for(int i=0;i<N;++i)
H[i]=mas[i];
//рисуем особей
//высвобождаем память
delete[] ocross;
}
//--------------------------------
int _tmain(int argc, char* argv[])
{
int steps;
printf("\nInput count of steps: ");
scanf("%d", &steps);
H=new hromos[N];
for(int i=0;i<N;++i)
for(int j=0;j<n;++j)
H[i].genes[j]=rand();
//на каждом шаге должна рисоваться новая популяция
for(int step=1;step<steps;++step)
{
crossover_and_mutation();
//здесь надо нарисовать получившуюся новую популяцию H[i]
}
}