Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 26.10.2024
Сообщений: 8

Доработка кода игры "Жизнь"

05.01.2025, 15:41. Показов 5072. Ответов 31

Студворк — интернет-сервис помощи студентам
В чем суть, на просторах интернета нашел код, приближенный к желаемому, но он не совсем корректно. В консоли все чисто. Не могу понять в чем причина.
Вообще основная задача была в том, чтобы программа брала данные из файла, в котором будут указаны кол. столбцов, строк, задержка в сек. между поколениями и необходимость вывода в файл.
Надеюсь вы мне поможете доработать.

Если есть альтернативные решение этой игры, то готов рассмотреть и начать все с начала. Пишу итоговую работу семестра. Использовать векторы пока нельзя. Динамические массивы только можно использовать.
Многопоточность идет как доп. задание. Можно и убрать, оно типа на самостоятельное изучение.

Пробовал подставить значения переменных в ручную, пытался выяснить где ошибка.

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

Пример получившегося файла приложил.
20 30
2 3
2 4
3 4
3 5
3 6
3 7
5 0
5 1
5 2
6 2

Как доп вариант, хотелось бы сделать чтобы консоль очищалась после показа поколения через функцию
C++
1
std::system("clear");
используя библиотеку
C++
1
<cstdlib>
И была задержка
C++
1
sleep(время задержки в сек);
из библиотеки
C++
1
<unistd.h>
Просьба помочь, кто чем может. Буду благодарен. Преподаватели ссылаются на то, что студенты САМИ должны искать информацию в интернете. Надеюсь с вашей помощью и пояснениями у меня получится сделать то, что требуется


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
191
#include <iostream>
#include <fstream>
#include <thread>
 
 
 
#define FILL_CHAR 219
#define EMPTY_CHAR 255
 
void print(unsigned int generation, char* print_arr) {
    printf("Generation:%i\n%s\n", generation, print_arr);
}
 
bool equals(bool* array1, bool* array2, unsigned int n, unsigned int m) {
    for (unsigned int i = 0; i < n; i++)
        for (unsigned int j = 0; j < m; j++)
            if (array1[i * m + j] != array2[i * m + j])
                return false;
    return true;
}
unsigned short inline get(bool* array, unsigned int n, unsigned int m, unsigned int x, unsigned int y) {
    if (x < 1 || y < 1 || x > m || y > n) return 0;
    return array[(y - 1) * m + (x - 1)];
}
 
void process_output(bool* array1, bool* array2, char* print_arr, unsigned int n, unsigned int m) {
#pragma omp parallel for
    for (__int64 i = 0; i < (__int64)n; i++)
    {
        for (unsigned int j = 0; j < m; j++) {
            unsigned short alive_near = get(array1, n, m, j, i) +
                get(array1, n, m, j, i + 1) +
                get(array1, n, m, j, i + 2) +
                get(array1, n, m, j + 1, i) +
                get(array1, n, m, j + 1, i + 2) +
                get(array1, n, m, j + 2, i) +
                get(array1, n, m, j + 2, i + 1) +
                get(array1, n, m, j + 2, i + 2);
 
            if (alive_near > 3)
            {
                array2[i * m + j] = false;
                print_arr[i * (m + 1) + j] = EMPTY_CHAR;
            }
            else if (alive_near > 2)
            {
                array2[i * m + j] = true;
                print_arr[i * (m + 1) + j] = FILL_CHAR;
            }
            else if (alive_near > 1)
            {
                array2[i * m + j] = array1[i * m + j];
                print_arr[i * (m + 1) + j] = array1[i * m + j] ? FILL_CHAR : EMPTY_CHAR;
            }
            else {
                array2[i * m + j] = false;
                print_arr[i * (m + 1) + j] = EMPTY_CHAR;
            }
        }
        print_arr[m + i * (m + 1)] = '\n';
    }
    print_arr[n * (m + 1) - 1] = '\0';
}
 
