Condition for Change Mobility Model in EdgeCloudSim
Description: To change the mobility model in EdgeCloudSim, customize the MobilityModel class by extending it and overriding methods like initialize() and getLocation(). The custom model can store device locations over time in a structure such as a TreeMap. The getLocation() method retrieves a device’s location based on its ID and time by looking up the closest time entry. After implementing the custom model, it should be registered in the simulation setup to replace the default mobility model, enabling the desired movement behavior for edge devices.
Sample Code
EdgeMobilityModelChange.java: package EdgeApplication;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import org.cloudbus.cloudsim.Log;
import org.cloudbus.cloudsim.core.CloudSim;
import edu.boun.edgecloudsim.core.ScenarioFactory;
import edu.boun.edgecloudsim.core.SimManager;
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 EdgeMobilityModelChange {
public static void main(String[] args) {
// Disable console output of CloudSim library
Log.disable();
// Enable console output and file output for this application
SimLogger.enablePrintLog();
int iterationNumber = 1;
String configFile = "";
String outputFolder = "";
String edgeDevicesFile = "";
String applicationsFile = "";
if (args.length == 5) {
configFile = args[0];
edgeDevicesFile = args[1];
applicationsFile = args[2];
outputFolder = args[3];
iterationNumber = Integer.parseInt(args[4]);
} else {
SimLogger.printLine("Simulation setting file, output folder, and iteration number are not provided! Using default ones...");
configFile = "scripts/Edge_Application/config/default_config.properties";
applicationsFile = "scripts/Edge_Application/config/applications.xml";
edgeDevicesFile = "scripts/Edge_Application/config/edge_devices.xml";
outputFolder = "sim_results/ite" + iterationNumber;
}
// Load settings from configuration file
SimSettings SS = SimSettings.getInstance();
if (SS.initialize(configFile, edgeDevicesFile, applicationsFile) == false) {
SimLogger.printLine("Cannot initialize simulation settings!");
System.exit(0);
}
if (SS.getFileLoggingEnabled()) {
SimLogger.enableFileLog();
SimUtils.cleanOutputFolder(outputFolder);
}
DateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
Date SimulationStartDate = Calendar.getInstance().getTime();
String now = df.format(SimulationStartDate);
SimLogger.printLine("Simulation started at " + now);
SimLogger.printLine("----------------------------------------------------------------------");
for (int j = SS.getMinNumOfMobileDev(); j <= SS.getMaxNumOfMobileDev(); j += SS.getMobileDevCounterSize()) {
for (int k = 0; k < SS.getSimulationScenarios().length; k++) {
for (int i = 0; i < SS.getOrchestratorPolicies().length; i++) {
String simScenario = SS.getSimulationScenarios()[k];
String orchestratorPolicy = SS.getOrchestratorPolicies()[i];
Date ScenarioStartDate = Calendar.getInstance().getTime();
now = df.format(ScenarioStartDate);
SimLogger.printLine("Scenario started at " + now);
SimLogger.printLine("Scenario: " + simScenario + " - Policy: " + orchestratorPolicy + " - #iteration: " + iterationNumber);
SimLogger.printLine("Duration: " + SS.getSimulationTime() / 3600 + " hour(s) - Poisson: " + SS.getTaskLookUpTable()[0][2] + " - #devices: " + j);
SimLogger.getInstance().simStarted(outputFolder, "SIMRESULT_" + simScenario + "_" + orchestratorPolicy + "_" + j + "DEVICES");
try {
// Initialize CloudSim
int num_user = 2; // number of grid users
Calendar calendar = Calendar.getInstance();
boolean trace_flag = false; // flag to trace events
CloudSim.init(num_user, calendar, trace_flag, 0.01);
// Generate EdgeCloudSim Scenario Factory
ScenarioFactory sampleFactory = new SampleScenarioFactory(j, SS.getSimulationTime(), orchestratorPolicy, simScenario);
// Create NewMobilityModel instance
NewMobilityModel customMobilityModel = new NewMobilityModel(j, SS.getSimulationTime());
customMobilityModel.initialize();
// Simulate device locations and print them for each device and time
double simulationTime = SS.getSimulationTime();
for (double time = 0; time < simulationTime; time += 1.0) { // 1 second increment
for (int deviceId = 0; deviceId < j; deviceId++) {
Location location = customMobilityModel.getLocation(deviceId, time);
if (location != null) {
SimLogger.printLine("Device " + deviceId + " Location at time " + time + ": " + location);
}
}
}
// Generate EdgeCloudSim Simulation Manager
SimManager manager = new SimManager(sampleFactory, j, simScenario, orchestratorPolicy);
// Start simulation
manager.startSimulation();
} catch (Exception e) {
SimLogger.printLine("The simulation has been terminated due to an unexpected error");
System.exit(0);
}
Date ScenarioEndDate = Calendar.getInstance().getTime();
now = df.format(ScenarioEndDate);
SimLogger.printLine("Scenario finished at " + now + ". It took " + SimUtils.getTimeDifference(ScenarioStartDate, ScenarioEndDate));
SimLogger.printLine("----------------------------------------------------------------------");
} // End of orchestrators loop
} // End of scenarios loop
} // End of mobile devices loop
Date SimulationEndDate = Calendar.getInstance().getTime();
now = df.format(SimulationEndDate);
SimLogger.printLine("Simulation finished at " + now + ". It took " + SimUtils.getTimeDifference(SimulationStartDate, SimulationEndDate));
}
}
NewMobilityModel.java: package EdgeApplication;
import edu.boun.edgecloudsim.core.SimSettings;
import edu.boun.edgecloudsim.mobility.MobilityModel;
import edu.boun.edgecloudsim.utils.Location;
import edu.boun.edgecloudsim.utils.SimLogger;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
public class NewMobilityModel extends MobilityModel {
private List> treeMapArray;
public NewMobilityModel(int numberOfMobileDevices, double simulationTime) {
super(numberOfMobileDevices, simulationTime);
}
public void initialize() {
SimLogger.printLine("Initializing custom mobility model for devices...");
// Initialize treeMapArray with dummy data or real mobility model data
treeMapArray = new ArrayList<>();
for (int i = 0; i < numberOfMobileDevices; i++) {
TreeMap deviceLocations = new TreeMap<>();
for (double time = 0; time <= SimSettings.getInstance().getSimulationTime(); time += 1.0) { // 1 second increment
// Simulate a random location for each device at each time step
double x = Math.random() * 100; // Random x-coordinate
double y = Math.random() * 100; // Random y-coordinate
Location location = new Location();
deviceLocations.put(time, location);
}
treeMapArray.add(deviceLocations);
}
}
public Location getLocation(int deviceId, double time) {
if (deviceId < 0 || deviceId >= treeMapArray.size()) {
SimLogger.printLine("Invalid device ID: " + deviceId);
return null;
}
TreeMap treeMap = treeMapArray.get(deviceId);
Map.Entry entry = treeMap.floorEntry(time);
if (entry == null) {
SimLogger.printLine("No location found for device '" + deviceId + "' at time " + time);
return null;
}
return entry.getValue();
}
}