ONE源代码分析——movement4之BusMovement

BusMovement是MapRouteMovement的子类,模拟城市中公共汽车的节点移动模型。

在分析之前,我们先来看一下BusControlSystem类,这个类控制公共汽车和乘客,可以有很多歌BusControlSystem,但是一个bus或乘客只能属于一个系统。

BusControlSystem类:

数据域:

static final String BUS_CONTROL_SYSTEM_NR

HashMap<Integer, BusControlSystem> sytstems:哈希表,存放整数和对应的控制系统

HashMap<Integer, BusMovement> busses:哈希表,存放整数和对应的公共汽车移动模型

HashMap<Integer, BusTravellerMovement> travelers:哈希表,存放整数和对应的BusTravellerMovement

List<Coord> busStops:存放公共汽车停靠的站点

SimMap simMap:仿真地图


函数域:

构造函数BusControlSystem(int systemID)构造一个没有busses和travelers的空控制系统,系统ID是唯一的。


void busHasStopped(int busID, Coord busStop, Path nextPath)由属于这个控制系统的公共汽车在每次停靠时触发,如果乘客想要乘车,触发函数enterBus(),path表示通向下一个站点的路径。

函数中定义一个哈希表travellers值的迭代器,遍历哈希表中存放的每一个traveller,如果其当前位置等于busStop,并且目前状态是STATE_WAITING_FOR_BUS,触发函数enterBus()。

BusMovement类:

数据域:

BusControlSystem controlSystem:控制系统

int id:公共汽车的ID

static int nextID:下一个ID

boolean startMode:

List<Coord> stops:停靠的站点

函数域:

构造函数BusMovement(Settings settings)由配置文件创建一个BusMovement对象。首先从配置文件所给的BUS_CONTROL_SYSTEM_NR创建一个BusControlSystem对象,这个BusControlSystem的simMap就是BusMovement的simMap;然后获取该Bus对象的ID,在controlSsytem中注册该Bus对象,startMode设置为true;Bus对象停靠的站点由BusMovement的父类MapRouteMovement成员函数getStops()获取,最后在controlSystem中设置该Bus对象的停靠站点。


Path getPath()基本与父类函数相同,特殊之处在于如果不是startMode那么要触发函数busHasStopped()。

下面我们来看你一下BusTravellerMovement类。这个类是MapBasedMovement的子类,表示乘坐bus的乘客。一个BusTravellerMovement对象属于一个BusControlSystem,Traveller对象有一个目的地和一个起始位置。如果traveller直接走到目的地的path比乘坐bus的路径长,则traveller选择乘坐bus。如果没有提供traveller的目的地,则乘坐随机的站数。


工具类ContinueBusTripDecider帮助节点决定是否应该继续乘坐bus。

数据域:

double[] probabilities:乘坐bus的概率

int state:当前状态

Random rng:随机数

函数域:

构造函数ContinueBusTripDecider(Random rng, double[] probabilities)。


boolean continueTrip()根据随机数判断是否继续乘车。


void incState()当经过一个stop时触发,如果state小于概率数组的长度-1,state++。


void resetState()当节点完成它的行程触发,state = 0。




BusTravellerMovement类:

说明一下,BusTravellerMovement类实现了接口类TransportMovement,这个接口类只有一个待重载函数setNextRoute(Coord nodeLocation, Coord nodeDestination)。



数据域:

static final String PROPABILITIES_STRING:表示概率的一个常final量,表示乘坐Bus的概率

static final String PROBABILITY_TAKE_OTHER_BUS:表示乘坐其他Bus的概率

static final int STATE_WAITING_FOR_BUS,STATE_DECIDED_TO_ENTER_A_BUS,STATE_TRAVELLING_ON_BUS,STATE_WALKING_ELSEWHERE:四个traveller状态

int state:对应上面四个状态

Path nextPath:下一步的路径

Coord location:当前位置坐标

Coord latestBusStop:最近一次的Bus站

BusControlSystem controlSystem:控制系统

int id:标示

ContinueBusTripDecider cbtd:继续乘坐Bus决定类

double[] probabilities:概率数组

double probTakeOtherBus:乘坐其他Bus的概率

DijkstraPathFinder pathFinder:最短路径寻找

Coord startBusStop:起始Bus站

Coord endBusStop:终止Bus站

boolean takeBus:是否乘坐Bus

static int nextID:全局变量,下一个ID


函数域:

构造函数BusTravellerMovement(Settings settings)由Settings创建对象,首先获取BusControlSystem,注册该BusTravellerMovement对象,新建路径,将state置为STATE_WALKING_ELSEWHERE,如果Settings中设置了PROBABLITIES_STRING,那么提取到probabilities,同理probTakeOtherBus;

static Coord getClosestCoordiante(List<Coord> allCoords, Coord coord)从一组坐标中找到到某个特殊位置的最近的坐标。


Coord getInitialLocation()获取初始位置。将目前SimMap所有节点存入一个MapNode数组,从数组中获取一个随机的位置。利用getClosestCoordinate()函数获取距离该点最近的Stop,将此Stop存入latestBusStop。


Path getPath()根据节点目前的状态:正在等车——null;决定上车——状态变为乘车中,当前位置设置为本路径的终点,返回nextPath;走路——寻找一条到最近Stop的最短路径。


double generateWaitTime()函数getPath()触发是状态转换。如果当前状态时走路,当前位置是最近的stop,状态改变为等车;如果当前状态是乘车中,状态变为等车。


void enterBus(Path nextPath)通知在stop处的节点bus来了。在Bus中的节点也会接到通知。如果当前位置为endBusStop,状态改变为走路,latestBusStop设置为当前endBusStop;否则,状态改变为决定上车,this.nextPath=nextPath。如果决定不乘坐bus,状态改变为等车,根据概率选择走路或等待下一辆bus。如果决定继续坐车,状态改变为决定上车,this.nextPath=nextPath。


void setNextRoute(Coord nodeLocation, Coord nodeDestination)给traveller设置下一段路径,决定是否坐车。先寻找离当前位置和当前目的地最近的stops,检查是否比走路去路径短。


CarMovement类:

下面说一下一个简单的MapBasedMovement子类,并且实现了TransportMovement接口类CarMovement。

数据域:

Coord from,to:初始和目的节点坐标。

DijkstraPathFinder pathFinder:寻路工具


函数域:

构造函数CarMovement(Settings settings)由配置文件创建对象。


void setNextRoute(Coord nodeLocation, Coord nodeDestination)设置下一个使用的route,将nodeLocation赋值给from,nodeDestination赋值给to。


Path getPath()从from和to变量中获取其在地图上的节点对象MapNode,由pathFinder工具寻找出一条from到to的最短路径,将路径上的节点存入List<MapNode> nodePath,用这个表创建出一条路径。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ymaym

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值