void process_no_output(bool* array1, bool* array2, unsigned int n, unsigned int m) {
#pragma omp parallel for
    for (__int64 i = 0; i < (__int64)n; i++)
    {
        for (unsigned int j = 0; j < m; j++) {
            unsigned short alive_near = get(array1, n, m, j, i) +
                get(array1, n, m, j, i + 1) +
                get(array1, n, m, j, i + 2) +
                get(array1, n, m, j + 1, i) +
                get(array1, n, m, j + 1, i + 2) +
                get(array1, n, m, j + 2, i) +
                get(array1, n, m, j + 2, i + 1) +
                get(array1, n, m, j + 2, i + 2);
 
            if (alive_near > 3)
            {
                array2[i * m + j] = false;
            }
            else if (alive_near > 2)
            {
                array2[i * m + j] = true;
            }
            else if (alive_near > 1)
            {
                array2[i * m + j] = array1[i * m + j];
            }
            else {
                array2[i * m + j] = false;
            }
        }
    }
}
 
int main(int argc, char* argv[]) {
    std::ifstream in("in.txt");
    unsigned int n;
    unsigned int m;
    unsigned int delay;
    unsigned int max_iterations;
    bool output;
    in >> n >> m >> delay >> max_iterations >> output;
    //unsigned int n{ 100 };
    //unsigned int m{ 100 };
    //unsigned int delay{ 1 };
    //unsigned int max_iterations{ 915 };
    //bool output{ true };
    //in >> n >> m >> delay >> max_iterations >> output;
 
 
    bool* array1 = new bool[n * m];
    bool* array2 = new bool[n * m];
 
 
    if (output)
    {
        char* print_arr = new char[n * (m + 1)];
        for (unsigned int i = 0; i < n; i++)
        {
            for (unsigned int j = 0; j < m; j++)
            {
                in >> array1[i * m + j];
                print_arr[i * (m + 1) + j] = array1[i * m + j] ? FILL_CHAR : EMPTY_CHAR;
            }
            print_arr[m + i * (m + 1)] = '\n';
        }
        printf_s("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
        print_arr[n * (m + 1) - 1] = '\0';
 
        print(0, print_arr);
        std::this_thread::sleep_for(std::chrono::milliseconds(delay));
 
        unsigned int generation = 0;
 
        while (true) {
 
            std::chrono::steady_clock::time_point start, end;
            start = std::chrono::steady_clock::now();
 
            process_output(array1, array2, print_arr, n, m);
            print(++generation, print_arr);
 
            if (equals(array1, array2, n, m) || max_iterations != 0 && generation >= max_iterations)
                break;
 
            end = std::chrono::steady_clock::now();
 
            __int64 time = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
            if (time < delay)
            {
                std::this_thread::sleep_for(
                    std::chrono::milliseconds(delay - time));
            }
            bool* temp = array1;
            array1 = array2;
            array2 = temp;
        }
    }
 
 
    else {
        std::chrono::steady_clock::time_point start, end;
        start = std::chrono::steady_clock::now();
        for (unsigned int i = 0; i < n; i++)
        {
            for (unsigned int j = 0; j < m; j++)
            {
                in >> array1[i * m + j];
            }
        }
        unsigned int generation = 0;
        while (true) {
            process_no_output(array1, array2, n, m);
            generation++;
            if (equals(array1, array2, n, m) || max_iterations != 0 && generation >= max_iterations)
                break;
 
            bool* temp = array1;
            array1 = array2;
            array2 = temp;
        }
        end = std::chrono::steady_clock::now();
        __int64 time = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
        std::ofstream out("out.txt");
        out << "Time, milliseconds: " << time;
    }
    return 0;
}
Добавлено через 3 минуты
Дополню, живые клетки должны помечаться * а мертвые -
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.01.2025, 15:41
Ответы с готовыми решениями:

Рулетка - доработка кода
Я только недавно начал программировать на С++ и решил написать консольную программу типа рулетки. Вот код #include &lt;iostream&gt; ...

Проверка и доработка кода.
Написал программу попробовал откомпилировать в Visual Studio 2010. Стало выдавать разнообразные ошибки. Помогите пожалуйста исправить...

Придумать фигуру для игры "Жизнь" Джона Конвея
Задание: &quot;Продемонстрируйте работу клеточного автомата на примере «сорняка» («паразита») (фигуры, которая при столкновении с некоторыми...

31
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
08.01.2025, 10:27
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от alexu_007 Посмотреть сообщение
Нафига в игре жизнь структуры?
а нафига нужна сама Игра Жизнь?
[тут ответ--->...]

возможно вы сможете написать эту прогу и в машинных кодах,
так зачем вам ваще массивы нужны? брынкайте по памяти голым указателем да и усё.

Цитата Сообщение от alexu_007 Посмотреть сообщение
два 2-мерных массива
я вас уверяю, что не нужны - нужны два одномерных.
два индекса потреблят больше цпу-ресов, чем один.
1
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
08.01.2025, 22:03
Цитата Сообщение от XLAT Посмотреть сообщение
возможно вы сможете написать эту прогу и в машинных кодах,
так зачем вам ваще массивы нужны? брынкайте по памяти голым указателем да и усё.
Повторю вопрос - нафига в игре жизнь структуры? Какие туда разные типы данных класть?
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
09.01.2025, 09:49
Цитата Сообщение от alexu_007 Посмотреть сообщение
Повторю вопрос - нафига в игре жизнь структуры?
я нахожу ваш вопрос связанным с вашим неответом на мой вопрос.

связь тут четкая и хорошо видимая моими глазами.

а вы видите связь?

ваше непонимание важности структур приводит вас к мысли о невозможности создания точного ползунка.

Цитата Сообщение от alexu_007 Посмотреть сообщение
нафига
чтобы получить ответ вам нужно просто посмотреть мой код открытыми глазами.

Цитата Сообщение от alexu_007 Посмотреть сообщение
Повторю вопрос
если мой ответ вас не удовлетворил, то тогда нужно его повторить еще 42 раза,
но обязательно между повторами обдумайте ваш вопрос как можно более тщательно.

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


Добавлено через 3 минуты
чуток разбавлю троллинг,

Цитата Сообщение от GRAGGA Посмотреть сообщение
C++
1
2
3
4
5
6
7
void copy(Board src, Board dst) {
    for (int i = 0; i < width; ++i) {
        for (int j = 0; j < height; ++j) {
            dst[i][j] = src[i][j];  // копия прошлого поколения 
        }
    }
}
это ненужное копирование - пустая трата цпу-ресурсов.

профитно заменить на:
C++
1
void swap(Board& visual, Board& calc){ std::swap(visual, calc); }
полный тест, как оно работает:
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
///----------------------------------------------------------------------------|
/// C++17
///----------------------------------------------------------------------------:
#include <iostream>
 
///----------------|
/// Тестируемое.   |
///----------------:
const int W = 3; // параметр ширины поля
const int H = 2; // параметр высоты поля
 
using Board = int[H][W];
 
void swap(Board& visual, Board& calc){ std::swap(visual, calc); }
 
///----------------|
/// Логирование.   |
///----------------:
std::ostream& operator<<(std::ostream& o, const Board& b)
{
    for    (const auto&  r : b)
    {   for(const auto   e : r)
        {   std::cout << e << ' ' ;
        }   std::cout      << '\n';
    }
    return o;
}
 
#define log(a) std::cout << #a << ": \n" << (a) << '\n';
 
///----------------------------------------------------------------------------|
/// Тест.
///----------------------------------------------------------------------------:
int main()
{   std::cout << "Hello world!" << std::endl;
 
    Board visual{{1,2,3},{4,5,6}}; /// отображаемая на дисплей плоскость.
    Board calc  {{8,8,8},{9,9,9}}; /// вспомогательная плоскость для расчета.
 
    log(visual)
    log(calc)
 
    swap(visual, calc);
 
    log(visual)
    log(calc)
}
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6291 / 3015 / 1051
Регистрация: 01.06.2021
Сообщений: 11,415
09.01.2025, 21:03
XLAT, кстати, у Microsoft хорошо получилось возродить популярность сапёра. Они придумали новую игру Microsoft Treasure Hunt, которая доступна как отдельная игра или как режим приключения в Microsoft Minesweeper.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
10.01.2025, 01:07
Цитата Сообщение от Royal_X Посмотреть сообщение
кстати
кстати, как в task.json скомпилить в РЕЛИЗЕ ?

походу, у визуалкодерщиков на дебагинге крыша съехала - два вечера гуглю - не могу найти - как в таск-жсоне скомпилить РЕЛИЗ...

компилятор mingw.

кстати, я не юзаю дебаг - я пишу тесты.
0
49 / 39 / 11
Регистрация: 24.07.2022
Сообщений: 117
10.01.2025, 05:13
Цитата Сообщение от XLAT Посмотреть сообщение
как в task.json скомпилить в РЕЛИЗЕ ?
так же как и в дебаге только в args указать параметры для компилирования в релизной версии, или что имеется в виду?
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
10.01.2025, 05:21
Цитата Сообщение от dmiteri Посмотреть сообщение
так же как и в дебаге только в args указать параметры для компилирования в релизной версии, или что имеется в виду?
верно, это рассуждение здравого человека и я так рассуждаю...

вот таск.жсон, который компилит мне .exe дебаг версию:
Code
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
{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++.exe build active file",
            "command": "C:\\msys64\\ucrt64\\bin\\g++.exe",
            "args": [
                //"-fdiagnostics-color=always",
                //"-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "C:\\msys64\\ucrt64\\bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": "build",
            "detail": "compiler: C:\\msys64\\ucrt64\\bin\\g++.exe"
        }
    ]
}
Цитата Сообщение от dmiteri Посмотреть сообщение
только в args указать параметры
какие параметры указать?
0
49 / 39 / 11
Регистрация: 24.07.2022
Сообщений: 117
10.01.2025, 08:15
Цитата Сообщение от XLAT Посмотреть сообщение
какие параметры указать?
-О2 или -O3

Code
1
2
3
4
5
6
7
"args": [
                "-std=c++14",
                "-O2",
                "-Wall",
                "-o",
                ""${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6291 / 3015 / 1051
Регистрация: 01.06.2021
Сообщений: 11,415
10.01.2025, 09:17
XLAT, вот как мое релизное задание выглядит. Вообще, для релиза прописываешь релизные аргументы

JSON
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
{
            "type": "cppbuild",
            "label": "g++.exe BUILD RELEASE",
            "command": "C:\\msys64\\ucrt64\\bin\\g++.exe",
            "args": [
                "${workspaceFolder}\\main.cpp",
                "-o",
                "${workspaceFolder}\\a.exe",
                "-fdiagnostics-color=always",
                "-Wall",
                "-Wextra",
                "-pedantic-errors",
                // "-std=c++98",
                // "-std=c++11",
                // "-std=c++14",
                // "-std=c++17", // default since GCC 11
                // "-std=c++20",
                "-std=c++23",
                "-O2",
                "-s",
                "-static"
            ],
            "options": {
                "cwd": "C:\\msys64\\ucrt64\\bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "echo": true,
                "reveal": "always",
                "revealProblems": "never",
                "focus": true,
                "panel": "shared",
                "showReuseMessage": true,
                "clear": false,
                "close": false
            },
            "detail": "compiler: C:\\msys64\\ucrt64\\bin\\g++.exe"
        }
настройка presentation необязательна. Это я просто прописал все опции, чтобы в случае необходимости быстро менять. focus настроил на true, чтобы после компиляции нажимать на Enter и панель вывода автоматически закрывалась, учитывая, что окно уже сфокусировано.

А вот аргументы можешь свои передавать. "-fdiagnostics-color=always" для цветных предупреждений в консоли, "-Wall", "-Wextra", это предупреждения, "-pedantic-errors" - это чтобы несоответствия стандарту считались ошибками, "-std=c++23" версия, "-O2" - уровень оптимизации, "-s" обрезка лишних символов, чтобы уменьшить размер экзешника, "-static" - это чтобы была статическая сборка, не люблю кишки таскать с экзешником

Добавлено через 57 минут
XLAT, еще забыл предупредить, что для релизной компиляции нужно нажать Ctrl+Shift+B или Terminal/Run Build Task
Не нажимай на кнопку Run C/C++ File. Она все равно запустит отладчик. Это специфика работы расширения С++. И разрабы не собираются менять это недоразумение.
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
10.01.2025, 10:02
Цитата Сообщение от Royal_X Посмотреть сообщение
"-s",
из всех опций сработала эта - удаление отладочной инфы,
но, вроде, эта инфа возможна и для релизной сборки,
что, походу, в этом случае нет.

добавив её я наконец то получил ексешник, который побайтно идентичен ексешнику моей сборке через makefile.

Цитата Сообщение от Royal_X Посмотреть сообщение
нужно нажать Ctrl+Shift+B или Terminal/Run Build Task
первым что я увидел, это опции предложенные мне по умолчанию:

я подумал "ок, щас добавлю себе РЕЛИЗ сборку ..."

НО - не тут то было ...

захотелось спросить у разрабов VC и его юзеров:
Code
1
2
3
4
5
6
чуваки, у вас до релизов хоть что-нить доходит?
или у вас бесструктурное мышление, только для того, чтобы бесконечнот дебажить?
у меня мышление структурное - мне НЕ нужно дебажить - мои проги работают сразу безглючно!
и мне нужно сразу видеть РЕЛИЗ! 
Где он у вас тут, ёшкинкот, находится?
ага, его нет...
))

Royal_X,
все эти мейкфайлы кроме всего прочего придумывались для ИНКРЕМЕНТАЛЬНОЙ сборки и
далее вопрос:

ГДЕ ОБЪЕКТНИКИ?

так как при нормальной сборке их не нужно собирать все с нуля,
а можно частично использовать уже собранные в предыдущих билдах ...
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6291 / 3015 / 1051
Регистрация: 01.06.2021
Сообщений: 11,415
10.01.2025, 10:36
XLAT, для получения объектников нужно использовать -c, что останавливает линковку. Есесена, файл после команды -o должен иметь расширение .o вместо .exe

Добавлено через 1 минуту
XLAT, и я знал, что ты нажмешь на эти кнопки, поэтому сразу предупредил, чтобы ты не нажимал

Добавлено через 4 минуты
Я тут GCC - компиляция C/C++ программ описывал некоторые аргументы gcc, возможно, тебе будет интересно
1
 Аватар для Annemesski
2686 / 1344 / 484
Регистрация: 08.11.2016
Сообщений: 3,732
10.01.2025, 13:06
Цитата Сообщение от alexu_007 Посмотреть сообщение
если две контрольные суммы меняют друг друга - зацикливание.
зацикливание может быть шире чем два соседних кадра, например Glider Gun дающий бесконечные глайдеры на пути которых квадрат об который они разбиваются оставляя квадрат на том же месте. Для поля 60х40 клеток мне попадались циклы порядка трехсот кадров, так что для обнаружения зацикливания нужен массив и не контрольных сумм, а хэшей кадров.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.01.2025, 13:06

никто не сталкивался с распараллеливанием игры "Жизнь".
Всем приветики=**** Ребята, очень хотелось поинтересоваться, никто не сталкивался с распараллеливанием игры &quot;Жизнь&quot;. Очень...

Исправить ошибку в коде игры "Жизнь"
Суть задания в том чтобы дописать игру в жизнь в файле game, в определенном поле. Собственно в чем проблема код я дописал, но не знаю в чем...

Игра "Борьба за жизнь". Цель игры – убрать с доски все шашки противника
Здравствуйте! Помогите пожалуйста написать программу на с++. Два игрока имеют по n шашек и играют в поле m m клеток, делая ходы по...

Поиск повторяющихся слов в тексте (доработка кода)
Дан текст, содержащий n строк. Для каждого слова указать, сколько раз оно встречается в тексте. Я тут кое-что попробовала сделать (с++),...

Метод Зейделя для решения СЛАУ [Доработка кода]
Доброе утро народ. Мне нужна программа которая реализует Метод Зейделя для решения СЛАУ. Покопавшись в интернете нашел неплохой вариант. Но...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли Введение: Экологический рынок как игра с нулевой суммой Традиционная экология долгое время. . .
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ Введение: Синдром «цифрового учебника» Современные большие языковые модели (LLM) обладают колоссальным. . .
Главный вопрос моделирования сукцессии
anaschu 27.06.2026
главный вопрос. Если эктомикориза лучше добывает недоступный фосфор. И ее масса максимальна из всех. А широколиственный лес тоже имеет самую крутую биомассу. То почему не возникло их симбиоза? Это. . .
сукцессия 6. Питон реализация энилоджиковской модели, картинка про Центральную часть будущей модели
anaschu 26.06.2026
Етить. ИИ мне на основе моего старого файла R создал вот эту вот хмерь на пайтоне. Это уже новая модель, модель сукцессии грибной. потоки фосфора, азота. Углерода. 5 видов организмов. Я даже. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru