С Новым годом! Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521

30 вложенных циклов

19.10.2019, 10:15. Показов 3800. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Помогите, пожалуйста! Решаю задачу. В ней у меня фигурируют 30 параметров. Например, нахожу их сумму (на самом деле нет, но неважно). Мне надо подставлять разные значения этих параметров. Реализовала на C++ в виде 30 циклов. В каждом цикле варьирую один из параметров. Привожу код на C++ (то, что в коде индексы вручную прописаны не нужно обращать внимание. Там всегда такая размерность будет. И там не сумма на самом деле ищется). Недавно появилась объективная необходимость перевести эту программу на Python. А там можно вкладывать только 20 циклов (за это отвечает константа CO_MAXBLOCKS в файле code.h. Посоветуйте, пожалуйста, что лучше: 1) увеличить значение этой константы в исходниках CPython (как-то не хотелось бы), 2) как-то изменить алгоритм (и сразу как, если можно, хоть на C++, хоть на Python, хоть на псевдокоде.
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
    for (mesh_num[0] = 0; mesh_num[0] < grid_count; mesh_num[0]++)
    for (mesh_num[1] = 0; mesh_num[1] < grid_count; mesh_num[1]++)
    for (mesh_num[2] = 0; mesh_num[2] < grid_count; mesh_num[2]++)
    for (mesh_num[3] = 0; mesh_num[3] < grid_count; mesh_num[3]++)
    for (mesh_num[4] = 0; mesh_num[4] < grid_count; mesh_num[4]++)
    for (mesh_num[5] = 0; mesh_num[5] < grid_count; mesh_num[5]++)
    for (mesh_num[6] = 0; mesh_num[6] < grid_count; mesh_num[6]++)
    for (mesh_num[7] = 0; mesh_num[7] < grid_count; mesh_num[7]++)
    for (mesh_num[8] = 0; mesh_num[8] < grid_count; mesh_num[8]++)
    for (mesh_num[9] = 0; mesh_num[9] < grid_count; mesh_num[9]++)
    for (mesh_num[10] = 0; mesh_num[10] < grid_count; mesh_num[10]++)
    for (mesh_num[11] = 0; mesh_num[11] < grid_count; mesh_num[11]++)
    for (mesh_num[12] = 0; mesh_num[12] < grid_count; mesh_num[12]++)
    for (mesh_num[13] = 0; mesh_num[13] < grid_count; mesh_num[13]++)
    for (mesh_num[14] = 0; mesh_num[14] < grid_count; mesh_num[14]++)
    for (mesh_num[15] = 0; mesh_num[15] < grid_count; mesh_num[15]++)
    for (mesh_num[16] = 0; mesh_num[16] < grid_count; mesh_num[16]++)
    for (mesh_num[17] = 0; mesh_num[17] < grid_count; mesh_num[17]++)
    for (mesh_num[18] = 0; mesh_num[18] < grid_count; mesh_num[18]++)
    for (mesh_num[19] = 0; mesh_num[19] < grid_count; mesh_num[19]++)
    for (mesh_num[20] = 0; mesh_num[20] < grid_count; mesh_num[20]++)
    for (mesh_num[21] = 0; mesh_num[21] < grid_count; mesh_num[21]++)
    for (mesh_num[22] = 0; mesh_num[22] < grid_count; mesh_num[22]++)
    for (mesh_num[23] = 0; mesh_num[23] < grid_count; mesh_num[23]++)
    for (mesh_num[24] = 0; mesh_num[24] < grid_count; mesh_num[24]++)
    for (mesh_num[25] = 0; mesh_num[25] < grid_count; mesh_num[25]++)
    for (mesh_num[26] = 0; mesh_num[26] < grid_count; mesh_num[26]++)
    for (mesh_num[27] = 0; mesh_num[27] < grid_count; mesh_num[27]++)
    for (mesh_num[28] = 0; mesh_num[28] < grid_count; mesh_num[28]++)
    for (mesh_num[29] = 0; mesh_num[29] < grid_count; mesh_num[29]++)
    {
            sum = a[0][0][mesh_num[0]] + a[0][1][mesh_num[1]] + a[0][2][mesh_num[2]] + a[0][3][mesh_num[3]] + a[0][4][mesh_num[4]] + a[1][0][mesh_num[5]] + a[1][1][mesh_num[6]] + a[1][2][mesh_num[7]] + a[1][3][mesh_num[8]] + a[1][4][mesh_num[9]] + a[2][0][mesh_num[10]] + a[2][1][mesh_num[11]] + a[2][2][mesh_num[12]] + a[2][3][mesh_num[13]] + a[2][4][mesh_num[14]] + a[3][0][mesh_num[15]] + a[3][1][mesh_num[16]] + a[3][2][mesh_num[17]] + a[3][3][mesh_num[18]] + a[3][4][mesh_num[19]]) + a[4][0][mesh_num[20]] + a[4][1][mesh_num[21]] + a[4][2][mesh_num[22]] + a[4][3][mesh_num[23]] + a[4][4][mesh_num[24]] + b[0][mesh_num[25]] + b[1][mesh_num[26]] + b[2][mesh_num[27]] + b[3][mesh_num[28]] + b[4][mesh_num[29]]);
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.10.2019, 10:15
Ответы с готовыми решениями:

