4 / 4 / 1
Регистрация: 18.09.2020
Сообщений: 149

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

01.11.2020, 15:18. Показов 4858. Ответов 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,319
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru