QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1665|回复: 2
打印 上一主题 下一主题

[问题求助] MATLAB中的floyd算法优化问题

[复制链接]
字体大小: 正常 放大
[______]        

1

主题

13

听众

157

积分

升级  28.5%

  • TA的每日心情
    擦汗
    2015-9-14 08:05
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    自我介绍
    数模新人一只

    社区QQ达人

    跳转到指定楼层
    1#
    发表于 2014-7-24 11:18 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    本帖最后由 [______] 于 2014-7-24 11:21 编辑

    最近在做2011年mcm国赛B题(交巡警服务平台的配置)
    用到了floyd算法求两节点之间的最短路径。
    在网上找了MATLAB里的floyd函数,在第一问计算A区节点的时候效果很好,大概2分钟就出来了结果,然后同样的代码想算第二问的全市平台配置时就运算不出结果了(没报错但好几个小时都不出结果)。在此向各位前辈高手请教下是哪里出问题了,怀疑是第二问数据量太大而整个程序中的for循环太多了(但也不应该这么久啊,第二问的数据量也不至于比第一问多太多……)
    废话不说上代码了:

    第一问:
    构建邻接矩阵
    clc;
    clear;
    edge=xlsread('A区内部道路联通关系');
    n=92;
    weight=inf*ones(n, n);
    for i=1:size(edge,1)
    weight(edge(i,1),edge(i,2))=edge(i,3);
    weight(edge(i,2),edge(i,1))=edge(i,3);
           weight(i,i)=0
    end

    附录2
    定义floyd函数(n根据A区情况定义)
    %Floyd算法
    %解决最短路径问题,是用来调用的函数头文件
    %输入参数a是求图的带权邻接矩阵,D(i,j)表示i到j的最短距离, %输入参数a是所求图的带权邻接矩阵,i,j起点终点,min1表示i与j最短距离,path1为最短路径
    function[min1]=floyd(a,start,terminal)
    D=a;n=92;path=zeros(92,92);
    fori=1:n;
    forj=1:n;
          ifD(i,j)~=inf;      %不相连路口距离定义为inf

             path(i,j)=j;
          end
    end
    end
    fork=1:n;
    fori=1:n;
    forj=1:n;
             ifD(i,k)+D(k,j)<D(i,j);
                D(i,j)=D(i,k)+D(k,j);
                path(i,j)=path(i,k);
             end
    end
    end
    end
    ifnargin==3
       min1=D(start,terminal);
       m(1)=start;
       i=1;
          whilepath(m(i),terminal)~=terminal;
          k=i+1;                                
          m(k)=path(m(i),terminal);
          i=i+1;
          end
    end
    调用floyd函数对A区道路进行计算
    b=weight
    c=zeros(1840,3); %20个平台*92个路口为1840
    fori=1:20
        forj=1:92
                  c(92*(i-1)+j,=[i,j,floyd(b,i,j)]
        end
    end

    上述程序计算A区路口之间的关系,运行很成功
    然后算第二问时我把邻接矩阵、floyd中的矩阵放大,确再也运行不出了…………
    PS:那些笑脸是冒号和右圆括号……论坛识别为表情了
    floyd函数修改

    function [min1]=floyd(a,Start,terminal)
    D=a;n=size(D,1);path=zeros(n,n);
    主程序①(分不同城区)
    clc;
    clear;
    edge=xlsread('all路口联通关系');
    e=582;
    weight=inf*ones(e,e);
    for s=1:size(edge,1);
        weight(edge(s,1),edge(s,2))=edge(s,3);
        weight(edge(s,2),edge(s,1))=edge(s,3);
    end
    for t=1:582
        weight1(t,t)=0;
    end
    %%
    c=zeros(8244,3);
    b=weight;
    %%
    %a area内部情况
    for i=1:20;
    for j=1:92;
    c(92*(i-1)+j,=[i,j,floyd(b,i,j)];
    end
    end
    %%
    %b area内部情况
    for i=93:100;
    for j=93:165;
            c(1840+73*(i-93)+j-92,=[i,j,floyd(b,i,j)];
    end
    end
    %%
    %c area内部情况
    for i=166:182;
    for j=166:319;
             c(2424+154*(i-166)+j-165,=[i,j,floyd(b,i,j)];
    end
    end
    %%
    %d area内部情况
    for i=320:328;
    for j=320:371;
             c(5042+52*(i-320)+j-319,=[i,j,floyd(b,i,j)];
    end
    end
    %%
    %e area内部情况
    for i=372:386;
    for j=372:474;
             c(5510+103*(i-372)+j-371,=[i,j,floyd(b,i,j)];
    end %%
    %f area内部情况
    for i=475:485;
    for j=475:582;
             c(7055+108*(i-475)+j-474,=[i,j,floyd(b,i,j)];
    end
    end
    主程序②(不分城区582个路口全部一起算)
    clc;
    clear;
    edge=xlsread('all路口联通关系');
    e=582;
    weight=inf*ones(e,e);
    for s=1:size(edge,1);
        weight(edge(s,1),edge(s,2))=edge(s,3);
        weight(edge(s,2),edge(s,1))=edge(s,3);
    end
    for t=1:582
        weight1(t,t)=0;
    end
    c=zeros(338724,3);  %582的平方为3338724
    b=weight1;
    for i=1:size(b,1);
        for j=1:size(b,2);
            c(582*(i-1)+j,=floyd(b,i,j);
        end
    end

    无论是主程序①还是②,运行后都长时间没反应,也不报错……到底是不是for循环太多呢?如果是要怎么提高速度……
    cumcm2011B.doc (13 KB, 下载次数: 0)

    cumcm2011B附件1_A区和全市六区交通网络与平台设置的示意图.doc (100.5 KB, 下载次数: 0)

    cumcm2011B附件2_全市六区交通网路和平台设置的数据表.xls (114 KB, 下载次数: 0)

    all路口联通关系.xls (62 KB, 下载次数: 0)

    A区内部道路联通关系.xls (31 KB, 下载次数: 0)












    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    且生        

    29

    主题

    9

    听众

    1500

    积分

    升级  50%

  • TA的每日心情
    慵懒
    2016-9-24 15:19
  • 签到天数: 412 天

    [LV.9]以坛为家II

    社区QQ达人

    群组学术交流A

    群组学术交流B

    群组2013认证赛B题讨论群组

    群组EXCEL




    复制代码
    楼主改发成代码形式,方便大家看代码,在表情边上有个<>。比如……
    回复

    使用道具 举报

    [______]        

    1

    主题

    13

    听众

    157

    积分

    升级  28.5%

  • TA的每日心情
    擦汗
    2015-9-14 08:05
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    自我介绍
    数模新人一只

    社区QQ达人

    且生 发表于 2014-7-24 21:09
    楼主改发成代码形式,方便大家看代码,在表情边上有个。比如……

    也就一处,没关系吧
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-5-18 00:37 , Processed in 0.549365 second(s), 63 queries .

    回顶部