|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
- %这是用遗传算法解集合覆盖问题的主程序
- %集合覆盖是指:
- %集合S={x1,x2,...,xn}
- %S上有一个集合族F={F1,F2,...Fm},即S包含F,
- %且F覆盖S,即F1UF2U...UFm=S
- %从F中找到一个子集Fi,Fj...Fq,使下式成立
- %min |Fi|+|Fj|+...+|Fq|
- % s.t. FiUFjU...UFq=S
- %主程序调用的函数有:
- %构造子集函数constructSubset(setN,subsetSum)
- %计算一条染色体中所有元素的总和,
- %也就是这条染色体(所代表的子集组合)中所有元素的个数
- %subsetSetSum=setSum(chromosomeGroup,F)
- %判断染色体是否覆盖集合S
- %isCover(chromosome,F,SS)
- %评价染色的函数:
- %valuation=appraisal(chromosomeGroup,F,SS)
- %这个函数通过一条染色体中所有元素的个数与集合S元素个数的差
- %评价染色体的好坏
- %该函数调用
- %subsetSetSum=setSum(chromosomeGroup,F)和
- %isCover(chromosome,F,SS)。
- %选择最优染色体函数:
- %[bestChromosome,leastFunctionError]=best_worstChromosome
- (fatherChromosomeGroup,functionError);
- %误差比较函数:从两个染色体中,选出误差较小的染色体
- %[holdBestChromosome,holdLeastFunctionError]...
- % =compareBestChromosome
- (holdBestChromosome,holdLeastFunctionError,...
- % bestChromosome,leastFuntionError)
- %为染色体定义概率函数,好的染色体概率高,坏染色体概率低
- %p=subsetChromosomeProbability(functionError);
- %按概率选择染色体函数:
- %slecteChromosomeGroup=selecteChromome(fatherChromosomeGroup,p);
- %父代染色体杂交产生子代染色体函数
- %sonChrmosomeGroup=crossChromosome(slecteChromosomeGroup,2);
- %变异函数
- %fatherChromosomeGroup=subsetVarianceCh(sonChromosomeGroup,0.8);
- %主程序运行过程
- %1 初始化
- %2 随机生成初始可能解:染色体
- %3 判定染色是不是解,如果是解,给出结果,结束程序
- %4 评价可能解,即评价染色体
- %5 给染色体赋概率
- %6 按概率选择染色体,同时把最好的染色体保留下来
- %7 染色体杂交,产生子代染色体
- %8 染色体变异:对子代染色修改
- %9 到3
- clear,clc
- setN=30;%setN:集合S中的元素个数
- SS=1:setN;
- subsetSum=10;%subsetN:子集族F中的子集数
- chromosomeGroupN=20;%染色体的条数
- F=constructSubset(setN,subsetSum);%构造子集
- solutionSumError=5;%染色体的冗余定为5,小于5,这条染色体是最小子集覆盖染
- 色体
- circleN=50;
- %构造一个解用来检查算法的有效性
- F{3}=[1 2 3 4 5 6 7];
- F{5}=[8 9 10 11 12 13 14 15];
- F{6}=[16 17 18 19 20 21 22];
- F{9}=[23 24 25 26 27 28 29 30];
- %随机产生一组染色体
- fatherChromosomeGroup=round(rand(chromosomeGroupN,subsetSum));
- holdLeastFunctionError=Inf;%可能解的最小误差的初值
- holdBestChromosome=0;%对应最小误差的染色体的初值
- fatherChromosomeGroup(1,:)=[0 0 1 0 1 1 0 0 1 0];
- %%%%%%%%%%%%%%%%%%开始计算
- compute=1;
- circle=0;
- while compute%开始迭代求解
- circle=circle+1;
- if circle>circleN
- compute=0;
- holdBestChromosome
- holdLeastFunctionError
- functionError
- fatherChromosomeGroup
- end
- %计算染色体的冗余:
- %如果染色体不能覆盖S,冗余=无穷大Inf
- %反之 冗余=染色体中所有元素个数的总和-S中所有元素的个数
- functionError=appraisal(fatherChromosomeGroup,F,SS);
- %%%%%%%%%%%%%2: 根据冗余判定是否是最小集合覆盖
- [solution,minError,isTrue]=isSolutionSubset
- (fatherChromosomeGroup,functionError,solutionSumError);
- %isSolution函数根据误差functionError判定方程是否已经解开,isTrue=1,方
- 程得解。solution是方程的解
- if isTrue==1
- '找到最小集合覆盖'
- solution
- minError
- return%结束程序
- end
- %%%%%%%%%%%%%3:选择最好解对应的最优染色体
- [bestChromosome,leastFunctionError]=best_worstChromosome
- (fatherChromosomeGroup,functionError);
- %%%%%%%%%%%%%4:保留每次迭代产生的最好的染色体
- %本次最好解与上次最好解进行比较,如果上次最好解优于本次最好解,保留上
- 次最好解;
- %反之,保留本次最好解。保留的最好染色体放在holdBestChromosome中
- [holdBestChromosome,holdLeastFunctionError]...
- =compareBestChromosome
- (holdBestChromosome,holdLeastFunctionError,...
- bestChromosome,leastFunctionError);
- %minError
- %solution
- %holdLeastFunctionError
- %%%%%%%%%%%%%%5:把保留的最好的染色体holdBestChromosome加入到染色体群
- 中
- order=round(rand(1)*chromosomeGroupN);
- if order==0
- order=1;
- end
- fatherChromosomeGroup(order,:)=holdBestChromosome;
- functionError(order)=holdLeastFunctionError;
- %%%%%%%%%%%%%%%6:为每一条染色体(即可能解的序号)定义一个概率(关键步骤)
- %%%%%%%%%%%%%%%好的染色体概率高,坏的概率低。依据误差functionError计
- 算概率
- [p,trueP]=subsetChromosomeProbability(functionError);
- if trueP =='Fail'
- '可能解严重不适应方程,请重新开始'
- return%结束程序
- end
- %%%%%%%%%%%%%%%7:按照概率筛选染色体(关键步骤)
- %fa=bin2dec(fatherChromosomeGroup)%显示父染色体
- %从父染体中选择优秀染色体
- %selecteChromosomeGroup=selecteChromosome(fatherChromosomeGroup,p);
- %%%%%%%%%%%%%%%8:染色体杂交(关键步骤)
- %sle=bin2dec(selecteChromosomeGroup)%显示选择出来的解的序号(染色体)
- %用概率筛选出的染色体selecteChromosomeGroup进行杂交,产生子代染色体
- %sonChromosomeGroup=crossChromosome(selecteChromosomeGroup,2);
- %不用概率筛选出的染色体selecteChromosomeGroup进行杂交,而直接用上一代
- (父代)的
- sonChromosomeGroup=crossChromosome(fatherChromosomeGroup,2);
- %cro=bin2dec(sonChromosomeGroup)%显示杂交后的子代染色体
- %%%%%%%%%%%%%%%9:变异
- %不杂交直接变异
- %fatherChromosomeGroup=varianceCh
- (fatherChromosomeGroup,0.1,solutionN);
- %杂交后变异
- fatherChromosomeGroup=subsetVarianceCh(sonChromosomeGroup,0.1);
- end
复制代码 |
|