参照其他博主的博客学习了下,此文章仅为学习机会网络做笔记使用,若有侵权,请联系,定及时删除。
ONE仿真中core包下world类是所有节点的共有类,在该类中设置节点属性。
/*
* Copyright 2010 Aalto University, ComNet
* Released under GPLv3. See LICENSE.txt for details.
*/
package core;
import input.EventQueue;
import input.ExternalEvent;
import input.ScheduledUpdatesQueue;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
/**
* World contains all the nodes and is responsible for updating their
* location and connections.
*/
public class World {
/** name space of optimization settings ({@value})*/
public static final String OPTIMIZATION_SETTINGS_NS = "Optimization";
/**
* Should the order of node updates be different (random) within every
* update step -setting id ({@value}). Boolean (true/false) variable.
* Default is @link {@link #DEF_RANDOMIZE_UPDATES}.
*/
public static final String RANDOMIZE_UPDATES_S = "randomizeUpdateOrder";
/** should the update order of nodes be randomized -setting's default value
* ({@value}) */
public static final boolean DEF_RANDOMIZE_UPDATES = true;
/**
* Should the connectivity simulation be stopped after one round
* -setting id ({@value}). Boolean (true/false) variable.
*/
public static final String SIMULATE_CON_ONCE_S = "simulateConnectionsOnce";
private int sizeX; //节点X坐标
private int sizeY; //节点Y坐标
private List eventQueues; //事件队列
private double updateInterval; //更新时间间隔
private SimClock simClock; //仿真时间
private double nextQueueEventTime; //下一事件触发时间
private EventQueue nextEventQueue; //下一事件队列
/** list of nodes; nodes are indexed by their network address */
private List hosts; //节点列表
private boolean simulateConnections; //是否连接
/** nodes in the order they should be updated (if the order should be
* randomized; null value means that the order should not be randomized) */
private ArrayList updateOrder; //节点以这个列表中的顺序被更新
/** is cancellation of simulation requested from UI */
private boolean isCancelled; //仿真是否在UI界面被终止
private List updateListeners; //更新监听列表
/** Queue of scheduled update requests */
private ScheduledUpdatesQueue scheduledUpdates; //计划更新需求列表
private boolean simulateConOnce;
private boolean isConSimulated;
/**
* Constructor.//实例化World对象
*/
public World(List hosts, int sizeX, int sizeY,
double updateInterval, List updateListeners,
boolean simulateConnections, List eventQueues) {
this.hosts = hosts;
this.sizeX = sizeX;
this.sizeY = sizeY;
this.updateInterval = updateInterval;
this.updateListeners = updateListeners;
this.simulateConnections = simulateConnections;
this.eventQueues = eventQueues;
this.simClock = SimClock.getInstance();
this.scheduledUpdates = new ScheduledUpdatesQueue();
this.isCancelled = false;
this.isConSimulated = false;
setNextEventQueue();
initSettings();
}
/** 初始化设置
* Initializes settings fields that can be configured using Settings class
*/
private void initSettings() {
Settings s = new Settings(OPTIMIZATION_SETTINGS_NS);
boolean randomizeUpdates = DEF_RANDOMIZE_UPDATES;
if (s.contains(RANDOMIZE_UPDATES_S)) {
randomizeUpdates = s.getBoolean(RANDOMIZE_UPDATES_S);
}
simulateConOnce = s.getBoolean(SIMULATE_CON_ONCE_S, false);
if(randomizeUpdates) {
// creates the update order array that can be shuffled
this.updateOrder = new ArrayList(this.hosts);
}
else { // null pointer means "don't randomize"
this.updateOrder = null;
}
}
/**
* Moves hosts in the world for the time given time initialize host
* positions properly. SimClock must be set to -time
before
* calling this method.
* @param time The total time (seconds) to move
*/
public void warmupMovementModel(double time) {
if (time <= 0) {
return;
}
//??? SimClock.getTime() < -updateInterval
while(SimClock.getTime() < -updateInterval) {
moveHosts(updateInterval);
simClock.advance(updateInterval);
}
double finalStep = -SimClock.getTime();
moveHosts(finalStep);
simClock.setTime(0);
}
/**
* Goes through all event Queues and sets the
* event queue that has the next event.
*/
public void setNextEventQueue() {
EventQueue nextQueue = scheduledUpdates;
double earliest = nextQueue.nextEventsTime();
/* find the queue that has the next event */
for (EventQueue eq : eventQueues) {
if (eq.nextEventsTime() < earliest){
nextQueue = eq;
earliest = eq.nextEventsTime();
}
}
this.nextEventQueue = nextQueue;
this.nextQueueEventTime = earliest;
}
/**
* Update (move, connect, disconnect etc.) all hosts in the world.
* Runs all external events that are due between the time when
* this method is called and after one update interval.
*/
public void update () {
//本次更新运行时间
double runUntil = SimClock.getTime() + this.updateInterval;
setNextEventQueue();
/* process all events that are due until next interval update */
while (this.nextQueueEventTime <= runUntil) {
simClock.setTime(this.nextQueueEventTime);
ExternalEvent ee = this.nextEventQueue.nextEvent();
ee.processEvent(this);
updateHosts(); // update all hosts after every event
setNextEventQueue();
}
moveHosts(this.updateInterval);
simClock.setTime(runUntil);
updateHosts();
/* inform all update listeners */
for (UpdateListener ul : this.updateListeners) {
ul.updated(this.hosts);
}
}
/**
* Updates all hosts (calls update for every one of them). If update
* order randomizing is on (updateOrder array is defined), the calls
* are made in random order.
*/
private void updateHosts() {
if (this.updateOrder == null) { // randomizing is off
for (int i=0, n = hosts.size();i < n; i++) {
if (this.isCancelled) {
break;
}
hosts.get(i).update(simulateConnections);
}
}
else { // update order randomizing is on
assert this.updateOrder.size() == this.hosts.size() :
"Nrof hosts has changed unexpectedly";
Random rng = new Random(SimClock.getIntTime());
Collections.shuffle(this.updateOrder, rng);
for (int i=0, n = hosts.size();i < n; i++) {
if (this.isCancelled) {
break;
}
this.updateOrder.get(i).update(simulateConnections);
}
}
if (simulateConOnce && simulateConnections) {
simulateConnections = false;
}
}
/**
* void update():double runUntil表示本次更新运行时间,
* 然后设置下一次的EventQueue;进入循环,
* 在下次EventQueue时间之前处理本次更新,
* 从本次EventQueue中提取事件,
* 通过事件处理函数processEvent(World world)进行处理,
* 通过函数moveHosts()updateHosts(double),移动节点,处理事件后更新所有节点;
* 通知所有的UpdateListener,本次更新内容。此过程循环到整个仿真时间到,或有外部终止。
*/
/**
* Moves all hosts in the world for a given amount of time
* @param timeIncrement The time how long all nodes should move
*/
private void moveHosts(double timeIncrement) {
for (int i=0,n = hosts.size(); i getHosts() {
return this.hosts;
}
/**
* Returns the x-size (width) of the world
* @return the x-size (width) of the world
*/
public int getSizeX() {
return this.sizeX;
}
/**
* Returns the y-size (height) of the world
* @return the y-size (height) of the world
*/
public int getSizeY() {
return this.sizeY;
}
/**
* Returns a node from the world by its address
* @param address The address of the node
* @return The requested node or null if it wasn't found
*/
public DTNHost getNodeByAddress(int address) {
if (address < 0 || address >= hosts.size()) {
throw new SimError("No host for address " + address + ". Address " +
"range of 0-" + (hosts.size()-1) + " is valid");
}
DTNHost node = this.hosts.get(address);
assert node.getAddress() == address : "Node indexing failed. " +
"Node " + node + " in index " + address;
return node;
}
/**
* Schedules an update request to all nodes to happen at the specified
* simulation time.
* @param simTime The time of the update
*/
public void scheduleUpdate(double simTime) {
scheduledUpdates.addUpdate(simTime);
}
}