竞赛:| 全国大学生数模竞赛 | 全国研究生数模竞赛 | 全国大学生电工数模竞赛 | 美国"MCM/ICM" 竞赛 |
 资讯:| 数学理论 | 交叉学科 | 基础教育 | 考研数学 | 学术动态 | 编程交流 | 网络安全 | 经验技巧 |
 下载:| 数 学 篇 | 算 法 篇 | 建 模 篇 | 编 程 篇 | 数 据 篇 | 软 件 篇 | 考 研 篇 | 交叉学科 |
 视频:| 大学数学 | 大学英语 | 计 算 机 | 法律课程 | 政治课程 | 经济管理 | 数学建模 | 高考数学 |
 功能:| 矩阵论坛 | 学校协会 | 挑 战 赛 | 人才招聘 | 数学问吧 | "MC"理工浏览器 | "MCQ"即时通讯 |

 
会员中心
社区论坛
加入收藏
联系我们
您现在的位置: 数学中国 >> 资讯无限 >> 计算机技术 >> 编程交流 >> 正文
【字体:           ★★
 
Hamilton回路近似算法
作者:风做的云    文章来源:本站原创    点击数:    更新时间:2006-9-10
%clear
%clc
%d=[0 9 inf 3 inf;9 0 2 inf 7;inf 2 0 2 4;3 inf 2 0 inf;inf 7 4 inf 0]
%[d,path]=Hamilton(d)
function [d,path]=Hamilton(A)
[C,t]=dijkstra(A);
a=length(C);
pd=zeros(a);
o=[];
D=[];
for i=1:a
    clear y
    y=0;
    pd(i,i)=1;
    e=sum(pd,2);
    k=[i];
    v=i;
    while e(i,1)        c=find(pd(i,1:length(pd))==0);
        b=C(v,c(1));
        B=c;
        f=B(1);
        if length(c)~=1
            for x=2:length(c)
                if b>C(v,c(x))
                    b=C(v,c(x));
                    f=B(x);              
                end
            end
            k=[k f];
            y=y+b;           
        else k=[k f];
            y=y+b;
        end
        v=f;
        pd(i,f)=1;
        e=sum(pd,2);         
    end
    y=y+C(f,i);
    D=[D y];
    k=[k i];
   o=[o;k];
end
n1=find(D(1:length(D))==min(D));
cl=o(n1,1:length(o));
%“原来路径为cl”
%用二代换法改进寻找的回路
sum2=[];
L=length(cl);
for m1=1:length(n1)  
    flag=1;
    while flag>0
        flag=0;
        for m=1:L-3
            for n=m+2:L-1
                if C(cl(m1,m),cl(m1,n))+C(cl(m1,m+1),cl(m1,n+1))                    flag=1;
                    cl(m1,m+1:n)=cl(m1,n:-1:m+1);
                end
            end
        end
    end
    sum1=0;
    for i=1:L-1
        sum1=sum1+C(cl(m1,i),cl(m1,i+1));
    end
sum2=[sum2  sum1];
end
%路径的表示!
n2=find(sum2(1:length(sum2))==min(sum2));
c2=cl(n2,1:length(cl));
d=min(sum2);
z1={};
path1={};
for m2=1:length(n2)
    for w=1:length(c2)
        z1{m2,w}=num2str(c2(m2,w));
    end
    for w=1:length(c2)-1
        u1=c2(m2,w);
        u2=c2(m2,w+1); 
        z1{m2,w+1}=strrep(z1{m2,w},num2str(c2(m2,w)),t{u1,u2});
    end
    path1{m2}=z1{m2,length(c2)};
end
path=path1;
path=path';
%结果为:
 %    d =
 %        22
 %path=
  %  '1-4-3-2-3-5-3-4-1'
  %  '2-3-4-1-4-3-5-3-2'
  %  '3-2-3-4-1-4-3-5-3'
  %  '4-3-2-3-5-3-4-1-4'
  %  '5-3-2-3-4-1-4-3-5'
文章录入:xuemingrui    责任编辑:madio  
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    推 荐 文 章
    更多内容
     
    热 门 文 章  
    更多内容
     

    费马小定理
    相 关 文 章
    更多内容
     
    没有相关文章
    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 |