MATLAB规划城市之间的最短投递邮路

发布于:2022-12-24 ⋅ 阅读:(476) ⋅ 点赞:(0)

任意选择10个全国省会城市,并标注各个城市之间的距离,使用MATLAB对相应的10个城市进行拓扑图的绘制。通过列出相应算法的设计思路及方案,实现邮件投递的最短邮路。

  • 算法及数学模型

  • 设计思路:将邮件从昆明出发送达每一个城市,使之邮递路线最短,由此选择TSP算法进行代码实现。

    任意选择十个城市并列出距离矩阵

  • 1、昆明 2、成都 3、上海 4、天津 5、厦门 6、北京 7、武汉 8、杭州 9、西安 10、深圳

1

2

3

4

5

6

7

8

9

10

1

  

817

2342

2584

1959

2590

1558

2157

1487

1441

2

817

1968

1877

1978

1804

1143

1890

744

1711

3

2342

1968

1083

1012

1213

824

177

1375

1455

4

2584

1877

1083

1945

134

1148

1199

1098

2164

5

1959

1978

1012

1945

2012

966

875

1737

577

6

2590

1804

1213

134

2012

1154

1260

1070

2169

7

1558

1143

824

1148

966

1154

732

780

1107

8

2157

1890

177

1199

875

1260

732

1330

1273

9

1487

744

1375

1098

1737

1070

780

1330

1730

10

1441

1711

1455

2164

577

2169

1107

1273

1730

  • 测试结果

算法代码

Test

function dis = test(arc,w)

name={'昆明','成都','上海','天津','厦门','北京','武汉','杭州','西安','深圳'};

    n=length(arc);

        edgeCount=1;TSPLength=0;

        flag=1:n; %初始化了一个flag,用来记录哪些点被遍历过

        flag(:)=0; %表示所有点都还未被走过

        u=w;

        flag(w)=1; %用来标识起点

        fprintf(char(name(1)))

        while edgeCount<n

            min=10000;

            for j=1:n

                if(flag(j)==0 && arc(u,j)~= inf && arc(u,j)<min)

                    v=j; min=arc(u,j);

                end           

            end

            TSPLength=TSPLength+arc(u,v);

            flag(v)=1;

            edgeCount=edgeCount+1;

            fprintf('-->')

             fprintf(char(name(v)))

            u=v;

        end  

        fprintf('\n')

        fprintf('最短路径长度为:')

       TSPLength

end

Test1

clear all

clc

%%MATLAB期末作业——从昆明出发将邮件送往10个城市,规划一条投递线路是邮路最短

%绘制10个城市的拓扑结构(根据地图比例及几何坐标绘制),标注出必要的各个城市的距离

%%利用TSP算法求最小路径

disp('选定城市——1 昆明 2 成都 3 上海 4 天津 5 厦门 6 北京 7 武汉 8 杭州 9 西安 10 深圳')

 tic

    arc(1,1)=inf;arc(1,2)=817;arc(1,3)=2342;arc(1,4)=2584;arc(1,5)=1959;

    arc(1,6)=2590;arc(1,7)=1558;arc(1,8)=2157;arc(1,9)=1487;arc(1,10)=1441;

    arc(2,:)=[817,inf,1968,1877,1978,1804,1143,1890,744,1711];

    arc(3,:)=[2342,1968,inf,1083,1012,1213,824,177,1375,1455];

    arc(4,:)=[2584,1877,1083,inf,1945,134,1148,1199,1098,2164];

    arc(5,:)=[1959,1978,1012,1945,inf,2012,966,875,1737,577];

    arc(6,:)=[2590,1804,1213,134,2012,inf,1154,1260,1070,2169];

    arc(7,:)=[1558,1143,824,1148,966,1154,inf,732,780,1107];

    arc(8,:)=[2157,1890,177,1199,875,1260,732,inf,1330,1273];

    arc(9,:)=[1487,744,1375,1098,1737,1070,780,1330,inf,1730];

    arc(10,:)=[1441,1711,1455,2164,577,2169,1107,1273,1730,inf];

    disp('经过赋值后的邻接矩阵为:')

        arc

    

    disp('最短路径为:')

test(arc,1)

t1=toc

    s = [1,1,1,1,1,1,1,1,1,...

         2,2,2,2,2,2,2,2,...

         3,3,3,3,3,3,3,...

         4,4,4,4,4,4,...

         5,5,5,5,5,...

         6,6,6,6,...

         7,7,7,...

         8,8,...

         9];

    t = [2,3,4,5,6,7,8,9,10,...

         3,4,5,6,7,8,9,10,...

         4,5,6,7,8,9,10,...

         5,6,7,8,9,10,...

         6,7,8,9,10,...

         7,8,9,10,...

         8,9,10,...

         9,10,...

         10];

    

    arc1=[817,2342,2584,1959,2590,1558,2157,1487,1441,...

          1968,1877,1978,1804,1143,1890,744,1711,...

          1083,1012,1213,824,177,1375,1455,...

          1945,134,1148,1199,1098,2164,...

          2012,966,875,1737,577,...

          1154,1260,1070,2169,...

          732,780,1107,...

          1330,1273,...

          1730];    

      

    name={'昆明','成都','上海','天津','厦门','北京','武汉','杭州','西安','深圳'};

    G=graph(s,t,arc1,name);

    plot(G,'EdgeLabel',G.Edges.Weight,'LineWidth',2);

    p=plot(G)

    T=minspantree(G);

highlight(p,T,'EdgeColor','red','LineWidth',3)

clear all

tic

  max=inf;    

    arc(1,1)=max;arc(1,2)=817;arc(1,3)=2342;arc(1,4)=2584;arc(1,5)=1959;

    arc(1,6)=2590;arc(1,7)=1558;arc(1,8)=2157;arc(1,9)=1487;arc(1,10)=1441;

    arc(2,:)=[817,max,1968,1877,1978,1804,1143,1890,744,1711];

    arc(3,:)=[2342,1968,max,1083,1012,1213,824,177,1375,1455];

    arc(4,:)=[2584,1877,1083,max,1945,134,1148,1199,1098,2164];

    arc(5,:)=[1959,1978,1012,1945,max,2012,966,875,1737,577];

    arc(6,:)=[2590,1804,1213,134,2012,max,1154,1260,1070,2169];

    arc(7,:)=[1558,1143,824,1148,966,1154,max,732,780,1107];

    arc(8,:)=[2157,1890,177,1199,875,1260,732,max,1330,1273];

    arc(9,:)=[1487,744,1375,1098,1737,1070,780,1330,max,1730];

    arc(10,:)=[1441,1711,1455,2164,577,2169,1107,1273,1730,max];

    names={'昆明','成都','上海','天津','厦门','北京','武汉','杭州','西安','深圳'};

     for n=1:3

         fprintf('第%d次检测:\n',n);

         Length=0;

         r=randperm(9)+1;

           Length=Length+arc(1,r(1));

         for i=2:9

               Length=Length+arc(r(i-1),r(i));

         end

         fprintf('   随机选择的路径为:');

          fprintf(char(names(1)))

         for j=2:9

              fprintf('--->')

              fprintf(char(names(r(j))))

         end

         fprintf('\n      随机选择的路径长度为:');

         fprintf('%d\n', Length);

         end

t2=tic

上述城市间距均来自百度地图

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到