Description: In EdgeCloudSim, modifying the NetworkModel involves creating a custom class that extends the base NetworkModel or its variants like MM1Queue. This allows customization of network behaviors such as delays, bandwidth, and other parameters between devices and edge/cloud servers. Essential methods like initialize(), getUploadDelay(), and getDownloadDelay() can be overridden to configure network properties and data transfer rules. Once implemented, the custom network model is instantiated in the main simulation, influencing device-to-device and edge-to-cloud communication during the simulation.
Sample Code
EdgeNetworkModelChange.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.network.NetworkModel;
import edu.boun.edgecloudsim.utils.SimLogger;
import edu.boun.edgecloudsim.utils.SimUtils;
import edu.boun.edgecloudsim.edge_client.Task;
import org.cloudbus.cloudsim.UtilizationModel;
import org.cloudbus.cloudsim.UtilizationModelFull;
public class EdgeNetworkModelChange {
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;
}
SimSettings SS = SimSettings.getInstance();
if (!SS.initialize(configFile, edgeDevicesFile, applicationsFile)) {
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 {
int num_user = 2;
Calendar calendar = Calendar.getInstance();
boolean trace_flag = false;
CloudSim.init(num_user, calendar, trace_flag, 0.01);
int numberOfMobileDevices = 10; // Example number of devices
// Create new network model instance
NetworkModel customNetworkModel = new newNetworkModel(numberOfMobileDevices, simScenario);
// Initialize the custom network model
customNetworkModel.initialize();
int mobileDeviceId = 1; // Example mobile device ID
int cloudletId = 101; // Cloudlet ID (or task ID)
long cloudletLength = 1000; // Length of the task (in MIPS)
int pesNumber = 1; // Number of processing elements
long cloudletFileSize = 100; // Size of the input file (in KB)
long cloudletOutputSize = 100; // Size of the output file (in KB)
// Create UtilizationModel instances (CPU, RAM, BW)
UtilizationModel utilizationModelCpu = new UtilizationModelFull();
UtilizationModel utilizationModelRam = new UtilizationModelFull();
UtilizationModel utilizationModelBw = new UtilizationModelFull();
// Instantiate the Task class with the constructor you provided
Task task = new Task(mobileDeviceId, cloudletId, cloudletLength, pesNumber,
cloudletFileSize, cloudletOutputSize, utilizationModelCpu,
utilizationModelRam, utilizationModelBw);
double uploadDelay = customNetworkModel.getUploadDelay(1, 2, task); // Example devices: 1 and 2
double downloadDelay = customNetworkModel.getDownloadDelay(10, 20, task); // Example devices: 1 and 2
// Print the results
System.out.println("Upload Delay: " + uploadDelay + " seconds");
System.out.println("Download Delay: " + downloadDelay + " seconds");
// Generate EdgeCloudSim Scenario Factory
ScenarioFactory sampleFactory = new SampleScenarioFactory(j, SS.getSimulationTime(), orchestratorPolicy, simScenario);
// Continue with the simulation setup and execution...
SimManager manager = new SimManager(sampleFactory, j, simScenario, orchestratorPolicy);
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("----------------------------------------------------------------------");
}
}
}
Date SimulationEndDate = Calendar.getInstance().getTime();
now = df.format(SimulationEndDate);
SimLogger.printLine("Simulation finished at " + now + ". It took " + SimUtils.getTimeDifference(SimulationStartDate, SimulationEndDate));
}
}
newNetworkModel.java: package EdgeApplication;
import edu.boun.edgecloudsim.edge_client.Task;
import edu.boun.edgecloudsim.network.MM1Queue;
import edu.boun.edgecloudsim.network.NetworkModel;
public class newNetworkModel extends MM1Queue {
protected int numberOfMobileDevices;
protected String simScenario;
public newNetworkModel(int numberOfMobileDevices, String simScenario) {
super(numberOfMobileDevices, simScenario);
this.numberOfMobileDevices = numberOfMobileDevices;
this.simScenario = simScenario;
}
@Override
public void initialize() {
// Custom initialization of the network model (e.g., setting up links, bandwidth, latency)
// Example: Initialize custom properties, network bandwidth, etc.
System.out.println("Initializing custom network model...");
}
@Override
public double getUploadDelay(int sourceDeviceId, int destDeviceId, Task task) {
// Calculate upload delay from source device to destination device
// Example: Simple model, can be customized
double bandwidth = 10.0; // example bandwidth in Mbps
double distance = Math.abs(sourceDeviceId - destDeviceId); // simple distance model
double delay = distance / bandwidth; // simplistic delay calculation
return delay;
}
@Override
public double getDownloadDelay(int sourceDeviceId, int destDeviceId, Task task) {
// Calculate download delay from source device to destination device
// Example: Same simplistic model for download delay
double bandwidth = 10.0; // example bandwidth in Mbps
double distance = Math.abs(sourceDeviceId - destDeviceId); // simple distance model
double delay = distance / bandwidth; // simplistic delay calculation
return delay;
}
}