matlab madian,马踏棋盘——贪心算法( 二 )


给该曾函数标识1;;
else
给当前棋盘号置0;%这就是回溯
end??
end
标识0;
end
程序如下:
[] = (
%HORSE 马踏棋盘-贪心算法
%时间:
%-----------初始化棋盘以及初始位置------------------
=5;
%棋盘横向长度
=5;
%棋盘纵向高度
x=1;%();
y=1;%();
=zeros(,);
Path=[x,y];
%记录马的路径
(x,y)=1;
%标记棋盘第一步位置
count=2;
%标记后从2开始
%-----------开始计算路径----------------------------
=clock;
[,mark]=track(x,y,count,);
%计算解集 , 输出标志位 , 以及棋盘标号
=etime(clock,);
%------------判断是否获得可用路径-------------------
if(mark==1)
%------------将中标号转换到Path中路径---------
for k=2:size(,1)*size(,2)
mpos=find(==k);
r=rem(mpos,size(,1));
if(r==0)
r=size(,1);
end
Path=[Path;r (mpos-r)/size(,1)+1];
end
%------------绘制棋盘以及马走过的路径----------------
hold on
plot(Path(1,1)+0.5,Path(1,2)+0.5,'or');
plot(Path(:,1)+0.5,Path(:,2)+0.5,'*');
plot(Path(:,1)+0.5,Path(:,2)+0.5,'g');
plot(Path(size(Path,1),1)+0.5,Path(size(Path,1),2)+0.5,'ob');
for j=1:+1
plot(j*ones(1,+1),1:+1,'r');
plot(1:+1,j*ones(1,+1),'r');
end
hold off
disp(['计算所需时间为: ' ()
's']);
else
disp(['当x=' (x) ',y=' (y) '
无解!']);
end
end
[,mark]=track(x,y,count,)
%查找当前子节点 , 并进入代价最小的子节点
%---------------设置节点初始条件--------------------------------
mx1=x;
my1=y;
【matlab madian,马踏棋盘——贪心算法】pCost=[];
=size(,1)*size(,2);
%--------------找出有效子节点-----------------------------------
=(mx1,my1,);
%找出周围不超过边界的点
=(,);
%找出还未走过的店
=size(,1);
if(count>5)
y=1;
end
%--------------判断是否存在子节点--------------------------------
if(~=0)
%----------如过存在子节点 , 且当前标号为 , 那么就得到最终解 , 返回标志位1--
if(count==)
((1,1),(1,2))=count;
mark=1;

matlab madian,马踏棋盘——贪心算法

文章插图
=;
;
end
%-------------否则 , 计算各子节点代价函数,即每个节点出口数量---------------
for j=1:
=((j,1),(j,2),);
pCost=[pCost,];
end
%-------------将子节点按照出口数量递增排序 , 以便进行局部最优搜索-------------------
[,]=sort(pCost);
=(,:);
%-------------依次搜索每个子节点 , 并给当前结点标号----------------------------------
for m=1:
tx=(m,1);
ty=(m,2);
(tx,ty)=count;
[borad,]=track(tx,ty,count+1,);
%-------------如果找到了最终路径 , 那么得到=1 , 继续返回成功标志位1--------------
if(==1)
mark=1;
=borad;
;
else
%------------如果不成功 , 就将当前结点置0 , 结束当前结点搜索 , 程序就相当于回溯到上一状态继续------
(tx,ty)=0;
end
end
end
%------------如果没有 , 则代表不成功 , 那么返回标志位0--------------------------
mark=0;
=;
end
Pos=(pos,)
%检查点是否走过,即已经被标注过
Pos=[];
for
i=1:size(pos,1)