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

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

По сути, программа берет указанную точку на сетке и на основе случайного ввода перемещает ее влево, вправо, вверх, вниз, пока не достигнет граничной точки на этой сетке, а затем выбрасывает число, на которое она приземлилась, в вектор и повторяет пока количество значений в векторе не станет равным количеству предопределенных итераций. Программа не закончена, но проблема в том, что я хочу, чтобы программа «сбросила» обратно к начальной точке, как только она достигнет граничной точки. Похоже, это работает для случаев, когда число или итерации мало (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 down


   switch (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: Это моя первая публикация на этом сайте, если я сделал что-то неправильно с точки зрения формата, пожалуйста, сообщите мне, чтобы не повторять это.

Заранее благодарю за помощь

1 Ответ

0 голосов
/ 07 ноября 2018

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

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

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

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)
...