粒子群算法(PSO)

理论:

粒子群优化算法(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
  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
粒子群算法(Particle Swarm Optimization,PSO)是一种基于群体智能的优化算法,灵感来源于鸟觅食行为。O通过模拟鸟群中个体之的协作与信息共享,来寻找最优解。 在PSO中,将待优化问题看作是一个多维空间中的搜索问题算法通过维护一群粒子(particles),每个子代表一个潜在解。每个粒子都有己的位置和度,并根据自身历史经验和群体经验进行位置的更新。 PSO的基本思想是,每个粒子根据自身历史最优解(局部最优解)和整个群体历史最优解(全局最优解)来调整自己的速度和位置。具体而言,每个粒子根据自身的速度和位置信息,以及全局最优解的引导,更新自己的速度和位置。通过不断迭代更新,粒子群逐渐收敛于最优解。 PSO算法的核心公式如下: v_i(t+1) = w * v_i(t) + c1 * rand() * (pbest_i - x_i(t)) + c2 * rand() * (gbest - x_i(t)) x_i(t+1) = x_i(t) + v_i(t+1) 其中,v_i(t)表示粒子i在时刻t的速度,x_i(t)表示粒子i在时刻t的位置,pbest_i表示粒子i的历史最优解,gbest表示整个群体的历史最优解,w、c1、c2为算法的参数,rand()为随机函数。 PSO算法具有以下特点: . 简单易实现:PSO算法的原理简单,易于理解和实现。 2. 全局搜索能力:通过群体信息共享和协作,PSO能够在搜索空间中进行全局搜索,有较好的收敛性能。 3. 适应性强:PSO算法对问题的约束条件和目标函数形式没有特殊要求,适用于各种类型的优化问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值