首页 文章

AnyLogic中的人口密度建模

提问于
浏览
0

我试图在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)

是错误的,因为我认为该陈述将评估统一分布的两个不同的抽奖,而不是一个 .

有关完整信息,请使用以下链接下载完整模型 . https://www.mediafire.com/file/eaq65mgpqi9qlld/TestModelKaart.zip/file

需要说明的是,这篇文章包含两个问题 . 首先,可能是该模型显示出意外行为的原因,即在某些区域放置的代理商太少?其次,如果我想要x> uniform(1)<= y?我如何让AnyLogic从均匀分布中评估一次绘制?

当然非常欢迎任何与人口密度建模相关的其他技巧!

2 回答

  • 1

    要回答至少一个问题,您必须在开头创建一个变量并在函数的其余部分中使用它:

    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
    

    首先检查这是否解决了您的其他问题 .

  • 1

    首先,关于你的第二个问题,通常是你的代码,你最好将生成的随机数保存在局部变量中,比如 double rand = uniform(); ,然后在代码的以下部分使用局部变量 . 这样您就可以正确评估 if(rand > x && rand <= y) . 此外,它可以解决您的第一个问题,因为您的第二个if语句在其以前的形式(因为您've mentioned) won' t正常运行 .

    其次,如果您将省份绘制为polyLines,则无需使用 do while 在polyLine中找到一个点 . 您可以使用 pl_[areaname].randomPointInside() 在`pl_ [areaname]'中找到一个随机点 .

相关问题