Форум программистов, компьютерный форум CyberForum.ru

Генетический алгоритм подбора максимума/минимума разных функций - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Нахождение простого элемента в массиве http://www.cyberforum.ru/cpp-beginners/thread1066153.html
Не получается вывести простое число из массива. Подскажите пожалуйста, в чем ошибка? #include <iostream> #include <conio.h> #include <cstdlib> using namespace std; int main() {
C++ Шаблонный класс "множества". Операции над множествами Доброго времени суток. Суть моего задания заключается в создании шаблонного класса "множества" и затем операции над этими множествами(пересечение, объединение, разность, прямое произведение). Я пока пытаюсь написать код для реализации "пересечения" 2х множеств. Прошу указать на мои ошибки, помочь доработать код.. (я написал класс(нужно написать еще конструктор класса), шаблонную функцию для... http://www.cyberforum.ru/cpp-beginners/thread1066143.html
Найти в файле самую длинную строку и переписать её в другой файл C++
всем привет возник такой вопрос есть файл в который вносятся числа разного количества. по этому есть несколько строк введённых чисел. вопрос в следующем как можно найти самую длинную строку и переписать её в другой файл?
Нежелательное добавление информации в файл, исправить код C++
Помогите переделать, я запутался, делал с преподом задачу. В общем есть файл например 6256 Mihin 4560 4322 Muhin 4500 7756 Kuzin 1900 4622 Komarov 9000 3322 kyznec 4000 таб номер, фамилия и оклад. У меня есть функция которая формирует хеш тамбл, но в ней у меня и фуекция добавления и получается что когда я запускаю программу, она дописывает в файл уже что есть и добавляет ещё. Я думаю...
C++ Запросить название учебного заведения, специальность и номер группы. записав их в массив из 3 строк. Подсчитать длины каждой строк http://www.cyberforum.ru/cpp-beginners/thread1066091.html
Запросить у пользователя название учебного заведения, специальность и номер группы. записав их в массив из 3 строк. Подсчитать длины каждой строки.
C++ Сортировка массива методом центрированной вставки Укажите на ошибки пожалуйста. #include <conio.h> #include <iostream.h> void sort(int a, int size) { int i, j, k; int *b=new int; int m = size/2; //медиана подробнее

Показать сообщение отдельно
MihaniX
 Аватар для MihaniX
134 / 44 / 1
Регистрация: 06.08.2013
Сообщений: 292
Записей в блоге: 4
09.01.2014, 16:01     Генетический алгоритм подбора максимума/минимума разных функций
Собсно, вот:
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
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <numeric>
 
#define FIRST -50
#define LAST 50
 
using namespace std;
 
const size_t x=10;
 
int fitness(int &n)
{
    n=n*2+n;
    return n;
}
 
void selection(int a[])
{
    for(int i=0; i<x; ++i)
        for(int j=i+1; j<x; ++j)
            if(fitness(a[j])<fitness(a[i]))swap(a[i],a[j]);
    copy(a + x / 2, a + x, a);
}
 
int mutation(int &t)
{
    do
        {
            t += ((rand() % 2 == 1) ? 1 : -1);
        }
        while (FIRST<=t<=LAST);
    return t;
}
 
int main()
{
 
    srand(time(NULL));
 
    int n=0;
    int data_base[x]={n};
 
    /*...*/
 
    for (int rounds=0; rounds<100; rounds++)
    {
        for (size_t i = 0; i < x; ++i)
            data_base[i]=mutation(data_base[i]);
        selection(data_base);
    }
 
    for (size_t i=0; i<x; i++)
        {
            cout<<data_base[i];
        }
    return 0;
}
//Если менять int fitness(int &n) {} можно менять функции. И можно убрать ограничение аргумента #define FIRST -50
#define LAST 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
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <numeric>
 
using namespace std;
 
int main()
{
    srand((unsigned int)time(NULL));
    const size_t N = 1000;
    int a[N] = { 0 };
    for (;;)
    {
        for (size_t i = 0; i < N; ++i)
            a[i] += ((rand() % 2 == 1) ? 1 : -1);
        sort(a, a + N);
        copy(a + N / 2, a + N, a);
        cout << accumulate(a, a + N, 0) / N <<endl;
    }
    return 0;
}
Поиск самых больших чисел.

* В планах еще скрещивание осилить))

Добавлено через 2 минуты
Кому интересно, добавил:

Добавлено через 1 минуту


Кому интересно: подбор ключа 2048 бит генетически у меня ~12 секунд подбирает.
Кликните здесь для просмотра всего текста
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
#include <stdio.h>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <vector>
#include <ctime>
 
using namespace std;
 
#define KEY_LEN 2048 // Длина ключа
bool key[KEY_LEN]; //Неизвестный ключ
 
#define POP_SIZE 20 // Размер популяции
#define ELITE 5 // Количество привелигированных особей
struct gen_struct
{ // Особь, кортеж из генов и значения пригодности
 bool gen[KEY_LEN];
 int fitness;
 gen_struct()
 { //Инициализация случайными значениями
  for(int i=0;i<KEY_LEN;++i)
   gen[i]=(rand()%2==0);
 }
 bool operator<(const gen_struct & g)const
 {
  return (g.fitness>fitness);
 }
 gen_struct(const gen_struct& g)
 {
  for(int i=0;i<KEY_LEN;++i) gen[i]=g.gen[i];
  fitness=g.fitness;
 }
 void Mutate(){ //Оператор мутаций
  gen[rand()%KEY_LEN]=rand()%2;
 }
 void Crossingover(gen_struct & g)
 { //Оператор скрещивания
  for(int i=0;i<KEY_LEN;++i)
    {
   if(rand()%2)
   {
    gen[i]=g.gen[i];
   }
  }
 }
};
 
int Fitness(bool gen[])
{ //Целевая функция
 int ret=0;
 for(int i=0;i<KEY_LEN;i++)
    {
  ret+=(key[i]!=gen[i]);
 }
 return ret;
}
 
 
void GA(gen_struct &ret)
{
 vector<gen_struct> pop;
 pop.resize(POP_SIZE);
 while(1){
  for(int i=0;i<POP_SIZE;++i)
   if((pop[i].fitness=Fitness(pop[i].gen))==0)
     {
      ret=pop[i];
      return;
     }
  sort(pop.begin(), pop.end());
  for(int i=ELITE;i<POP_SIZE;++i)
    {// 5 лучших остаются без изменений
   pop[i].Crossingover(pop[rand()%(ELITE)]);
   pop[i].Mutate();
   for(int i=0;i<KEY_LEN; i++)
   {
     cout << ret.gen[i];
   }
 
  }
 }
}
 
 
int main()
{
    srand(time(NULL));
  cout<<"=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!="<<endl;
  for(int i=0;i<KEY_LEN;i++)
  {
    key[i]=(rand()%2==0);
    cout<<key[i];
  }
  cout<<endl<<"=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!="<<endl;
  gen_struct ret;
  GA(ret);
  cout<<"=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!="<<endl;
  cout << "key=" <<endl;
  for(int i=0;i<KEY_LEN; i++)
  {
    cout << ret.gen[i];
  }
  cout<<endl<<"=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!=!="<<endl;
  cout << endl;
}


Добавлено через 1 минуту
Тоесть 12 секунд если не выводить на экран промежуточную популяцию. Ну вы поняли)

Добавлено через 15 минут
ап...

Добавлено через 20 минут
ни кто не подскажет?...

Добавлено через 12 часов 31 минуту
аппп.......

Добавлено через 4 часа 15 минут
ы...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 13:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru