【问题标题】:Condition For Select Output based on distance between two different GIS Nodes根据两个不同 GIS 节点之间的距离选择输出的条件
【发布时间】:2019-10-05 07:43:52
【问题描述】:

我正在尝试找到一个条件来输入基于两个 GIS 点之间的距离的选择输出。我的网络包括一辆载有人的电车,我希望我的人在离它家最近的电车站下车。电车在计数器循环中移动,我想设置条件,以便人退出在正确的电车站下车。你能帮我吗?

我已经尝试过 distanceByRoute 但我不知道如何通过状态图或在 selectOutput 中为它形成条件。enter image description here

【问题讨论】:

    标签: anylogic


    【解决方案1】:

    假设

    • 您有一群 Station-名为 stations 的代理
    • 您有一群 Passenger-名为 passengers 的代理
    • 您有一群 Tram-名为 trams 的代理
    • 您有一群 Home-名为 homes 的代理

    一步一步

    1. 添加到Tram-代理一个Station类型的变量nextStation,其中moveTo-Block总是保存当前到达的车站

    2. 添加到 Passenger-Agent 类型的参数 Home 名为 home 在模型启动时 Home-代理填写

    3. 创建一个名为 getNearestStation 的函数,其输入参数类型为 Passenger,输出类型为 Station

        //initialize with first station
        Station nearestStation = stations.get(0);
        double distanceToNearestStation = passenger.home.distanceByRoute(nearestStation);
        double currentDistance;
        
        for(Station station:stations){
            currentDistance = passenger.home.distanceByRoute(station);
            //save it if you find a closer station
            if( currentDistance < distanceToNearestStation){
                nearestStation = station;
                distanceToNearestStation = passenger.home.distanceByRoute(station);
            }
        }
        
        return nearestStation;
    

    除了 Station 代理,您还可以将 GISPoint 用于电车内的变量 nextStation 和 getNearestStation 代码。

    1. 在您的流程图中添加一个丢弃块并将丢弃条件设置为以下内容: getNearestStation(agent).equals(container.nextStation)


    补充说明

    为了减少距离计算的频率,getNearestStation 在每个乘客初始化时只执行一次,并将其保存在一个变量中,而不是每次通过下客区时计算它。

    【讨论】:

    • 下车条件对我不起作用。要么我不知道如何为函数声明输入和输出(我将它们写在函数的参数部分中),要么我无法理解。另外,我想使用合并和拆分而不是下车,因为对我来说,乘客更像是一个与电车结合的物体。你能帮我解决一下吗?
    • 1) “passenger notsolved”:对于函数 getNearestStation 的输入参数,您必须给出名称“passenger” 2) “方法 getNearestStation ....”:我看到你定义了乘客和 Station 作为输入参数。使用我的代码应该只是乘客。此外,您使用 Tram 作为参数执行该函数,您需要给它一个对乘客的引用。 3)-5) 看来您已将参数/变量 nextStation 和 counter 定义为 static ?不太确定...
    • 对不起,如果我的问题是一般性的。我已经阅读了 Anylogic 教程和所有内容,但我是 Java 初学者,并且正在弄清楚函数是如何运行的。我正在使用电车作为代理进行基于代理的建模,在电车内我有 GisPoints 作为我的车站和一个计数器参数,允许我的电车从一个站点移动到另一个站点。我有乘客作为代理人,现在我只想在电车上移动一个人。我在 Hbf 将电车和乘客组合在一起,我想在家附近(目前是 GIS 位置)将它们分开,但我不知道如何将您的功能与我的模型集成。
    • 我添加了另一个屏幕截图,说明如何在 AnyLogic 中使用输入和输出参数定义函数。我将 Stations 和 Homes 建模为 Agent,但您可以将其与 GISPoints 一起使用,只需交换所有相关位置的类型(Tram 中的 nextStation 变量、Passenger 中的 home 变量以及 getNearestStation 函数体+返回类型)。
    • 很抱歉一次又一次地打扰你:-(但我仍然无法弄清楚如何在函数体中转换为 GisPoints (INode),特别是在涉及距离时。我是在答案框中添加我的屏幕截图。
    【解决方案2】:

    enter image description here

    tramCollection 这里是我在 Main 的地图上收集的电车站(在 GIS/INode 中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-29
      • 2015-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多