理论:
粒子群优化算法(PSO)是一种智能优化算法,也是一种元启发式算法,最初是由Eberhart和Kennedy提出的,其模拟了鸟群捕食行为,通过一定的搜索策略,使得多个粒子在多维搜索空间中寻找最优解。
在云计算调度中,PSO算法可以用于优化虚拟机的调度策略。云计算环境中存在着多种类型的虚拟机资源,每种资源都有其特定的限制和使用成本模型。考虑到虚拟机的计算能力和使用成本等因素,云计算系统需要合理地分配虚拟机资源,以最大化资源利用率和系统效益。
使用PSO算法可以有效地优化虚拟机的调度策略。PSO算法可以在优化目标函数中设置多个参数以权衡资源利用率和系统效益。例如,在优化目标函数中,可以添加CPU利用率和内存利用率等参数,并在优化过程中动态调整各参数的权重以实现最优解的搜索。
PSO算法在云计算调度中的主要作用是优化资源的分配和虚拟机调度策略,从而提高云计算系统的资源利用率和系统效益。
速度向量、位置向量决定了下一次它迭代的位置
本身的最优解和种群的最优解决定下一代
粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动
这些都是初始化,速度随便给,位置要符合约束条件,计算出每个个体的最优值,再通过比较个体之间最优值推出全局最优
本部分的视频链接
代码:
PSOSchedulingTest
/**
* 演示了如何使用粒子群算法调度工作流。
*/
public class PSOSchedulingTest {
/**
* Creates main() to run this example
*/
public static void main(String[] args) {
Log.printLine("Starting PSO scheduing...");
try {
// 第一步: 初始化CloudSim包。它应该叫做在创建任何实体之前。
int num_user = 1; // 云用户的数量
Calendar calendar = Calendar.getInstance();
boolean trace_flag = false; // 平均跟踪事件
// 初始化CloudSim库
CloudSim.init(num_user, calendar, trace_flag);
// 第二步: 创建数据中心。数据中心是CloudSim中的资源提供者。我们需要列出其中一个以运行CloudSim模拟
NetworkDatacenter datacenter0 = createDatacenter("Datacenter_0");
// 第三步: 创建代理
NetDatacenterBroker broker = createBroker();
broker.setLinkDC(datacenter0);
// 第四步: 开始仿真
CloudSim.startSimulation();
/*
* // 最后一步: 模拟结束后打印结果
* List<Cloudlet> newList = broker.getCloudletReceivedList();
*/
CloudSim.stopSimulation();
List<Cloudlet> newList = broker.getCloudletReceivedList();
System.out.println("-----------------");
printCloudletList(newList); //打印内容:“========== OUTPUT ==========”那部分
System.out.println("-----------------");
System.out.println("numberofcloudlet " + newList.size() + " Cached "
+ NetDatacenterBroker.cachedcloudlet + " Data transfered "
+ NetworkConstants.totaldatatransfer);
/*
numberofcloudlet 是云任务的数量。
NetDatacenterBroker.cachedcloudlet 在运行过程中会根据需要进行更新和重新排序,以保持其准确性和可靠性。用于缓存云任务
(cloudlet),以减少数据中心代理(Datacenter Broker)与数据中心(Datacenter)之间的数据交换。通过缓存云任务,数据中心代理
可以更快地检索当前可用的云任务和数据中心,从而更快地调度任务并减少不必要的通信。这个缓存机制可以显著提高系统的效率,并降低通信成
本。在运行过程中会根据需要进行更新和重新排序,以保持其准确性和可靠性。
NetworkConstants.totaldatatransfer 是一个常量,用于表示网络传输的总数据量。它的值是1TB(1 terabyte)。这个常量在模拟过程
中用于限制虚拟机和数据中心之间的网络流量。在 CloudSim 中,虚拟机和数据中心之间的数据传输是通过网络连接模拟的。通过设置这个常量可
以控制系统中的总数据传输量,以便更准确地反映真实环境中的网络性能。需要注意的是,这个常量是一个固定的值,不可以被修改。
*/
// 打印每个用户到每个数据中心的消耗的成本
//datacenter0.printDebts();
System.out.println("Total execution cost:(执行成本) " + NetDatacenterBroker.totalExeCost);
System.out.println("Total transfer cost:(转移成本) " + NetDatacenterBroker.totalTransferCost);
NetDatacenterBroker.totalCost = NetDatacenterBroker.totalExeCost + NetDatacenterBroker.totalTransferCost;
System.out.println("Total cost:(总成本) " + NetDatacenterBroker.totalCost);
Log.printLine("CloudSimExample1 finished!");
} catch (Exception e) {
e.printStackTrace();
Log.printLine("Unwanted errors happen");
}
}
private static NetworkDatacenter createDatacenter(String name) {
// 创建数据中心
// 以下是创建PowerDatacenter所需的步骤:
// 1: 我们需要创建一个列表来存储我们的机器
List<NetworkHost> hostList = new ArrayList<NetworkHost>();
// 2:一台机器包含一个或多个PEs(Processing Element,通常是指一台计算机中的 CPU) 或 CPUs/Cores
// 在本例中,它将只有一个核心(一个CPU)
List<Pe> peList = new ArrayList<Pe>();
int mips = 1000;// 虚拟机的处理速度
// 3. 创建pe并将其添加到列表中。
peList.add(new Pe(0, new PeProvisionerSimple(mips))); // 需要储存设置id和MIPS
// 4. 使用主机id和pe列表创建Host,并将它们添加到列表中命令行
int ram = 2048; // host memory (MB) 主机内存(临时存储) 内存
long storage = 1000000; // host storage 主机存储设备(永久存储) 硬盘
int bw = 10000; // 带宽
int hostNumber = 4;// 主机数量
/*
在 CloudSim 中,hostNumber 是一个标识符,用于表示主机的编号。在一个模拟系统中,可能会有多台主机同时运行。为了对它们进行区分,
每台主机都有一个唯一的编号,即 hostNumber。在 CloudSim 中,可以通过以下方式获取主机的 hostNumber:
int hostNumber = host.getId();
这个方法返回主机的唯一标识符,即 hostNumber。需要注意的是,hostNumber 不是任意的整数,而是在系统中被分配的唯一编号。因此,不
能手动设置 hostNumber。
*/
for (int index = 0; index < hostNumber; index++) {
// 添加4台机器。这里的hostNumber设置为4
hostList.add(new NetworkHost(index, new RamProvisionerSimple(ram),
new BwProvisionerSimple(bw), storage, peList,
new VmSchedulerTimeShared(peList))); // This is our machine
}
System.out.println();
System.out.println("----------------------");// Initialising...第二行后就来到这里
// 这是我们的机器
/*
创建一个DatacenterCharacteristics对象,该对象存储数据中心的属性:
architecture(架构)、
OS(操作系统)、
list of Machines(机器列表)、
allocation policy(分配策略:时间或空间共享、时区及其价格(G$/Pe时间单位))
*/
String arch = "x86"; // system architecture
String os = "Linux"; // operating system
String vmm = "Xen";
double time_zone = 10.0; // time zone this resource located 该资源所在的时区
double cost = 3.0; // the cost of using processing in this resource 在此资源中使用处理的成本
double costPerMem = 0.05; // the cost of using memory in this resource 在此资源中使用内存的成本
double costPerStorage = 0.001