您所在位置: 网站首页 / 西北工业大学算法设计实验三.doc / 文档详情
西北工业大学算法设计实验三.doc 立即下载
2024-12-13
约3.6千字
约7页
0
21KB
举报 版权申诉
预览加载中,请您耐心等待几秒...

西北工业大学算法设计实验三.doc

西北工业大学算法设计实验三.doc

预览

免费试读已结束,剩余 2 页请下载文档后查看

10 金币

下载文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

实验三:遗传算法VS回溯法
一、问题分析
回溯法可以处理货郎担问题,遗传算法也可以处理货郎担问题,回溯法和遗传算法哪个算法处理货郎担问题效率更高呢?在相同计算时间内,哪个算法得到的解更好呢?
	实现遗传算法,通过随机产生10个不同规模的算例(城市数量分别为10,20,40,80,100,120,160,180,200,500,或者其它规模),比较上次实验实现的回溯法和遗传算法。
二、算法基本思想
1、回溯法
从初始状态出发,搜索其所能到达的所有“状态”,
当一条路走到尽头,再后退一步或若干步,从另外一种状态出发,继续搜索,直到所有的路径都搜索过。这种不断前进、不断回溯寻找解的方法叫回溯法。
回溯法通常将问题解空间组织成“树”结构,采用系统的方法搜索解空间树,从而得到问题解。
搜索策略:
深度优先为主,也可以采用广度优先、函数优先、广度深度结合等。
避免无效搜索策略:
约束函数:在扩展结点处剪去不满足约束条件的子树
界限函数:在扩展结点处剪去得不到最优解的子树

2、遗传算法
首先针对遗传算法要有种群,个体,适应度函数,选择,交叉,变异。对于种群是由若干个个体组成,其中个体的编码可以用走过的每一个城市的路径表示。适应度函数用一个路径的代价的倒数表示。使用轮盘赌的方式进行选择下一代个体。其中轮盘赌的方式可以转换为每一个个体的适应度与种群的适应度的比例进行比较。先随机选择两个个体,根据交叉的概率进行单点交叉,将较优的交叉结果保留下来。接着在种群中选择一个个体,根据变异概率来判断是否变异,将该个体保留,根据生成的子代的个数重复上述的运算。根据指定的代数,重复上述的运算。

三、算法设计
1、回溯法
TSP问题的目的是得到一条路径,即一个解向量(X1,X2...Xn),为排列树问题。
对所有城市进行编号后,按大小顺序存储于数组path中,构造一个交换函数swap();对数组path进行遍历,判断当前城市与目标城市是否连通,若连通,通过swap函数对当前节点和目标城市进行交换,即树的节点拓展。若不连通则恢复,并进入下一次的循环,循环到叶子节点时,判断叶是否与初始节点相连,并计算代价cost是否小于当前最小代价bestc,若小于,则更新bestc,再返回上一节点,知道遍历完树中的所有节点。

核心代码:publicvoidbacktrack(intdepth){//depth深度

if(depth==size){
if(map[path[depth-1]][path[depth]]!=-1&&			map[path[depth]][path[1]]!=-1
&&cost+map[path[depth]][path[1]]<bestc){
bestp=path.clone();
bestc=cost+map[path[depth]][path[1]];
//bestc=cost+a[path[i-1]][path[i]]+a[path[i]][path[1]];
//重复计算了上一边
}
}else{
for(intj=depth;j<=size;j++){
if(map[path[depth]][path[j]]!=-1){
swap(path,depth+1,j);
cost+=map[path[depth]][path[depth+1]];
//System.out.println(Arrays.toString(x)+":"+cost);
backtrack(depth+1);
cost-=map[path[depth]][path[depth+1]];
swap(path,depth+1,j);
}
}
}
}

遗传算法
先设计个体,个体里面用城市的邻接矩阵map[][]表示,当前路径path[],当前路径的代价cost,适应度值。主要方法有随机初始化当前路径,计算路径代价,适应度值的求解。
针对旅行商的问题,设计初始化种群,生成下一代种群,生成下一代种群包含选择,交叉,变异的方法。在交叉的结果会产生同一个城市重复两次,所以需要一个修复方法。

核心代码:
	publicvoidsolve(){
	inti;
	intk;
	//初始化种群
	initGroup();
	//计算初始化种群适应度,Fitness[max]
	for(k=0;k<scale;k++){
		fitness[k]=evaluate(oldPopulation[k]);
		//System.out.println(fitness[k]);
	}
	//计算初始化种群中各个个体的累积概率,Pi[max]
	countRate();
	System.out.println("初始种群...");
	for(k=0;k<scale;k++){
		for(
查看更多
王子****青蛙
实名认证
内容提供者
单篇购买
VIP会员(1亿+VIP文档免费下)

扫码即表示接受《下载须知》

西北工业大学算法设计实验三

文档大小:21KB

限时特价:扫码查看

• 请登录后再进行扫码购买
• 使用微信/支付宝扫码注册及付费下载,详阅 用户协议 隐私政策
• 如已在其他页面进行付款,请刷新当前页面重试
• 付费购买成功后,此文档可永久免费下载
全场最划算
12个月
199.0
¥360.0
限时特惠
3个月
69.9
¥90.0
新人专享
1个月
19.9
¥30.0
24个月
398.0
¥720.0
6个月会员
139.9
¥180.0

6亿VIP文档任选,共次下载特权。

已优惠

微信/支付宝扫码完成支付,可开具发票

VIP尽享专属权益

VIP文档免费下载

赠送VIP文档免费下载次数

阅读免打扰

去除文档详情页间广告

专属身份标识

尊贵的VIP专属身份标识

高级客服

一对一高级客服服务

多端互通

电脑端/手机端权益通用