P. S. 本文中由于没有额外介绍启发式方法,故将ACO算法中每个蚂蚁生成调度方案的方式成为“调度思路设计”以便于理解
-
Abastract
-
ACO (Ant Colony Optimization)是一种较为常用的优化算法,能够通过模拟蚁群觅食行为中信息素机制实现寻优。随着工作流调度要求的不断复杂化,凭借单纯设计调度方案已经无法满足日益增长的需求,那么ACO这样一种“智能”方法,便被应用在了工作流调度中——通过设置基本调度思路,结合ACO信息素机制、迭代,实现最终最优调度方案的获取。本文首先简要介绍了ACO算法的思路,以及将其应用在工作流调度的优点;之后以代码为例,介绍ACO算法在Java语言下的实现;最后分析ACO算法在工作流调度中存在的不足,以及改进方法。
-
1. 什么是ACO算法?
-
本小节将简要介绍ACO算法,并介绍在工作流调度中应用的优点,最后展开介绍ACO算法的流程。
-
1.1. ACO算法概要
-
ACO算法,俗称蚁群算法(Ant Colony Optimization),通过蚁群中各个蚂蚁进行寻优得出一个解空间,在解空间比较得到局部最优,通过信息素机制使得蚂蚁更倾向于沿着局部最优解行进,进而不断迭代得到全局最优解。ACO算法,本质上是一种元启发式算法。
-
ACO算法的提出,是基于对自然界蚁群觅食行为的观察——单个蚂蚁的行为是简单的,然而整个蚁群可以实现一些“智能”的行为。这是因为蚁群内的蚂蚁可以通过信息素机制实现信息传递。经过研究,蚂蚁会在经过的路径上释放“信息素”物质,蚁群内的蚂蚁对“信息素”具有感知能力,它们会沿着“信息素”浓较高的路径搜寻——这形成了一种类似正反馈的机制。经过一段时间,整个蚁群就会沿着最优路径达到食物源。[1]
-
1.2. 使用ACO进行工作流调度的优点?
-
ACO算法一般会比简易启发式算法等调度方法具有优势,并且在ACO算法上进行改进的方法也会比原算法有着一定的进步,那么为什么使用ACO算法或者以ACO算法为基础进行的改进算法会有着较优的效果呢,本小节将对这个问题进行介绍。
-
1.2.1. 能够构建“丰富”的解空间
-
对于一个工作流调度问题,以往的算法仅能生成一个方案,或者生成一个方案后不断调换(swap)任务与计算资源的对应顺序以满足约束条件或达到优化目的;解空间仅有1个或少量可行解。并且调度思路的设计则能够决定了可行解,同时也直接决定了最终生成调度方案。
-
ACO算法能够通过蚁群中每一个蚂蚁生成一个可行解,构建“丰富”的解空间以供选择,这也为效果提升奠定了基础。
-
1.2.2. 具有“智能性”
-
和普通启发式算法等调度算法不同,ACO算法由于能够信息素机制的存在能够在多次迭代中对可行解进行偏好行筛选,调度思路设计中存在的一些偏颇之处可以被迭代过程盖过,可以寻找到“特定”思路之外的方案。
-
但是!这既是优点,也存在不足,因为这一点使得寻优过程是向着一个区域前去的,而这个区域会受思路设计影响,存在寻优区域不够广、不能覆盖最优解等问题。
-
1.3. ACO算法流程
-
本小节将对ACO算法的步骤进行简要介绍,流程图见下:
-
1.3.1. 初始化
-
初始化,即蚁群生成相应数量蚂蚁,同时工作流DAG图中每一条边上信息素进行初始化。一般情况下,每一条边上的信息素浓度会被设定为统一值。
-
1.3.2 蚂蚁生成调度方案
-
蚁群中的每一只蚂蚁都依照1)排序生成任务调度序列;2)根据序列顺序,遵循调度思路设计调度——为每一个任务寻找计算资源上对应时间段进行租用、运行。
-
在1)中,为了模拟蚂蚁探寻的不确定性,会概率地选择下一任务,这里就使用到了信息素浓度和启发式信息;由于启发式信息在工作流确定后就基本确定,所以存在变动的信息素浓度对着路径选择有着重要作用,这也是为什么会在后面步骤进行信息素沉积和蒸发。
-
1.3.3. 可行解比较
-
在一次迭代中生成的所有可行解中,依据满足约束条件、优化效果进行比较,得到局部最优可行解。并与“临时的全局最优解”比较,更新全局最优解。
-
1.3.4. 更新信息素
-
对所有路径等比例进行信息素政法,并对具有全局最优解的路径进行一定的信息素沉积,使蚂蚁在下一次迭代中更倾向于向最优解搜寻。
-
1.3.5. 迭代
-
迭代1.3.2——1.3.4步骤,直至迭代代数达到最大迭代代数,便输出最终的“全局最优解”。
-
2. ACO算法的Java代码
-
本小节将通过代码注释对Java语言下的ACO算法程序进行解读。
-
本代码仅仅展示编写思路,使用代码为仿真程序中截取的代码,请学习者自行编写。
// 导入包
import static java.lang.Math.*;
import java.util.*;
import cloud.workflowScheduling.setting.*;
//此处Scheduler为整个workflow仿真程序中单独便携的调度器组件
public class ACO implements Scheduler {
private static final double ALPHA = 1;//用于蚂蚁在选择下一任务过程中控制信息素浓度的影响因子
private static final double BETA = 2;//用于蚂蚁在选择下一任务过程中控制启发式信息的影响因子
private static final double EVAP_RATIO = 0.8;//每一代路径上信息素浓度挥发比例
private static final int NO_OF_ITE = 50;//最大迭代代数
private static final int NO_OF_ANTS = 20;//蚁群大小——蚁群中蚂蚁个数
private double[][] pheromone;
private double[] heuristic;
private Workflow wf;
private double deadline;//最晚完成时间约束
@Override
public Solution schedule(Workflow wf) {
this.wf = wf;
int size = wf.size();
heuristic