Release notes 1- Cloud server processing was simplified in the initial version, it is handled via cloudsim components now. 2- Cloud server manager, edge server manager, mobile device manager and vm allocation policy are used as abstract class in factory pattern to allow developers to use different business logic without modifying EdgeCloudSim source code. 3- The task and place types are no longer defined as enumeration. They are used as integer value in order to manipulate more place type without modifying enum variable. 4- Two sample applications (one of them is simple and the other one extended application) are added along with the corresponding matlab files to plot statistics. 5- Cloud server properties are added to the simulation settings file 6- New log items are added to simulation result files 7- Code refactoring is applied including the modification of comments
124 lines
5.3 KiB
Java
124 lines
5.3 KiB
Java
/*
|
|
* Title: EdgeCloudSim - Nomadic Mobility model implementation
|
|
*
|
|
* Description:
|
|
* MobilityModel implements basic nomadic mobility model where the
|
|
* place of the devices are changed from time to time instead of a
|
|
* continuous location update.
|
|
*
|
|
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
|
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
|
*/
|
|
|
|
package edu.boun.edgecloudsim.mobility;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.TreeMap;
|
|
import java.util.Map.Entry;
|
|
|
|
import org.apache.commons.math3.distribution.ExponentialDistribution;
|
|
import org.w3c.dom.Document;
|
|
import org.w3c.dom.Element;
|
|
import org.w3c.dom.Node;
|
|
import org.w3c.dom.NodeList;
|
|
|
|
import edu.boun.edgecloudsim.core.SimSettings;
|
|
import edu.boun.edgecloudsim.utils.Location;
|
|
import edu.boun.edgecloudsim.utils.SimLogger;
|
|
import edu.boun.edgecloudsim.utils.SimUtils;
|
|
|
|
public class NomadicMobility extends MobilityModel {
|
|
private List<TreeMap<Double, Location>> treeMapArray;
|
|
|
|
public NomadicMobility(int _numberOfMobileDevices, double _simulationTime) {
|
|
super(_numberOfMobileDevices, _simulationTime);
|
|
// TODO Auto-generated constructor stub
|
|
}
|
|
|
|
@Override
|
|
public void initialize() {
|
|
treeMapArray = new ArrayList<TreeMap<Double, Location>>();
|
|
|
|
ExponentialDistribution[] expRngList = new ExponentialDistribution[SimSettings.getInstance().getNumOfEdgeDatacenters()];
|
|
|
|
//create random number generator for each place
|
|
Document doc = SimSettings.getInstance().getEdgeDevicesDocument();
|
|
NodeList datacenterList = doc.getElementsByTagName("datacenter");
|
|
for (int i = 0; i < datacenterList.getLength(); i++) {
|
|
Node datacenterNode = datacenterList.item(i);
|
|
Element datacenterElement = (Element) datacenterNode;
|
|
Element location = (Element)datacenterElement.getElementsByTagName("location").item(0);
|
|
String attractiveness = location.getElementsByTagName("attractiveness").item(0).getTextContent();
|
|
int placeTypeIndex = Integer.parseInt(attractiveness);
|
|
|
|
expRngList[i] = new ExponentialDistribution(SimSettings.getInstance().getMobilityLookUpTable()[placeTypeIndex]);
|
|
}
|
|
|
|
//initialize tree maps and position of mobile devices
|
|
for(int i=0; i<numberOfMobileDevices; i++) {
|
|
treeMapArray.add(i, new TreeMap<Double, Location>());
|
|
|
|
int randDatacenterId = SimUtils.getRandomNumber(0, SimSettings.getInstance().getNumOfEdgeDatacenters()-1);
|
|
Node datacenterNode = datacenterList.item(randDatacenterId);
|
|
Element datacenterElement = (Element) datacenterNode;
|
|
Element location = (Element)datacenterElement.getElementsByTagName("location").item(0);
|
|
String attractiveness = location.getElementsByTagName("attractiveness").item(0).getTextContent();
|
|
int placeTypeIndex = Integer.parseInt(attractiveness);
|
|
int wlan_id = Integer.parseInt(location.getElementsByTagName("wlan_id").item(0).getTextContent());
|
|
int x_pos = Integer.parseInt(location.getElementsByTagName("x_pos").item(0).getTextContent());
|
|
int y_pos = Integer.parseInt(location.getElementsByTagName("y_pos").item(0).getTextContent());
|
|
|
|
//start locating user shortly after the simulation started (e.g. 10 seconds)
|
|
treeMapArray.get(i).put(SimSettings.CLIENT_ACTIVITY_START_TIME, new Location(placeTypeIndex, wlan_id, x_pos, y_pos));
|
|
}
|
|
|
|
for(int i=0; i<numberOfMobileDevices; i++) {
|
|
TreeMap<Double, Location> treeMap = treeMapArray.get(i);
|
|
|
|
while(treeMap.lastKey() < SimSettings.getInstance().getSimulationTime()) {
|
|
boolean placeFound = false;
|
|
int currentLocationId = treeMap.lastEntry().getValue().getServingWlanId();
|
|
double waitingTime = expRngList[currentLocationId].sample();
|
|
|
|
while(placeFound == false){
|
|
int newDatacenterId = SimUtils.getRandomNumber(0,SimSettings.getInstance().getNumOfEdgeDatacenters()-1);
|
|
if(newDatacenterId != currentLocationId){
|
|
placeFound = true;
|
|
Node datacenterNode = datacenterList.item(newDatacenterId);
|
|
Element datacenterElement = (Element) datacenterNode;
|
|
Element location = (Element)datacenterElement.getElementsByTagName("location").item(0);
|
|
String attractiveness = location.getElementsByTagName("attractiveness").item(0).getTextContent();
|
|
int placeTypeIndex = Integer.parseInt(attractiveness);
|
|
int wlan_id = Integer.parseInt(location.getElementsByTagName("wlan_id").item(0).getTextContent());
|
|
int x_pos = Integer.parseInt(location.getElementsByTagName("x_pos").item(0).getTextContent());
|
|
int y_pos = Integer.parseInt(location.getElementsByTagName("y_pos").item(0).getTextContent());
|
|
|
|
treeMap.put(treeMap.lastKey()+waitingTime, new Location(placeTypeIndex, wlan_id, x_pos, y_pos));
|
|
}
|
|
}
|
|
if(!placeFound){
|
|
SimLogger.printLine("impossible is occured! location cannot be assigned to the device!");
|
|
System.exit(0);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
@Override
|
|
public Location getLocation(int deviceId, double time) {
|
|
TreeMap<Double, Location> treeMap = treeMapArray.get(deviceId);
|
|
|
|
Entry<Double, Location> e = treeMap.floorEntry(time);
|
|
|
|
if(e == null){
|
|
SimLogger.printLine("impossible is occured! no location is found for the device '" + deviceId + "' at " + time);
|
|
System.exit(0);
|
|
}
|
|
|
|
return e.getValue();
|
|
}
|
|
|
|
}
|