AnyLogic 中的人口密度建模
Modelling population density in AnyLogic
我正在尝试在 AnyLogic 中模拟人口密度。为此,我在 Main 中插入了一个国家/地区的图像,并使用多段线绘制区域(在本例中称为 pl_[areaname],省份。然后在 Main 中使用函数 (SetHomeLocation),我放置代理(患者在这种情况下)在这些区域中,如果满足条件。为简洁起见,部分代码如下所示。
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,并且在 'on startup' 字段中我输入了:
//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)
是错误的,因为我认为该声明会评估来自均匀分布的两个不同抽签,而不是一个。
为了完整披露,以下 link 让您可以下载完整的模型。 https://www.mediafire.com/file/eaq65mgpqi9qlld/TestModelKaart.zip/file
明确地说,这个 post 包含两个问题。
首先,模型出现意外行为的原因是什么,即在某些区域放置的代理太少?
其次,如果我想要 x > uniform(1) <= y,我如何让 AnyLogic 从均匀分布中评估一次抽取?
当然欢迎任何其他与人口密度建模相关的技巧!
要至少回答您的一个问题,您必须在开始时创建一个变量并在函数的其余部分中使用它:
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
首先检查这是否解决了您的其他问题。
首先,关于你的第二个问题,通常是你的代码,你最好将生成的随机数保存在一个局部变量中,比如 double rand = uniform();
然后在你的以下部分中使用局部变量代码。这样您就可以正确评估 if(rand > x && rand <= y)
。它还可以解决您的第一个问题,因为您以前形式的第二个 if 语句(如您所提到的)将无法正常运行。
其次,如果您将省份绘制为多段线,则无需使用 do while
来查找多段线内的点。您可以使用 pl_[areaname].randomPointInside()
在 `pl_[areaname]' 中找到一个随机点。
我正在尝试在 AnyLogic 中模拟人口密度。为此,我在 Main 中插入了一个国家/地区的图像,并使用多段线绘制区域(在本例中称为 pl_[areaname],省份。然后在 Main 中使用函数 (SetHomeLocation),我放置代理(患者在这种情况下)在这些区域中,如果满足条件。为简洁起见,部分代码如下所示。
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,并且在 'on startup' 字段中我输入了:
//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)
是错误的,因为我认为该声明会评估来自均匀分布的两个不同抽签,而不是一个。
为了完整披露,以下 link 让您可以下载完整的模型。 https://www.mediafire.com/file/eaq65mgpqi9qlld/TestModelKaart.zip/file
明确地说,这个 post 包含两个问题。 首先,模型出现意外行为的原因是什么,即在某些区域放置的代理太少? 其次,如果我想要 x > uniform(1) <= y,我如何让 AnyLogic 从均匀分布中评估一次抽取?
当然欢迎任何其他与人口密度建模相关的技巧!
要至少回答您的一个问题,您必须在开始时创建一个变量并在函数的其余部分中使用它:
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
首先检查这是否解决了您的其他问题。
首先,关于你的第二个问题,通常是你的代码,你最好将生成的随机数保存在一个局部变量中,比如 double rand = uniform();
然后在你的以下部分中使用局部变量代码。这样您就可以正确评估 if(rand > x && rand <= y)
。它还可以解决您的第一个问题,因为您以前形式的第二个 if 语句(如您所提到的)将无法正常运行。
其次,如果您将省份绘制为多段线,则无需使用 do while
来查找多段线内的点。您可以使用 pl_[areaname].randomPointInside()
在 `pl_[areaname]' 中找到一个随机点。