GreenSimJ原创GreenSimJ原创遗传算法解决车辆路径

上传人:工**** 文档编号:511572656 上传时间:2023-12-17 格式:DOC 页数:22 大小:55KB
返回 下载 相关 举报
GreenSimJ原创GreenSimJ原创遗传算法解决车辆路径_第1页
第1页 / 共22页
GreenSimJ原创GreenSimJ原创遗传算法解决车辆路径_第2页
第2页 / 共22页
GreenSimJ原创GreenSimJ原创遗传算法解决车辆路径_第3页
第3页 / 共22页
GreenSimJ原创GreenSimJ原创遗传算法解决车辆路径_第4页
第4页 / 共22页
GreenSimJ原创GreenSimJ原创遗传算法解决车辆路径_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《GreenSimJ原创GreenSimJ原创遗传算法解决车辆路径》由会员分享,可在线阅读,更多相关《GreenSimJ原创GreenSimJ原创遗传算法解决车辆路径(22页珍藏版)》请在金锄头文库上搜索。

1、GreenSim.J原创】GreenSim.J原创】遗传算法解决车辆路径问题(VRP)(2007-08-29 11:22:12) 标签:知识/探索 关于遗传算法博客里已经很多了,这次贴个c的代码,下面的源代码是解决车辆路径问题的。谈一点经验性的东西,就是在进行染色体交叉时,一定要注意基因结构的问题。根据具体应用情况,尽量要保证好的基因结构遗传到后代中。其实此时的交叉变异等所有的操作,考虑的是基因结构,而不是单个的基因。所以在设计编码方式时就要考虑到设计出良好的基因结构。便于分割和组合的结构是好的设计。 部分源程序:()/* 最优化函数 */void GAOptim( float *vData,

2、 float vP, int vGenNum, int *pBestGen ) int vFlockSize = FLOCKSIZE ; int GENNUM = vGenNum ; float P = vP ; int vLen = LEN ; int MotherFlockFLOCKSIZELEN ; int FatherFlockFLOCKSIZELEN ; int ChildFlock2*FLOCKSIZELEN ; int mBestGenLEN ; int mCounter, mCounter1 ; int *pTemp1; /产生初始种群 for( mCounter1 = 0 ;

3、 mCounter1FLOCKSIZE ; mCounter1+ ) pTemp1 = MotherFlockmCounter1 ; PermutRnd( LEN , 1 , pTemp1 ) ; for( mCounter1 = 0 ; mCounter1FLOCKSIZE ; mCounter1+ ) pTemp1 = FatherFlockmCounter1 ; PermutRnd( LEN , 1 , pTemp1 ) ; PermutRnd( LEN , 1 , mBestGen ) ; / 初始化最优种群 for( mCounter = 0 ; mCounter GENNUM ;

4、mCounter+ ) /交叉 GenCross( MotherFlock,FatherFlock,ChildFlock,vData ) ; /遗传 GenHeri( MotherFlock,FatherFlock,ChildFlock,mBestGen,vData ) ; /变异 GenAber( MotherFlock,FatherFlock,mBestGen,vP,vData ) ; for( mCounter = 0 ; mCounter vLen ; mCounter+ ) *( pBestGen + mCounter ) = mBestGenmCounter ; return ;

5、/* 交叉子函数 */void GenCross( int *MotherFlock, int *FatherFlock,int *ChildFlock, float *vData ) int mCounter, mCounter1, mCounter2, mCounter3 ; int mIndex = 0 ; int mCrossLen1 = 0 , mCrossLen2 = 0 ; int mCrossFlag = 0 ; int mMoFkTemp1LEN, mMoFkTemp2LEN, mFaFkTemp1LEN, mFaFkTemp2LEN ; int mMotherFlockFL

6、OCKSIZELEN , mFatherFlockFLOCKSIZELEN ; int mChildFlock2*FLOCKSIZELEN ; int mIndex1LEN, mIndex2LEN ; int *pMo, *pFa, *pChid ; pMo = mMotherFlock0 ; pFa = mFatherFlock0; pChid = mChildFlock0 ; for(mCounter = 0 ; mCounterFLOCKSIZE*LEN ; mCounter+) *( pMo + mCounter ) = *( MotherFlock + mCounter ) ; *(

7、 pFa + mCounter ) = *( FatherFlock + mCounter ) ; for( mCounter = 0 ; mCounterFLOCKSIZE ; mCounter+ ) /* 进行双亲双子交叉 */ / 产生交叉点 mIndex = floor( UniRnd()*LEN ) ; / 根据交叉点,寻找两段合适的遗传序列 for( mCounter1 = 0 ; mCounter1LEN ; mCounter1+ ) / 数组初始化 mMoFkTemp1mCounter1 = 0 ; mMoFkTemp2mCounter1 = 0 ; mFaFkTemp1mCo

8、unter1 = 0 ; mFaFkTemp2mCounter1 = 0 ; / 存储四段序列 for( mCounter1 = 0,mCounter2 = 0,mCounter3 = 0 ; mCounter1LEN ; mCounter1+ ) if(mCounter1mIndex) mMoFkTemp1mCounter2 = mMotherFlockmCountermCounter1 ; mFaFkTemp1mCounter2 = mFatherFlockmCountermCounter1 ; mCounter2+ ; else mMoFkTemp2mCounter3 = mMother

9、FlockmCountermCounter1 ; mFaFkTemp2mCounter3 = mFatherFlockmCountermCounter1 ; mCounter3+ ; mCrossLen1 = mIndex - 1 ; mCrossLen2 = LEN - mCrossLen1 ; / 将两段好的序列放在mMoFkTemp1,mMoFkTemp2中,差的放在mFaFkTemp1,mFaFkTemp2中 mCrossFlag = BestChip(mMoFkTemp1,mMoFkTemp2,mFaFkTemp1,mFaFkTemp2,mCrossLen1,mCrossLen2,v

10、Data) ; / 根据两段序列构造完整基因,存放在子代中 PermutRnd( mCrossLen1 , 1 , mIndex1 ) ; / 产生补充基因的随机数 PermutRnd( mCrossLen2 , 1 , mIndex2 ) ; for( mCounter1 = 0, mCounter2 = 0 ; mCounter1LEN ; mCounter1+ ) if(mCounter1=mCrossLen1) mChildFlock2*mCountermCounter1 = mMoFkTemp1mCounter1 ; if(mCrossFlag=1) /如果交叉成功,则补充基因,否则

11、直接复制到子代 mChildFlock2*mCounter+1mCounter1 = mFaFkTemp1 mIndex1mCounter1 ; else mChildFlock2*mCounter+1mCounter1 = mFaFkTemp1mCounter1 ; else mChildFlock2*mCountermCounter1 = mMoFkTemp2mCounter2 ; if(mCrossFlag=1) mChildFlock2*mCounter+1mCounter1 = mFaFkTemp2 mIndex2mCounter2 ; else mChildFlock2*mCounter+1mCounter1 = mFaFkTemp2mCounter2 ; mCounter

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号