Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
4 / 4 / 1
Регистрация: 18.09.2020
Сообщений: 149

Решение Диофантова уравнения через генетический алгоритм

01.11.2020, 15:18. Показов 4807. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача следующая: решить уравнение вида a+2b+3c+4d=30 через генетический алгоритм, написал я код, только он почему-то вместо того, чтобы генерировать с каждым циклом числа всё лучше, генерирует такие соотношения чисел, что процентный шанс которых в итоге становится нулевым, хотя я даже случайные мутации туда внёс, НЕ НАДО МНЕ ПОЖАЛУЙСТА КИДАТЬ ГОТОВЫЙ КОД, я его знаю, и даже можно сказать делал свой код, по блок-схеме к нему, прошу просто указать ГДЕ КОНКРЕТНО у меня в коде ошибка, которая заставляет его вести себя таким образом.
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
#include <iostream>
#include <cstdlib>
#include <time.h>
#include <math.h>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int a,b,c,d,e;
    e = 30;
    double revcof;
    srand(time(0));
    int sol[4][5];
    int ans[5];
    int diff[5];
    int par[5][2];
    int child[4][5];
    float percentpar[5];
    float chanse[1000];
    for(int f = 0;f<5;f++) // тут задаются первоначальные массивы чисел
    {
        for(int g =0;g<4;g++)
        {
            sol[g][f] = rand() % 30;
            cout << sol[g][f] << ",";
        }
        cout << endl;
    }
    while(diff[0] != 0 || diff[1] != 0 || diff[2] != 0 || diff[3] != 0 || diff[4] != 0) // цикл должен выполнятся до тех пор, пока разница между ответами и 30 не станет равной нулю.
    {
    for(int h = 0;h<5;h++) // Здесь вычисляется разность между ответами и 30, после чего вычисляется сумма обратных коэффициентов
    {
        ans[h] = sol[0][h] + 2 * sol[1][h] + 3 * sol[2][h] + 4 * sol[3][h];
        diff[h] = abs(ans[h] - 30);
        cout << "diff." << diff[h] << endl;
        revcof += 1.000000/diff[h];
    }
    for(int h = 0;h<5;h++) // Тут вычисляется процент шанса становления родителем, и округляется до 1 знака после запятой.
    {
        percentpar[h] = (1.00/diff[h])/revcof*100;
        percentpar[h] = round(percentpar[h]*10)/10;
        cout << percentpar[h] << endl; 
    }
    cout << "FINISH" << endl;
    for(int m = 0;m<5;m++) // В этих вложенных циклах грубо говоря генерируется рандом, который в дальнейшем и будет определять вероятность становления родителем.
    {
        int f = percentpar[m] * 10;
        for(int l = 0;l<f;l++)
        {
            int k;
            k = percentpar[m-1]*10;
            if(m == 0)
            {
            chanse[l] = 0;
            }
            if(m == 1)
            {
            chanse[l+k] = 1;
            }
            if(m == 2)
            {
            k = percentpar[m-1]*10 + percentpar[m-2]*10;
            chanse[l+k] = 2;
            }
            if(m==3)
            {
            k = percentpar[m-1]*10 + percentpar[m-2]*10 + percentpar[m-3]*10;
            chanse[l+k] = 3;
            }
            if(m==4)
            {
            k = percentpar[m-1]*10 + percentpar[m-2]*10 + percentpar[m-3]*10 + percentpar[m-4]*10;
            chanse[l+k] = 4;
            }
        }
    }
    for(int a=0;a<5;a++) // цикл по сути кидает игральную кость, с 1000 сторонами и шансом который он берёт из цикла предыдущего
    {
        int f = rand()%1001;
        par[a][0] = chanse[f];
        do // этот цикл не даёт возможности быть одновременно обоими родителями одному кандидату
        {
        int e = rand()%1001;
        par[a][1] = chanse[e];
        }
        while(par[a][1] == par[a][0]);
        cout << par[a][0] << "^" << par[a][1] << endl;
    }
    for(int b = 0;b<5;b++) // Ну а этот цикл уже отвечает за перестановку "генов" в хромосомах с рандомом, сгенерированным в прошлом цикле
    {
            int rannum1 = rand()%4 + 1;
        int gene = par[b][0];
    for(int a = 0;a<rannum1;a++)
    {
        sol[a][b] = sol[a][gene];
        //cout << sol[a][b] << ",";
    }
    int rannum2 = 4 - rannum1;
    gene = par[b][1];
    for(int c = 0; c < rannum2;c++)
    {
        sol[c][b] = sol[c][gene];
        //cout << sol[c][b] << ",";
    }
    int rannum3 = rand()%30 + 1; // Здесь создаётся случайная мутация в рандомной хромосоме
    int rannum4 = rand()%4 + 1;
    sol[rannum4][b] = rannum3;
    //cout << sol[rannum4][b] << endl;
    //cout << "rannum 4 = " << rannum4 << endl;
    }
    }
    cout << "Решение: a = " << sol[0][0] << "b = " << sol[1][0] << "c = " << sol[2][0] << "d = " << sol[3][0] << endl;
    return 0;
}
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.11.2020, 15:18
Ответы с готовыми решениями:

Решение диофантова уравнения
Здравствуйте! Пишу программу для промышленного контроллера и столкнулся с такой проблемой. Есть натуральное число N=a*b. Множители a и...

Решение диофантова уравнения 4𝑥 + 5𝑦 = 0
Здравствуйте! Очень нужна помощь в решении диофантового уравнения 4𝑥 + 5𝑦 = 0. Значений переменных 𝑥 и 𝑦 нужно искать...

Найти все неотрицательные решения диофантова уравнения
Напишите программу, которая выписывает все неотрицательные решения диофантова уравнения: ax + by = c Добавлено через 4 минуты ...

20
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
10.11.2020, 16:07
Студворк — интернет-сервис помощи студентам
Задание слишком простое, решение легко получить простой рэндомной подстановкой коэфф. Поэтому у меня результат получился уже после первого спаривания. Нужно увеличивать значение формулы, тогда и количество вариантов вырастет. Попробую a+2b+3c+4d=1234.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.11.2020, 16:07

Нахождение корней линейного диофантова уравнения с пятью переменными при помощи генетического алгоритма
Помогите, пожалуйста, решить!!! Решить в целых числах Диофантово уравнение: A1*x1 + A2*x2 + A3*x3 + A4*x4 + A5*x5 = D, где x -...

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

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

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

Генетический алгоритм
Ребятки помогите запилить в Делфи генетический алгоритм,край до четверга ночи(((а то препод дал задание сделать в Делфи а я незнаю как...


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru