多波次导弹发射中的规划问题(一) 网络图绘制及数据整理

前言

2017年研究生数学建模E题目 多波次导弹发射中的规划问题 ,题目围绕着导弹发射的位置选取问题展开。首先讲述了一大堆有关导弹发射的机动策略,以及导弹发射车的运行参数,地图点位分布等等。然后就丢出了下面这样一副网络图,并且在附件中有这些点位的数据。

map

作战区域道路示意图

附件中的坐标信息

很显然,在解答问题之前,需要把网络图复原出来。


需要解决的问题

点位编号

首先这里有一个问题,点位的编号排序问题。

网络图中一共有130个点,其中

  • 待机区域为 D1 ~D2
  • 转载区域为 Z01 ~ Z06
  • 发射区域为 F01 ~ F60
  • 道路节点为 J01 ~ J62
    • J01 ~ J11 为主干道 1
    • J12 ~ J20 为主干道 2
    • J21 ~ J62 为其他道路

按照以上信息,依次排列,将字符与数字对应上。

image

点位编号示例

网络图连接判断

很显然,这是图论的知识,网络图在程序员眼里就是 0 和 1 组成的矩阵,有N个点,就会有一个对应的 N * N 的矩阵,行列索引下会找到一个元素,若等于 0 则表示行列代表的点之间存在连接;否则则不存在连接。

于是我们将130个点,依次判断。找到第一个点,记录其终到点位字符。

点位连接判断

点位文字位置

这里的130个点位,比较紧密,所以点位上的文字需要调整,文字的位置按照水平和竖直对齐方式来定位。这里的对齐是指的文字与点的贴合位置,例如 left 表示文字左侧贴在点位坐标上。

matlab文字对齐方式
对其方式(水平/垂直) 左 /上 中 / 中 右/下
horizontalAlignment left center right
verticalAlignment top middle bottom

通过两种对齐方式任意组合,可以将文字固定在环绕某个点的一周的9个任意位置上。


行车耗时矩阵

整理出网络图连接情况后,即可计算任意两点之间的距离,如果不连接,则距离为无穷;如果是同一个点则距离为0。对于不同的车型 A 、B、C 其运行速度不同,主干道和其他道路速度也不同,具体如下:

发射车基本信息
数量 主干道车速(km/h) 其他道路车速(km/h)
A型车 6 70 45
B型车 6 60 35
C型车 12 50 30

最终参与整个模型的运算时,其实应该是车辆在每个路段的行车耗时数据在参与计算,因此需要解算出每一种型号的车在网络道路的行车耗时矩阵。这里只需要将点位间距离矩阵除以点位间速度矩阵即可(矩阵点除)。


问题解答

基础数据

点击查看基础数据


源码展示

%% 准备存储空间
clc, clear, close all

%% 导入整理的数据
[~,~,point] = xlsread('data','网络图','A2:B131'); % 读取点位序号及编号
[point_locat,~,~] = xlsread('data','网络图','C2:D131'); % 读取点位坐标
[~,point_connect,~] = xlsread('data','网络图','E2:J131'); % 读取点位连接
[~,point_text_place,~] = xlsread('data','网络图','K2:L131'); % 读取点位文字摆放位置

%% 计算连接判断矩阵
is_connect = zeros(130,130); % 记录点位连接判断,0表示不连接,1表示连接
for i = 1:130
    for j = 1:6
        if ~isempty(point_connect{i,j})
            [row,~] = find(strcmp(point, point_connect{i,j})); % 找到当点位的序号
            is_connect(i,row) = 1; % 记录连接情况
        end
    end
end
xlswrite('data',is_connect,'连接判断矩阵');

%% 计算点位间距离
point_distance = pdist2(point_locat,point_locat).*is_connect; %.*triu(ones(m,m),0);
point_distance(point_distance == 0) = inf; % 未连接点位间距离变为无穷大
xlswrite('data',point_distance,'距离矩阵');

%% 点位序号编组
D = [1:2]; % 待机区域点位
Z = [1:6] + 2; % 转载区域点位
F = [1:60] + 2 + 6; % 发射区域点位
J1 = [1:11] + 2 + 6 +60; % 主干道1点位
J2 = [12:20] + 2 + 6 +60; % 主干道2点位
J3 = [21:62] + 2 + 6 + 60; % 普通道路点位

%% 画网络连接图
for k = 1:3
    figure(k);set(gcf,'outerposition',get(0,'screensize'));hold on;
    % 画点位
    hD = plot(point_locat(D,1),point_locat(D,2),'rp','markersize',14,'linewidth',2);
    hZ = plot(point_locat(Z,1),point_locat(Z,2),'g+','markersize',8,'linewidth',2);
    hF = plot(point_locat(F,1),point_locat(F,2),'b^','markersize',8,'linewidth',2);
    hJ = plot(point_locat([J1,J2,J3],1),point_locat([J1,J2,J3],2),'ko','markersize',8,'linewidth',2);
    % 画主干道
    hJ1 =  plot([point_locat(J1(1:10),1),point_locat(J1(2:11),1)],[point_locat(J1(1:10),2),point_locat(J1(2:11),2)],'r-','linewidth',3);
    hJ1 =  plot([point_locat(J2(1:8),1),point_locat(J2(2:9),1)],[point_locat(J2(1:8),2),point_locat(J2(2:9),2)],'r-','linewidth',3);
    % 画连线图
    for i = 1:130
        for j = 1:130
            if is_connect(i,j) == 1
                plot([point_locat(i,1),point_locat(j,1)],[point_locat(i,2),point_locat(j,2)],'k-');
                if k == 3
                    text((point_locat(i,1)+ point_locat(j,1))/2,(point_locat(i,2)+ point_locat(j,2))/2,sprintf('%.1f',point_distance(i,j)));
                end
            end
        end
        if k == 1
            % 点位编号网络图
            text(point_locat(i,1),point_locat(i,2),num2str(point{i,1}),'horizontalAlignment',point_text_place{i,1},'verticalAlignment',point_text_place{i,2},'fontsize',14);
        elseif k == 2
            % 点位序号网络图
            text(point_locat(i,1),point_locat(i,2),point{i,2},'horizontalAlignment',point_text_place{i,1},'verticalAlignment',point_text_place{i,2},'fontsize',14);
        end
    end
    axis([0,300,0,150]);set(gca,'fontsize',24);xlabel('x(km)'),ylabel('y(km)');
    legend('待机地点','转载地点','发射地点','道路节点','主干道');box on
    if k == 1
        print(gcf,'-djpeg','-r300','作战区域道路点位序号网络图.jpg');
    elseif k == 2
        print(gcf,'-djpeg','-r300','作战区域道路点位编号网络图.jpg');
    else
        print(gcf,'-djpeg','-r300','作战区域道路点位距离网络图.jpg');
    end
end



%% 计算车辆在网络图中的耗时
%导入车辆信息
car = xlsread('data','车辆信息','C2:D4'); % 读取车辆行车速度
[~,car_type,~] = xlsread('data','车辆信息','A2:A4'); % 读取车辆型号
main = [J1(1:10),J2(1:8)]; % 主干道序号
% 计算车辆网络行车耗时矩阵
for i = 1:3
    speed = ones(130,130)*car(i,2);
    for j = 1:length(main)
        speed(main(j),main(j)+1) = car(i,1);
    end
    time_cost = point_distance./speed;
    xlswrite('data',time_cost,sprintf('%s耗时矩阵',car_type{i}));
end

运行结果

运行后,将会得到以下几个文件:

  • 作战区域道路点位编号网络图.jpg

作战区域道路点位编号网络图

  • 作战区域道路点位距离网络图.jpg

作战区域道路点位距离网络图

  • 作战区域道路点位序号网络图.jpg

作战区域道路点位序号网络图

  • data.xlsx (扩充了计算结果到基础表)

image


网络图比对与校检

人工获取到的网络连接判断记录时很可能会出现遗漏或者无中生有的情况,为了排除这种失误,可以利用PS将原图和画出的图缩放到一样的大小,降低透明度,重叠到一起,比较是否线条完全重合。

image

网络图比对与校检

## 总结

以上步骤仅仅是问题解答的一个开始,称之为数据整理。必须保证万无一失,否则后续计算全盘皆错!!

posted @ 2019-09-03 21:09  GShang  阅读(2120)  评论(0编辑  收藏  举报