【数学建模】CUMCM-2011B model5 围捕方案确定

来源:互联网 发布:四知文言文翻译注解 编辑:程序博客网 时间:2024/06/05 17:58

思路

这题思路就……蛮简单的。求出不同的时间包围嫌疑人需要的包围圈,然后对ACF三个区的警力进行调配。

之所以是ACF……求了一下(目测了一下)其他几个区可以很安稳地堵上从A过来的路。

然后就是艰难的码代码……


具体实现

基础假设:

假设一:逃犯车速与警车相近。
假设二:逃犯与警察信息不公开,即不能根据对方的位置来规划线路。
假设三:当逃犯不存在通往外市的无警力路线的时候,视为围堵成功。
假设四:围堵成功时,从事发地能够抵达的最远位置为围堵需要时间。
假设五:出现警察和逃犯同时抵达某地的临界状态,视为围堵失败。

计算过程:

计算在t时间如果想要包围逃犯所需要的包围圈。
在这里利用类似于数学形态学运算的方法来计算和规定包围圈。

第一步计算在规定时间内能到达的位置。
体现在这个问题上,是计算出距离案发地的距离在60km/h * t内的点。

第二步再进行一次膨胀,与原图做差可以求出包围圈。
对于在前面的问题中求出的所有位置,求与他们直接连通的位置,然后再求差。
利用类似于模型二的方法计算是否存在可行的规划。

一、假设逃犯不逃离A区域。

求得逃犯能逃离区域
图中绿色是警察在5.7min内能封锁的区域,绿色是逃犯在8.9min内能达到的区域。

这里写图片描述

在不考虑A区域与其他区域连通的情况下,可以认为此时逃犯被封锁,无法危害到更多的地区。

二、

通过对各个区域内部的调配,D、E区可以有充足的时间封闭与案发地可能连通的路径。在这里不额外说明。
图中黑色的点为逃犯在7.766595分钟内能够到达的所有路口,
红色的点为警察在4.66717分钟内能够形成的包围圈。
至此可以认为逃犯被成功围堵。

这里写图片描述
(智障队友没给我连上区域之间的线……)

再次判断逃犯在这段时间内确实不会进入BED区域,不需要对这些地区的警力进行调整并且不会涉及到出入市区的路口。

逃犯到各个顶点的距离:【略】

平台调度方案:【略】

在这种情况下,如果逃犯的运动一直是远离事发地的话,最晚被逮捕的点在248处,所需要时间为18.9s。

局限性分析:
无法保证得出的解是最优解,甚至在非真实情况下,有可能出现错过可能解的情况。

比如下图,红色为案发地,黑圈为交警平台的位置,用这种算法无法正确的判定是否完成围堵,甚至会判定无法在现有情况下完成围堵。
这里写图片描述

优化:
在这种情况下,求出的解应该是一个下界,对于出现警察平台在包围圈内需要向外移动的情况时,应该考虑是否存在更优解。
所有的点可以分成三类:一类是在这段时间内无法进入包围圈区域,这一类对模型的优化不起到作用,是无关点;二是形成包围圈的点,称为有效点;三是不形成包围圈但是可以进入圈内的点,称为闲置点。比较明显的,在这里3~10、15、16平台在最后形成的包围圈内,其中除了3和4在最后的优化中提出了向外侧移动的要求,这两个点之外,其他点都为第三类点。它们对于时间的优化影响最大。
想要尽快封锁,应该对从逃犯到他最晚到达的封锁点进行处理。这里提出一种贪婪算法。
对于从案发地到达最远的封锁点上的路线,找到现有的闲置点中能够比逃犯优先到达这条路线上的点。如有多个这样的点取离案发地最近的点。将这个点从逃跑路线上去除,将这个平台移出闲置点队列。
移去这个点后(就是逃犯一旦经过这个点直接被逮捕),重新计算从案发地到各地的距离,重新用上述算法计算包围圈。重复这个过程直到没有闲置点能够满足比逃犯优先到达最长逃跑线路上这个条件。

此外如果出现,逃犯能够抵达出入市区的路口的时候,应该对这种情况优先加以限制。


反思

(如上零散的行文风格被队友嫌弃了很久)
还有没写出来的问题就是,我的指派问题求解是,求出和最小的(然后多求俩次取最大值最小)但这个结果不一定是最大值最小的那个解(有点绕)、不知道如果能求出来的话会怎么样

这一题做完之后看优秀论文的思路比我的要好、
这里写图片描述

现在想到的优秀论文那种求解方法、对于所有警察局,设置他能比逃犯先到的代价为0,比逃犯后到的代价为1.然后对一堆的点求指派,对于没法到达的点向外扩充,再一次求指派,这样求出来的解应该会比我的那种算法优秀。


代码

给求包围圈的代码

clc;clear;load('ADMatrix.mat'); % 距离矩阵load('ANMatrix.mat'); %01 是否相邻D_32 = ADMatrix(32,:);t_main = [];t_temp = 30;clo = [];m = 92;for i = 1:m-1   t_main = [t_main , t_temp];  %迭代   distance = t_temp;   clo_1 = D_32 <= distance;     % all the place can reach   clo_extend = clo_1;   for i1 = 1:m       if 1 == clo_1(i1)           clo_extend =  clo_extend + ANMatrix(i1,:);       end   end   clo_extend  = clo_extend > 0;   clo_extend = clo_extend - clo_1;   clo = [clo;clo_extend];   min_clo = [];   for i1 = 1:m       if 1 == clo_extend(i1)           min_clo =  [min_clo , D_32(i1)];       end   end   t_temp = min(min_clo);   if(isempty(t_temp))       break;   endend% clo 最后需要的闭包% t_main 各阶段的事件,和闭包对应
阅读全文
0 0