代码之家  ›  专栏  ›  技术社区  ›  mivandev

AnyLogic中的人口密度模型

  •  0
  • mivandev  · 技术社区  · 6 年前

    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

    要明确的是,这篇文章包含两个问题。 首先,模型显示意外行为的原因是什么,即在某些区域放置的代理太少? 第二,如果我想要x>的话,我如何让AnyLogic计算一个从均匀分布中得出的结果;统一(1)<=Y

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   Felipe    6 年前

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

    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
    

    首先检查这是否解决了你的其他问题。

        2
  •  1
  •   Mohammad Hasan N.    6 年前

    double rand = uniform(); 然后在代码的以下部分使用局部变量。这样你就可以评估 if(rand > x && rand <= y)

    第二,如果您已经将省份绘制为多段线,则无需使用 do while pl_[areaname].randomPointInside()