Моделирование плотности населения в AnyLogic - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь смоделировать плотность населения в AnyLogic.Для этого я вставил изображение страны в Main и использовал полилинию для рисования областей (в данном случае pl_ [areaname], в данном случае провинции). Затем, используя функцию (SetHomeLocation) в Main, я размещаю агентов (пациентовв данном случае) в этих областях, если выполняется условие. Для краткости часть кода показана ниже.

double x;
double y;
if(uniform(1) <=  0.0343995) /// province 1
do {
    x = uniform( image.getX(), image.getX() + image.getWidth() );
    y = uniform( image.getY(), image.getY() + image.getHeight() );
} while( ! pl_Groningen.contains( x, y ) );
else if(uniform(1) > 0.0343995 && uniform(1) <= 0.0725446) /// province 2
do {
    x = uniform( image.getX(), image.getX() + image.getWidth() );
    y = uniform( image.getY(), image.getY() + image.getHeight() );
} while( ! pl_Friesland.contains( x, y ) );
else
do {
    x = uniform( image.getX(), image.getX() + image.getWidth() );
    y = uniform( image.getY(), image.getY() + image.getHeight() );
} while( ! countrybounds.contains( x, y ) );
agent.setXY( x, y );

В Patient я создал две переменные XHome и YHome, а вПоле «при запуске», которое я ввел:

//setup home location (within the country bounds that are defined in Main)
main.setHomeLocation( this );
XHome = getX();
YHome = getY();

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

Я также считаю, что

if(uniform(1) > x && uniform(y) <= y)

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

Для полного раскрытия, следующая ссылка позволяет загрузить полную модель. https://www.mediafire.com/file/eaq65mgpqi9qlld/TestModelKaart.zip/file

Для ясности, этот пост содержит два вопроса: во-первых, что может быть причиной того, что модель показывает неожиданноеповедение, то есть размещение слишком мало агентов в некоторых областях?Во-вторых, как я могу позволить AnyLogic оценивать одну ничью из равномерного распределения, если я хочу x >iform (1) <= y? </p>

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

Ответы [ 2 ]

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

Прежде всего, по поводу вашего второго вопроса и, в общем, вашего кода, вам лучше сохранить сгенерированное случайное число в локальной переменной, например, double rand = uniform();, а затем использовать локальную переменную в следующих частях вашего кода. Таким образом, вы можете правильно оценить if(rand > x && rand <= y). Также это может решить вашу первую проблему, потому что ваш второй оператор if в его предыдущей форме (как вы уже упоминали) не будет работать должным образом.

Во-вторых, если вы нарисовали свои провинции в виде полилиний, вам не нужно использовать do while, чтобы найти точку внутри вашей полилинии. Вы можете использовать pl_[areaname].randomPointInside(), чтобы найти случайную точку внутри `pl_ [areaname] '.

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

Чтобы ответить хотя бы на один из ваших вопросов, вы должны сначала создать переменную и использовать ее в оставшейся части вашей функции:

double rand=uniform();
if(rand <=  0.0343995) /// province 1
//your code
else if(rand > 0.0343995 && rand <= 0.0725446) /// province 2
//your code
else //rand>0.0725446
//your code

Сначала проверьте, решает ли это вашу другую проблему или нет.

...