Сравнение двух массивов без вложенных циклов
Извиняюсь, что помещаю здесь этот вопрос, я сам по идее должен был догадаться, но никак не могу. Второй день гружусь, без толку :wall: ...

Программирование вложенных циклов
Программирование вложенных циклов Постановка задачи: В настоящей лабораторной работе необходимо выполнить вычисления, для...

Упрощение вложенных циклов
Добрый день. В программе имеется несколько вложенных циклов. Пример: if () { if () { ...

41
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
19.10.2019, 11:22
grid_count -- константа? каков порядок этого числа?
0
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
19.10.2019, 11:24  [ТС]
vantfiles, да, это количество узлов сетки. Ну от 1 до 15 примерно буду задавать.
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
19.10.2019, 12:13
Пока ничего умнее вынесения части внутренних циклов в ф-цию мне в голову не приходит...
Еще подумаю...
0
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
19.10.2019, 12:15  [ТС]
vantfiles, вот мне предлагали. А я не совсем понимаю, как это сделать
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
19.10.2019, 12:16
Вариант с рекурсией мне как-то не кажется удачным...
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
19.10.2019, 12:18
Simply me, вчитываться лень. Приведи код к такому виду, чтобы его можно было скопировать, вставить и чтобы он при этом запускался и корректно работал. Сейчас для этого не хватает как минимум объявления используемых переменных. И, конечно, случай не должен быть вырожденным — нет смысла считать сумму нулей.
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
19.10.2019, 12:21
Цитата Сообщение от Simply me Посмотреть сообщение
вот мне предлагали. А я не совсем понимаю, как это сделать
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
int mesh_num[30];
 
void inter()
{
    for (mesh_num[15] = 0; mesh_num[15] < grid_count; mesh_num[15]++)
    for (mesh_num[16] = 0; mesh_num[16] < grid_count; mesh_num[16]++)
    for (mesh_num[17] = 0; mesh_num[17] < grid_count; mesh_num[17]++)
    for (mesh_num[18] = 0; mesh_num[18] < grid_count; mesh_num[18]++)
    for (mesh_num[19] = 0; mesh_num[19] < grid_count; mesh_num[19]++)
    for (mesh_num[20] = 0; mesh_num[20] < grid_count; mesh_num[20]++)
    for (mesh_num[21] = 0; mesh_num[21] < grid_count; mesh_num[21]++)
    for (mesh_num[22] = 0; mesh_num[22] < grid_count; mesh_num[22]++)
    for (mesh_num[23] = 0; mesh_num[23] < grid_count; mesh_num[23]++)
    for (mesh_num[24] = 0; mesh_num[24] < grid_count; mesh_num[24]++)
    for (mesh_num[25] = 0; mesh_num[25] < grid_count; mesh_num[25]++)
    for (mesh_num[26] = 0; mesh_num[26] < grid_count; mesh_num[26]++)
    for (mesh_num[27] = 0; mesh_num[27] < grid_count; mesh_num[27]++)
    for (mesh_num[28] = 0; mesh_num[28] < grid_count; mesh_num[28]++)
    for (mesh_num[29] = 0; mesh_num[29] < grid_count; mesh_num[29]++)
    {
         sum = a[0][0][mesh_num[0]] + a[0][1][mesh_num[1]] + a[0][2][mesh_num[2]] + a[0][3][mesh_num[3]] + a[0][4][mesh_num[4]] + a[1][0][mesh_num[5]] + a[1][1][mesh_num[6]] + a[1][2][mesh_num[7]] + a[1][3][mesh_num[8]] + a[1][4][mesh_num[9]] + a[2][0][mesh_num[10]] + a[2][1][mesh_num[11]] + a[2][2][mesh_num[12]] + a[2][3][mesh_num[13]] + a[2][4][mesh_num[14]] + a[3][0][mesh_num[15]] + a[3][1][mesh_num[16]] + a[3][2][mesh_num[17]] + a[3][3][mesh_num[18]] + a[3][4][mesh_num[19]]) + a[4][0][mesh_num[20]] + a[4][1][mesh_num[21]] + a[4][2][mesh_num[22]] + a[4][3][mesh_num[23]] + a[4][4][mesh_num[24]] + b[0][mesh_num[25]] + b[1][mesh_num[26]] + b[2][mesh_num[27]] + b[3][mesh_num[28]] + b[4][mesh_num[29]]);
    }
 
}
 
