资源

具有线性Cons的二次对象,使用双标准(ga3)

/******************************************************************//*                                                                *//*S A S S A M P L E L I B R A R Y*//**//*名称:ga3*//*标题:具有线性Cons的二次对象,使用双标准(ga3)*//*产品:或*//*系统:所有*//*关键字:或*//*项目:GA*//*数据:*//*                                                                *//*支持:更新:*//*参考:*//*MISC:本地搜索GA章节中的示例3*//*优化*//*                                                                *//******************************************************************//*输入线性约束矩阵*/数据链接;输入A1-A13 b;数据线;2  2  0  0  0  0  0  0  0  1  1  0  0 102  0  2  0  0  0  0  0  0  1  0  1  0 102  0  2  0  0  0  0  0  0  0  1  1  0 10-8  0  0  0  0  0  0  0  0  1  0  0  0  00 -8  0  0  0  0  0  0  0  0  1  0  0  00  0 -8  0  0  0  0  0  0  0  0  1  0  00  0  0 -2 -1  0  0  0  0  1  0  0  0  00  0  0  0  0 -2 -1  0  0  0  1  0  0  00  0  0  0  0  0  0 -2 -1  0  0  1  0  0;/*输入上下限*/数据边界;输入上下;数据线;0  10  10  10  10  10  10  10  10  10 1000 1000  1000  1;title1“双标准约束处理示例”;proc ga lastgen=输出矩阵1=lincon种子=555555数据1=界限诺伐他汀=3;调用SetEncoding(“R13R3”);nvar=13;ncon=9;功能四元组(选中[*],矩阵1[*,*],nvar,ncon);数组x[1]/nosym;数组r[3]/nosym;数组违规[1]/nosym;调用dynamic_array(x,nvar);调用dynamic_array(违规,ncon);调用ReadMember(selected,1,x);总和1=0;do i=1到4;求和1+x[i]-x[i]*x[i];结束;总和2=0;do i=5至13;总和2+x[i];结束;obj=5*总和1-总和2;调用EvaluateLC(矩阵1,违规,sumvio,selected,1);r[1]=对象;r[2]=总和;调用WriteMember(selected,2,r);返回(obj);endsub;调用SetObjFunc('quad',0);子程序更新(popsize);/*寻找pareto最优集*/数组最小值[3]/nosym(-1-10);数组结果[1,1]/nosym;阵列擦伤[1]/nosym;调用dynamic_array(scratch,popsize);调用dynamic_array(结果,popsize,3);/*读取原始目标和约束目标,存储在*解决方案段2,放入阵列*/调用GetSolutions(结果,popsize,2);/*标记帕累托最优集*/调用MarkPareto(scratch,npareto,results,minmax);/*将结果转移到解决方案部分*/do i=1到popsize;结果[i,3]=划痕[i];结束;/*将更新的段2写回解决方案填充*/调用UpdateSolutions(results,popsize,2);/*设置Elite参数以保持前15个pareto最优*解决方案*/如果npareto<16,则致电SetElite(npareto);其他的致电SetElite(15);endsub;call SetUpdateRoutine('update');函数paretocomp(选中[*]);数组成员1[3]/nosym;数组成员2[3]/nosym;调用ReadCompare(selected,2,1,member1);调用ReadCompare(selected,2,2,member2);/*如果一个成员在pareto-optimal集中*而另一个不是,那么它就是*最合适的*/如果(member1[3]>member2[3]),则返回(1);如果(member2[3]>member1[3]),则返回(-1);/*如果两者都在pareto-optimal集中,那么*违反约束最少的那个*是最合适的*/如果(member1[3]=1),则执行;如果member1[2]<=member2[2],则返回(1);返回(-1);结束;/*如果两者都不在pareto-optimal集中,那么*拿占主导地位的那个*/if(成员1[2]<=成员2[2])&(成员1[1]<=成员2[1])然后返回(1);if(成员2[2]<=成员1[2])&(member2[1]<=member1[1])然后返回(-1);/*如果两者都不占主导地位,则认为适合度为*相同*/返回(0);endsub;call SetSel('tournament','size',2);调用SetCompareRoutine('paretocomp');/*设置交叉参数*/子程序Cross1(选定的[*],alpha);调用Cross(选中,1,'twopoint',alpha);endsub;调用SetCrossRoutine('Cross1',2,2);α=0.5;调用SetCrossProb(0.8);/*设置变异参数*/子程序Mut1(选定[*],增量[*]);调用突变(selected,1,'delta',delta,1);endsub;调用SetMutRoutine('Mut1');阵列增量[13]/非对称(0.5.5.5.5.5.5.5.5.5100.1);调用SetMutProb(0.05);/*初始化第一个填充*/调用SetBounds(下,上);popsize=100;call Initialize('DEFAULT',popsize);调用ContinueFor(500);运行;退出;