montecarlo — проблема с C ++, возможно, пропускающая строки в программе для расчета тепловых эквибирульных распределений с Монте-Карло Alogrithim

Я пишу кусок кода как часть моего проекта линейной алгебры. Предполагается использовать алгоритм Монте-Карло, известный как свойство случайного блуждания, для расчета распределений теплового равновесия для тела в статическом тепловом равновесии. Я студент машиностроения, и я никогда не учился на уроках информатики, поэтому все, что написано в коде, является результатом самообучения, поэтому, пожалуйста, извините, потому что я понимаю, что это Франкенштейн программы.

По сути, программа берет указанную точку на сетке и на основе случайного ввода перемещает ее влево, вправо, вверх, вниз, пока не достигнет граничной точки на этой сетке, а затем выбрасывает число, на которое она попала, в вектор и повторяется до тех пор, пока число значений в векторе равны количеству предопределенных итераций. Программа еще не закончена, но проблема в том, что я хочу, чтобы программа «перезагружалась» назад к начальной точке, как только она достигает граничной точки. Похоже, это работает для случаев, когда число или итерации мало (1-5), но для всего, что выше, как считалось, программа пропускает этот шаг … У меня есть программа, печатающая «координаты», где она находится в сетке, и мой Предполагалось, что это никогда не будет число, которое не входит в сетку, но, похоже, это не относится к случаям, когда итерации велики.

#include <iostream>
#include <stdlib.h>
#include <array>
#include <algorithm>
#include <iterator>
#include <random>

using namespace std;

int main () {
int grid[5][5] = { //makes grid, this will be the model of the body that   we want to find temperatues for
{2, 0, 0, 0, 0},
{2, 0, 0, 0, 0},
{2, 0, 0, 0, 0},
{2, 0, 0, 0, 0},
{1, 1, 1, 1, 1}
};
srand(time(NULL)); //seeds the random number generator
int x=2; // starting 'x' position
int y=3; // starting 'y' position
vector<int> values; // vector that will store values of boundry points     once reached
int iterations =  7; // number of iterations
auto numberOfValues = values.size(); // how many numbers in the vector     (how many times has the program reached the boundry points)
while(numberOfValues != iterations) {
int randomPath = rand()%4; // get four random numbers to define to move left, right, up, or downswitch (randomPath)
{
case 0:
x++;
cout <<"right"<<endl;
break;
case 1:
x--;
cout <<"left"<<endl;
break;
case 2:
y++;
cout <<"up"<<endl;
break;
case 3:
y--;
cout <<"down"<<endl;
break;
}
cout<<x<<","<<y<<endl;
//code below defines that when boundry coordinate is reached, put that value in the vector
if((x== 0 && y== 0)||(x== 0 && y== 1)||(x== 0 && y== 2 )||(x== 0 && y==   3)||(x== 0 && y== 4)||(y == 0 && x == 1)||(y == 0 && x == 2)||(y == 0 && x ==         3)||(y == 0 && x == 4)){
values.push_back(grid[y][x]);
numberOfValues++; //increase the number of values in the vector by 1
x = 2; // reset x position
y = 3;//reset y position
}
cout <<numberOfValues<<endl;

}
return 0;
}

Tl; DR
Для большого числа переменных итераций программы, кажется, пропускают эту часть кода: (в частности, часть x = 2, y = 3)

if((x== 0 && y== 0)||(x== 0 && y== 1)||(x== 0 && y== 2 )||(x== 0 && y==   3)||(x== 0 && y== 4)||(y == 0 && x == 1)||(y == 0 && x == 2)||(y == 0 && x ==         3)||(y == 0 && x == 4)){
values.push_back(grid[y][x]);
numberOfValues++; //increase the number of values in the vector by 1
x = 2; // reset x position
y = 3;//reset y position
}

Примечание: код был написан с использованием кода Visual Studio на Ubuntu
Примечание 2: Это моя первая публикация на этом сайте, если я сделал что-то неправильно с точки зрения формата, пожалуйста, сообщите мне, чтобы не повторять это.

Заранее спасибо за вашу помощь

2

Решение

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

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

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

if (x == 0 || x == 4 || y == 0 || y == 4)

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

const int GRID_WIDTH = 5;
const int GRID_HEIGHT = 5;
int grid[GRID_HEIGHT][GRID_WIDTH];

// ...

if (x == 0 || x == GRID_WIDTH - 1 || y == 0 || y == GRID_HEIGHT - 1)
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]