void base()
{
    for (mesh_num[0] = 0; mesh_num[0] < grid_count; mesh_num[0]++)
    for (mesh_num[1] = 0; mesh_num[1] < grid_count; mesh_num[1]++)
    for (mesh_num[2] = 0; mesh_num[2] < grid_count; mesh_num[2]++)
    for (mesh_num[3] = 0; mesh_num[3] < grid_count; mesh_num[3]++)
    for (mesh_num[4] = 0; mesh_num[4] < grid_count; mesh_num[4]++)
    for (mesh_num[5] = 0; mesh_num[5] < grid_count; mesh_num[5]++)
    for (mesh_num[6] = 0; mesh_num[6] < grid_count; mesh_num[6]++)
    for (mesh_num[7] = 0; mesh_num[7] < grid_count; mesh_num[7]++)
    for (mesh_num[8] = 0; mesh_num[8] < grid_count; mesh_num[8]++)
    for (mesh_num[9] = 0; mesh_num[9] < grid_count; mesh_num[9]++)
    for (mesh_num[10] = 0; mesh_num[10] < grid_count; mesh_num[10]++)
    for (mesh_num[11] = 0; mesh_num[11] < grid_count; mesh_num[11]++)
    for (mesh_num[12] = 0; mesh_num[12] < grid_count; mesh_num[12]++)
    for (mesh_num[13] = 0; mesh_num[13] < grid_count; mesh_num[13]++)
    for (mesh_num[14] = 0; mesh_num[14] < grid_count; mesh_num[14]++)
    {
        inter();
    }
}
1
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
19.10.2019, 12:26  [ТС]
vantfiles, попробую

Добавлено через 1 минуту
0x10, там чтобы работало, надо lp_solve установить, его библиотеку подключить и экзешник его к коду скопировать.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
19.10.2019, 12:27
Цитата Сообщение от Simply me Посмотреть сообщение
там чтобы работало, надо lp_solve установить, его библиотеку подключить и экзешник его к коду скопировать.
В этой части я вижу только обход массивов. Не верю, что это нельзя вынести без лишних зависимостей.

Еще не понимаю, почему изменение индекса от 0 до 29 нельзя оформить как цикл. Аналогичный вопрос к вычислению суммы — выглядит как развернутый цикл.
0
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
19.10.2019, 12:28  [ТС]
Ну хотя уберу всё это, выложу сюда только про циклы, но чтобы работало. И еще я там иногда явно значения прописываю. Я знаю, что так не пишут. Просто я этот код никому не собираюсь показывать, это мне для диссера, чтобы немного автоматизировать.
0
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
19.10.2019, 12:39
Цитата Сообщение от 0x10 Посмотреть сообщение
Еще не понимаю, почему изменение индекса от 0 до 29 нельзя оформить как цикл.
Потому что циклы вложенные. Сделаете цикл - придется добавлять вложенные условия.

Добавлено через 4 минуты
Ручками индексы считать тоже не то - общий цикл имеет 15^30 итераций, или 1,9175105923288408666849136352539e+35
поэтому непонятно на чем сделать внешний цикл...

PS: кстати, не очень понятно на каком это вообще компе считается...
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
19.10.2019, 12:52
Simply me, другая мысль. mesh_num можно рассматривать как 30-разрядное число в системе счисления по основанию grid_count. Тогда для него можно написать функцию increment.
1
фрилансер
 Аватар для Алексей1153
6449 / 5643 / 1129
Регистрация: 11.10.2019
Сообщений: 15,025
19.10.2019, 12:54
Simply me, допустим, grid_count==16. Параметров N. В итоге нужно перебрать grid_count^N (что, кстати, довольно долго будет делаться). Заводим себе двоичную переменную counter длиной в N тетрад (N/2 байтов).

В одном единственном цикле при помощи инкремента перебираются все значения counter от 0 до grid_count^N
В начале цикла по двоичному коду каждой тетрады counter определяется одно из 16 состояний каждого из N параметра.
Согласно текущему набору параметров вычисляется функция

counter можно организовать в виде массива uint64_t, инкрементировать их как одно большое многобитное число несложно
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
19.10.2019, 12:56
Цитата Сообщение от Simply me Посмотреть сообщение
Например, нахожу их сумму (на самом деле нет, но неважно)
На самом деле важно. Лучше всё-таки объясни, что конкретно ты делаешь. А то 30 вложенных циклов наводят на подозрение, что проблема всё-таки в построении алгоритма (особенно с учётом того, сколько тут получится итераций - см. пост #12)
1
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
19.10.2019, 13:13  [ТС]
Да, наверное, лучше весь код приведу, а то не все советы понимаю) Вот часть кода, которая запустится и без библиотек lp и которая формирует файлы lp. m^n файлов, где m - количество узлов сетки, а n - количество варьируемых параметров (незакомментированных циклов for). Поэтому все циклы for можно раскомментировать, только если задать один узел сетки. Для двух узлов сетки, если все раскомментировать, получится 2^30 модели. Когда создадутся все модели, в консоль выведется "All".

И я знаю, что входные матрицы можно задать через консоль, в таблице в приложении gui или считать из файла. Просто пока руки не доходят)

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
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
//#include "stdafx.h"
#include "pch.h"
#include <cstdio>
#include <stdlib.h>
#include <iostream>
#include<iomanip>
#include <fstream>
#include <string>
using namespace std;
 
 
int main()
{
    int i, j, k;
    const int row_count = 5;
    const int col_count = 5;
    const int grid_count = 2; //количество узлов сетки
    //Матрица A
    double A[row_count][col_count];
    A[0][0] = 54000;
    A[0][1] = 30800;
    A[0][2] = 35800;
    A[0][3] = 28500;
    A[0][4] = 30900;
    A[1][0] = 30900;
    A[1][1] = 22800;
    A[1][2] = 28300;
    A[1][3] = 27900;
    A[1][4] = 28800;
    A[2][0] = 19600;
    A[2][1] = 21000;
    A[2][2] = 21800;
    A[2][3] = 18500;
    A[2][4] = 16050;
    A[3][0] = 50500;
    A[3][1] = 24370;
    A[3][2] = 17630;
    A[3][3] = 15070;
    A[3][4] = 11800;
    A[4][0] = 60780;
    A[4][1] = 24150;
    A[4][2] = 15350;
    A[4][3] = 13000;
    A[4][4] = 11700;
    //Матрица B
    double B[row_count];
    B[0] = 1.622;
    B[1] = 1.240;
    B[2] = 0.851;
    B[3] = 0.989;
    B[4] = 1.029;
    //Матрица Gamma
    double Gm[row_count][col_count][grid_count];
    //Минимальные значения
    Gm[0][0][0] = 1.097872;
    Gm[0][1][0] = 1.4;
    Gm[0][2][0] = 1.097872;
    Gm[0][3][0] = 1.4;
    Gm[0][4][0] = 1.097872;
    Gm[1][0][0] = 1.097872;
    Gm[1][1][0] = 1.246378117;
    Gm[1][2][0] = 1.0195744;
    Gm[1][3][0] = 1.299567629;
    Gm[1][4][0] = 1.020999668;
    Gm[2][0][0] = 1.097872;
    Gm[2][1][0] = 1.35;
    Gm[2][2][0] = 1.073233456;
    Gm[2][3][0] = 1.38;
    Gm[2][4][0] = 1.080837525;
    Gm[3][0][0] = 1.097872;
    Gm[3][1][0] = 1.024015943;
    Gm[3][2][0] = 1;
    Gm[3][3][0] = 1.4;
    Gm[3][4][0] = 1;
    Gm[4][0][0] = 1.0587232;
    Gm[4][1][0] = 1.215266937;
    Gm[4][2][0] = 1.097872;
    Gm[4][3][0] = 1;
    Gm[4][4][0] = 1.097872;
    //Максимальные значения
    Gm[0][0][grid_count - 1] = 1.097872;
    Gm[0][1][grid_count - 1] = 1.4;
    Gm[0][2][grid_count - 1] = 1.097872;
    Gm[0][3][grid_count - 1] = 1.4;
    Gm[0][4][grid_count - 1] = 1.097872;
    Gm[1][0][grid_count - 1] = 1.097872;
    Gm[1][1][grid_count - 1] = 1.4;
    Gm[1][2][grid_count - 1] = 1.097872;
    Gm[1][3][grid_count - 1] = 1.4;
    Gm[1][4][grid_count - 1] = 1.097872;
    Gm[2][0][grid_count - 1] = 1.097872;
    Gm[2][1][grid_count - 1] = 1.4;
    Gm[2][2][grid_count - 1] = 1.097872;
    Gm[2][3][grid_count - 1] = 1.4;
    Gm[2][4][grid_count - 1] = 1.097872;
    Gm[3][0][grid_count - 1] = 1.097872;
    Gm[3][1][grid_count - 1] = 1.0777279514;
    Gm[3][2][grid_count - 1] = 1.097872;
    Gm[3][3][grid_count - 1] = 1.4;
    Gm[3][4][grid_count - 1] = 1.097872;
    Gm[4][0][grid_count - 1] = 1.0587232;
    Gm[4][1][grid_count - 1] = 1.4;
    Gm[4][2][grid_count - 1] = 1.097872;
    Gm[4][3][grid_count - 1] = 1.4;
    Gm[4][4][grid_count - 1] = 1.097872;
    //Промежуточные значения в узлах
    for (i = 1; i < grid_count - 1; i++)
        for (j = 0; j < row_count; j++)
            for (k = 0; k < col_count; k++)
                Gm[j][k][i] = Gm[j][k][i - 1] + (Gm[j][k][grid_count - 1] - Gm[j][k][0]) / (grid_count - 1);
    // Матрица Delta
    double Dlt[row_count][grid_count];
    //Минимальные значения
    Dlt[0][0] = 1;
    Dlt[1][0] = 1;
    Dlt[2][0] = 1;
    Dlt[3][0] = 1;
    Dlt[4][0] = 1;
    //Максимальные значения
    Dlt[0][grid_count - 1] = 1;
    Dlt[1][grid_count - 1] = 1;
    Dlt[2][grid_count - 1] = 1;
    Dlt[3][grid_count - 1] = 1;
    Dlt[4][grid_count - 1] = 1;
    //Промежуточные значения в узлах
    for (i = 1; i < grid_count - 1; i++)
        for (j = 0; j < row_count; j++)
            Dlt[j][i] = Dlt[j][i - 1] + (Dlt[j][grid_count - 1] - Dlt[j][0]) / (grid_count - 1);
    //Расчет по разным комбинациям узловых значений Gamma и Delta 
    int count = 0; //номер эксперимента
    int mesh_num[row_count*(col_count + 1)];
    for (i = 0; i < (row_count*(col_count + 1)); i++)
        mesh_num[i] = 0;
    for (mesh_num[0] = 0; mesh_num[0] < grid_count; mesh_num[0]++)
    for (mesh_num[1] = 0; mesh_num[1] < grid_count; mesh_num[1]++)
    for (mesh_num[2] = 0; mesh_num[2] < grid_count; mesh_num[2]++)
    //for (mesh_num[3] = 0; mesh_num[3] < grid_count; mesh_num[3]++)
    //for (mesh_num[4] = 0; mesh_num[4] < grid_count; mesh_num[4]++)
    //for (mesh_num[5] = 0; mesh_num[5] < grid_count; mesh_num[5]++)
    //for (mesh_num[6] = 0; mesh_num[6] < grid_count; mesh_num[6]++)
    //for (mesh_num[7] = 0; mesh_num[7] < grid_count; mesh_num[7]++)
    //for (mesh_num[8] = 0; mesh_num[8] < grid_count; mesh_num[8]++)
    //for (mesh_num[9] = 0; mesh_num[9] < grid_count; mesh_num[9]++)
    //for (mesh_num[10] = 0; mesh_num[10] < grid_count; mesh_num[10]++)
    //for (mesh_num[11] = 0; mesh_num[11] < grid_count; mesh_num[11]++)
    //for (mesh_num[12] = 0; mesh_num[12] < grid_count; mesh_num[12]++)
    //for (mesh_num[13] = 0; mesh_num[13] < grid_count; mesh_num[13]++)
    //for (mesh_num[14] = 0; mesh_num[14] < grid_count; mesh_num[14]++)
    //for (mesh_num[15] = 0; mesh_num[15] < grid_count; mesh_num[15]++)
    //for (mesh_num[16] = 0; mesh_num[16] < grid_count; mesh_num[16]++)
    //for (mesh_num[17] = 0; mesh_num[17] < grid_count; mesh_num[17]++)
    //for (mesh_num[18] = 0; mesh_num[18] < grid_count; mesh_num[18]++)
    //for (mesh_num[19] = 0; mesh_num[19] < grid_count; mesh_num[19]++)
    //for (mesh_num[20] = 0; mesh_num[20] < grid_count; mesh_num[20]++)
    //for (mesh_num[21] = 0; mesh_num[21] < grid_count; mesh_num[21]++)
    //for (mesh_num[22] = 0; mesh_num[22] < grid_count; mesh_num[22]++)
    //for (mesh_num[23] = 0; mesh_num[23] < grid_count; mesh_num[23]++)
    //for (mesh_num[24] = 0; mesh_num[24] < grid_count; mesh_num[24]++)
    //for (mesh_num[25] = 0; mesh_num[25] < grid_count; mesh_num[25]++)
    //for (mesh_num[26] = 0; mesh_num[26] < grid_count; mesh_num[26]++)
    //for (mesh_num[27] = 0; mesh_num[27] < grid_count; mesh_num[27]++)
    //for (mesh_num[28] = 0; mesh_num[28] < grid_count; mesh_num[28]++)
    //for (mesh_num[29] = 0; mesh_num[29] < grid_count; mesh_num[29]++)
    {
        std::string command, num, filename1;
        num = std::to_string(count);
        filename1 = "model" + num + ".lp";
        const char* fn = filename1.c_str();
        FILE* file;
        fopen_s(&file, fn, "w");
        fprintf(file, "%f x31 + %f x32 + %f x33 + %f x34 + %f x35 - %f <= ksi;\n", A[0][0] * Gm[0][0][mesh_num[0]], A[0][1] * Gm[0][1][mesh_num[1]], A[0][2] * Gm[0][2][mesh_num[2]], A[0][3] * Gm[0][3][mesh_num[3]], A[0][4] * Gm[0][4][mesh_num[4]], B[0] * Dlt[0][mesh_num[25]]);
        fprintf(file, "- %f x31 - %f x32 - %f x33 - %f x34 - %f x35 + %f <= ksi;\n", A[0][0] * Gm[0][0][mesh_num[0]], A[0][1] * Gm[0][1][mesh_num[1]], A[0][2] * Gm[0][2][mesh_num[2]], A[0][3] * Gm[0][3][mesh_num[3]], A[0][4] * Gm[0][4][mesh_num[4]], B[0] * Dlt[0][mesh_num[25]]);
    
        fprintf(file, "%f x31 + %f x32 + %f x33 + %f x34 + %f x35 - %f <= ksi;\n", A[1][0] * Gm[1][0][mesh_num[5]], A[1][1] * Gm[1][1][mesh_num[6]], A[1][2] * Gm[1][2][mesh_num[7]], A[1][3] * Gm[1][3][mesh_num[8]], A[1][4] * Gm[1][4][mesh_num[9]], B[1] * Dlt[1][mesh_num[26]]);
        fprintf(file, "- %f x31 - %f x32 - %f x33 - %f x34 - %f x35 + %f <= ksi;\n", A[1][0] * Gm[1][0][mesh_num[5]], A[1][1] * Gm[1][1][mesh_num[6]], A[1][2] * Gm[1][2][mesh_num[7]], A[1][3] * Gm[1][3][mesh_num[8]], A[1][4] * Gm[1][4][mesh_num[9]], B[1] * Dlt[1][mesh_num[26]]);
 
        fprintf(file, "%f x31 + %f x32 + %f x33 + %f x34 + %f x35 - %f <= ksi;\n", A[2][0] * Gm[2][0][mesh_num[10]], A[2][1] * Gm[2][1][mesh_num[11]], A[2][2] * Gm[2][2][mesh_num[12]], A[2][3] * Gm[2][3][mesh_num[13]], A[2][4] * Gm[2][4][mesh_num[14]], B[2] * Dlt[2][mesh_num[27]]);
        fprintf(file, "- %f x31 - %f x32 - %f x33 - %f x34 - %f x35 + %f <= ksi;\n", A[2][0] * Gm[2][0][mesh_num[10]], A[2][1] * Gm[2][1][mesh_num[11]], A[2][2] * Gm[2][2][mesh_num[12]], A[2][3] * Gm[2][3][mesh_num[13]], A[2][4] * Gm[2][4][mesh_num[14]], B[2] * Dlt[2][mesh_num[27]]);
 
        fprintf(file, "%f x31 + %f x32 + %f x33 + %f x34 + %f x35 - %f <= ksi;\n", A[3][0] * Gm[3][0][mesh_num[15]], A[3][1] * Gm[3][1][mesh_num[16]], A[3][2] * Gm[3][2][mesh_num[17]], A[3][3] * Gm[3][3][mesh_num[18]], A[3][4] * Gm[3][4][mesh_num[19]], B[3] * Dlt[3][mesh_num[28]]);
        fprintf(file, "- %f x31 - %f x32 - %f x33 - %f x34 - %f x35 + %f <= ksi;\n", A[3][0] * Gm[3][0][mesh_num[15]], A[3][1] * Gm[3][1][mesh_num[16]], A[3][2] * Gm[3][2][mesh_num[17]], A[3][3] * Gm[3][3][mesh_num[18]], A[3][4] * Gm[3][4][mesh_num[19]], B[3] * Dlt[3][mesh_num[28]]);
 
        fprintf(file, "%f x31 + %f x32 + %f x33 + %f x34 + %f x35 - %f <= ksi;\n", A[4][0] * Gm[4][0][mesh_num[20]], A[4][1] * Gm[4][1][mesh_num[21]], A[4][2] * Gm[4][2][mesh_num[22]], A[4][3] * Gm[4][3][mesh_num[23]], A[4][4] * Gm[4][4][mesh_num[24]], B[4] * Dlt[4][mesh_num[29]]);
        fprintf(file, "- %f x31 - %f x32 - %f x33 - %f x34 - %f x35 + %f <= ksi;\n", A[4][0] * Gm[4][0][mesh_num[20]], A[4][1] * Gm[4][1][mesh_num[21]], A[4][2] * Gm[4][2][mesh_num[22]], A[4][3] * Gm[4][3][mesh_num[23]], A[4][4] * Gm[4][4][mesh_num[24]], B[4] * Dlt[4][mesh_num[29]]);
        fclose(file);
        count++;
    }
    printf("All");
    std::cin.get();
}
0
Модератор
Эксперт функциональных языков программирования
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,876
19.10.2019, 14:45
Цитата Сообщение от Simply me Посмотреть сообщение
2) как-то изменить алгоритм (и сразу как, если можно, хоть на C++, хоть на Python, хоть на псевдокоде.
Можно свести к одному циклу.
C++
1
for(int i = 0; i < 10000; i++) ;
В этом примере 4 вложенных цикла (4 цифры в числе меняются от 0 до 9). Но для их записи достаточно одного for.
1
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
19.10.2019, 17:19  [ТС]
Shamil1, спасибо. Но я немного не поняла эту конструкцию. Почему в конце точка с запятой? Тело у этого цикла как у меня нужно оставить?

Добавлено через 19 минут
А вообще мне, наверное, саму идею придется менять. Раньше я упражнялась примерно на 3 параметрах и 5 узлах (125 моделей). Тут даже вручную можно открыть все файлы, сгенированные lpsolve для каждой модели, найти минимальное значение минимизируемой величины кси и при каких параметрах. У меня это было автоматизировано. Я хотела перевести на питон, потому что мне на питоне было бы легче сделать удобнее структуру выходного файла, чтобы было легче анализировать параметры при минимальных кси. Но получается, если варьировать все 30 параметров даже при двух узлах получится миллиард моделей. И, например, из них у 100 тыс минимальное кси. При любой структуре файла с кси и параметрами, 100 000 файлов неудобно анализировать. К тому же, после каждого запуска привыкла удалять все файлы с моделями и результатами. А так получается 2 млрд файлов удалять.

Нужен какой-то другой алгоритм найти решение в этом 30мерном кубике интервалов.
0
фрилансер
 Аватар для Алексей1153
6449 / 5643 / 1129
Регистрация: 11.10.2019
Сообщений: 15,025
19.10.2019, 17:24
Simply me, генетический алгоритм попробуй, если целевая функция известна
1
 Аватар для Simply me
244 / 37 / 8
Регистрация: 05.05.2012
Сообщений: 521
19.10.2019, 20:16  [ТС]
Алексей1153, прочитала про генетический алгоритм разные источники, но пока не очень представляю, как к моей задаче приложить. Вы не могли бы на питоне или c++ немного код набросать, не так, чтоб прям компилилось и результат выдавало, а примерно? Я отлажу. Вместо проверки критерия можно так писать:
Python
1
#подставить набор значений из 30 параметров и рассчитать ksi для этого набора
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.10.2019, 20:16
Помогаю со студенческими работами здесь

Прерывание вложенных циклов
Good afternoon, пипл! :) пример кода for i:= 1 to n do begin for j:= 1 to m do if NumberIsThirteen(j+i) = true...

Организация вложенных циклов
Ребята , очень нужна ваша помощь, не как не могу разобраться с задачей, не могу понять как поступиться к формуле. Даны числовой ряд и...

Оптимизация 2х вложенных циклов
Доброго дня! Есть программа, рисующая притягивающиеся друг к другу шарики. В программе 2 потока: отрисовка и расчёт новых координат...

Программирование вложенных циклов
Дано целое число N и набор из N вещественных чисел: A1, A2, …, AN. Вывести следующие числа: A1, (A2) в квадрате, …, (AN-1) в степени N-1,...

Структура вложенных циклов
Приветствую, помогите, пожалуйста, составить программку. Вот само задание(составить программу с вложенным циклом): ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru