Anylogic中以编程方式创建的GIS网络中的代理路由

Posted

技术标签:

【中文标题】Anylogic中以编程方式创建的GIS网络中的代理路由【英文标题】:Agent Routing in Programatically Created GIS Network in Anylogic 【发布时间】:2020-09-22 23:48:10 【问题描述】:

我正在通过 GIS 地图(最后编写的代码)Grid picture 上的代码以编程方式构建网格。我有一个名为 gisPoints 的 GIS 点的 ArrayList 和一个名为车辆的代理群体。我可以很好地在网络中创建 GIS 点和 GIS 路线。我遇到的问题是我创建了一些在网络中行驶的车辆,它们在 GIS 点之间行驶,但它们不使用创建的网络行驶。

Model screenshot。在源模块中创建车辆时,我使用到达位置:网络/GIS 节点和节点:gisPoints.get(0)。然后在 moveTo 块上,我使用目的地:网络/GIS 节点和节点:gisPoints.get(uniform_discr(0, gisPoints.size()-1))。

我一直在疯狂地尝试这个,但无法像手动构建网络那样让它正常工作。车辆似乎无法以某种方式进入网络。我该如何解决这个问题?

网络生成代码

//Create list of GIS Points
List<Tuple> rows = selectFrom(gis_points).list();

for (Tuple row : rows) 
        GISPoint hub = new GISPoint(map,true,row.get( gis_points.latitude ),row.get( gis_points.longitude ));
        map.add(hub);
        gisPoints.add(hub);



int verticalCorners = (int) DataStructure.getCellNumericValue("GenerateCoordinates", 1, 11);
int horizontalCorners = (int) DataStructure.getCellNumericValue("GenerateCoordinates", 2, 11);

//create a new GIS network and attach it to your map element
GISNetwork network = new GISNetwork(map,"myNetwork",true);

//add all GISPoints to this network
for(GISPoint p:gisPoints)
    network.add(p);


//generate horizontal routes
for(int i=0;i<verticalCorners;i++)
    for(int j=0;j<horizontalCorners-1;j++)

        //create curves (neccessary for the GISRoutes)
        Curve<GISMarkupSegment> curve = new Curve<>();

        //create segment (neccessary for Curve)
        GISMarkupSegment segment = new GISMarkupSegmentLine(
        gisPoints.get(j+i*horizontalCorners).getLatitude(),
        gisPoints.get(j+i*horizontalCorners).getLongitude(),
        gisPoints.get(j+1+i*horizontalCorners).getLatitude(), 
        gisPoints.get(j+1+i*horizontalCorners).getLongitude());

        curve.addSegment(segment);  
        curve.initialize();
        network.add(new GISRoute(map,curve,gisPoints.get(j+i*horizontalCorners), gisPoints.get(j+1+i*horizontalCorners), true));
    


//generate vertical routes
for(int i=0;i<horizontalCorners;i++)
    for(int j=0;j<verticalCorners-1;j++)

        //create curves (neccessary for the GISRoutes)
        Curve<GISMarkupSegment> curve = new Curve<>();

        //create segment (neccessary for Curve)
        GISMarkupSegment segment = new GISMarkupSegmentLine(
        gisPoints.get(i+j*horizontalCorners).getLatitude(),
        gisPoints.get(i+j*horizontalCorners).getLongitude(),
        gisPoints.get(i+(1+j)*horizontalCorners).getLatitude(), 
        gisPoints.get(i+(1+j)*horizontalCorners).getLongitude());

        curve.addSegment(segment);  
        curve.initialize();
        network.add(new GISRoute(map,curve,gisPoints.get(j+i*horizontalCorners), gisPoints.get(j+1+i*horizontalCorners), true));
    


//Do not forget to initialize the network
network.initialize();

【问题讨论】:

您确定在创建 GIS 网络后创建移动代理吗?此外,在您的源块的“退出时”中,调用agent.jumpTo(somegisPointIn Network 以强制将它们添加到网络中。您可能还需要在其他一些位置尝试此操作(在创建代理时...) @Benjamin 我在启动时创建了网络,第一个移动代理是在模拟的第 20 分钟左右创建的。我在“退出时”的创建块和 moveTo 块的“进入时”中使用了 agent.jumpTo(gisPoints.get(0)),但它不起作用。还有其他想法吗? 好吧,试着一步一步往回走,直到它起作用,或者创建一个“MVP”,即它在概念上起作用的最小模型。然后,必须调查它在哪里发生故障......不幸的是,真的很难提供更多建议。 【参考方案1】:

不确定这是否是解决方案,但您可以尝试一下。

我认为问题在于您将网络生成为局部变量,而不是您应该将网络作为 main 中的变量...所以您的 gispoints 存在(因为它们是 main 中的集合)但您的网络没有'不是因为它是在您的主设置中作为局部变量创建的

【讨论】:

好吧,试着一步一步往回走,直到它起作用,或者创建一个“MVP”,即它在概念上起作用的最小模型。然后,必须调查它在哪里发生故障......不幸的是,真的很难提供更多建议。 @Benjamin 实际上我创建的路线错误(垂直路线的索引错误)。因此,问题在于没有可行的路线通过网络从不同水平层的起点和终点获取。尽管如此,Felipe 的建议比我的建议更优雅,因为不需要创建 gisPoints 集合,因为一切(初始点和目标点)可以直接从网络调用。谢谢你们的帮助。【参考方案2】:

*更新的解决方案

实际上我创建的路线错误(垂直路线的索引错误)。正如您在我使用的代码中看到的那样:

network.add(new GISRoute(map,curve,gisPoints.get(j+i*horizontalCorners), gisPoints.get(j+1+i*horizontalCorners), true));

正确的形式是:

network.add(new GISRoute(map,curve,gisPoints.get(i+j*horizontalCorners), gisPoints.get(i+(1+j)*horizontalCorners), true));

因此,问题在于没有可行的路线通过网络从不同水平层的起点和终点到达。

我不会修改这个问题,因为我认为它可能对需要以编程方式创建矩形网络并考虑 Felipe Haro 在 main 中的建议(创建一个 GISNetwork 全局变量)的人有用,这比我所拥有的更优雅因为不需要创建 gisPoints 集合,因为所有内容(初始点和目标点)都可以直接从网络调用。

【讨论】:

以上是关于Anylogic中以编程方式创建的GIS网络中的代理路由的主要内容,如果未能解决你的问题,请参考以下文章

启动时在 Anylogic 中更改 GIS 路由

如何在 GIS 空间中的 anylogic 中创建家庭和本地连接?

与代理连接时清空集合 Anylogic

将 toDate 函数设置为到达时间 Anylogic

Anylogic GIS实时交通数据

Anylogic - 使用自定义 GIS 路线绘制动画帧时出错