遗传算法有一个最大的特点就是能狗进行快速的全局搜索,所以遗传算法收敛速度快,进化时间段,但是遗传算法没有正反馈和负反馈机制,以至于遗传算法在进行金华市有很长时间都只在做无用的进化和验算。蚁群算法具有正反馈机制,能够机制的将进化的信息反馈到下一轮的进化中,但是缺点就是收敛速度慢,而且全局搜索能力较差,如果将这两种进化算法结合寄来既能够使用遗传算法的全局搜索能力又能够使用蚁群算法的正反馈机制,是否可惜呢?
答案是肯定的。
一般情况下,遗传和蚁群的混合分为两种情况,一种是以遗传为主题的算法,另一种是以蚁群算法为主体的算法,博主正在做Web服务选择的问题,所以想到了使用这种混合的算法去解决打过摸得Web服务选择问题,因为蚁群算法中的alpha、beta和rou直接影响到转移galveston和下一步赢得进化情况,所以这三个参数的选取显得至关重要,在传统的蚁群算法中,这三个参数的选区是依照经验的,没有什么精确地方法去确定这三个值,博主使用遗传算法去优化者三个参数,取得了Web服务选择问题中的优良效果,下面是博主的算法源程序和效果对比图:
package gaaca;
import java.text.DecimalFormat;
import java.util.Random;
public class GAACASelect {
public static int var_num=3;//带求解的变量个数
public static double
alpha_Max=2.0;//蚁群算法中启发因子alpha的最大值,值区间(1.0,4.0]
public static double
beta_Max=4.0;//蚁群算法中期望因子beta的最大值,值区间(1.0,4.0]
public static double
rou_Max=0.01;//蚁群算法中挥发rou的最大值,值区间(0.0,1.0)
public static int popution=10;//遗传算法中,种群大小
public static String []pop=new
String[popution];//存储染色体的编码
public static double []var_value=new
double[3];//在解码时存储变量的值
public static double [][]initpop=new
double[var_num][popution];//存储种群的初始化值
public static double [][]result=new
double[var_num][popution];//种群代表的结果
public static double []fitness=new
double[popution];//用于存储染色体的适应度值
public static double []best_var=new
double[3];//存储最优组合
public static double pc=0.35;//交叉概率
public static double pm=0.08;//变异概率
public static Random random=new
Random();//程序中所有随机数都由它产生
public
static double[]p=new
double[popution];//轮盘赌方法个体适应度概率(按比例的适应度分配)选择概率
public
static double[]q=new double[popution];//q[i]是前n项p之和(累积概率)
public static int[][]class1={//服务类1的决策矩阵
{12 ,16 ,12 ,15 ,15 ,11 ,17 ,16 ,20 ,7 },
{6 ,21 ,3 ,16 ,22 ,9 ,9 ,20 ,22 ,4 },
{6 ,9 ,3 ,5 ,15 ,15 ,18 ,11 ,15 ,5 },
{6 ,21 ,16 ,4 ,16 ,19 ,11 ,17 ,19 ,5 },
{8 ,11 ,18 ,18 ,21 ,4 ,15 ,6 ,22 ,6 }
};
public static int[][]class2={//服务类2的决策矩阵
{9 ,9 ,17 ,12 ,21 ,12 ,22 ,9 ,21 ,9 ,7 ,20 ,3 ,14 ,6 ,5 ,21 ,14 ,16 ,19 },
{3 ,21 ,9 ,4 ,3 ,8 ,5 ,6 ,4 ,7 ,8 ,11 ,18 ,8 ,15 ,19 ,17 ,4 ,3 ,7 },
{17 ,6 ,12 ,6 ,19 ,20 ,18 ,19 ,19 ,11 ,4 ,16 ,22 ,3 ,19 ,18 ,6 ,3 ,17 ,11 },
{8 ,15 ,12 ,7 ,5 ,7 ,17 ,16 ,19 ,5 ,18 ,16 ,4 ,8 ,13 ,8 ,17 ,3 ,14 ,21 },
{9 ,21 ,17 ,19 ,12 ,3 ,12 ,11 ,3 ,9 ,20 ,19 ,5 ,6 ,20 ,6 ,8 ,22 ,14 ,6 }
};
public
static int[][] class3={//服务类3的决策矩阵
{8 ,19 ,4 ,3 ,19 ,22 ,11 ,9 ,18 ,11 ,14 ,18 ,14 ,21 ,15 ,13 ,14 ,18 ,19