深圳杯2020——数学建模模拟赛——C题
文章目录
依赖库
- Google or-tools
- xlrd
- matplotlib
- sys
- numpy
- math
- sympy (符号计算)
- geopy(经纬度换算)
计算公式
感谢大神指点,原方案的经纬度换算有问题,故换成geopy
库来解决
正确版本
def compute_euclidean_distance_matrix(locations):
distances = {}
for fromCounter, fromNode in enumerate(locations):
distances[fromCounter] = {}
for toCounter, toNode in enumerate(locations):
if fromCounter == toCounter:
distances[fromCounter][toCounter] = 0
else:
distances[fromCounter][toCounter] = geodesic(fromNode, toNode).meters
return distances
先前错误版本
-
经度(东西方向)1M实际度:31544206M*cos(纬度)/360°=
31544206 ⋅ cos ( l a t i t u d e = 36 ) / 360 = 708883.29 m / l o n g t i t u d e 31544206\cdot\cos(latitude=36)/360 = 708883.29m/longtitude 31544206⋅cos(latitude=36)/360=708883.29m/longtitude
-
纬度(南北方向)1M实际度:40030173M360°=
40030173 / 360 = 111194.92 m / l a t i t u d e 40030173/360 = 111194.92m/latitude 40030173/360=111194.92m/latitude
第一题
使用first solution strategy获得计算近似解
求得结果
Route:
0 -> 2 -> 1 -> 9 -> 7 -> 6 -> 11 -> 14 -> 15 -> 27 -> 16 -> 13 -> 12 -> 8 -> 10 -> 5 -> 3 -> 28 -> 24 -> 23 -> 29 -> 26 -> 25 -> 18 -> 19 -> 20 -> 17 -> 21 -> 22 -> 4 -> 0
Distance: 12033m
使用guided local search获得最优解
求得结果
Route:
0 -> 2 -> 1 -> 9 -> 7 -> 6 -> 14 -> 11 -> 8 -> 12 -> 15 -> 27 -> 16 -> 13 -> 10 -> 5 -> 3 -> 4 -> 22 -> 28 -> 24 -> 23 -> 21 -> 29 -> 26 -> 25 -> 18 -> 19 -> 20 -> 17 -> 0
Distance: 11469m
第二问:数值解法(numerical)
要使传感器一直工作的最低要求:在移动电源走完一整个回路后,电池容量刚好达到最低要求为最优
假设初始条件:当到达该节点时,剩余电池容量刚好为最低要求
参数定义
- x 1 , x 2 , ⋯ , x 30 x_1,x_2,\cdots,x_{30} x1,x2,⋯,x30:假设每个节点的电池容量
- c 1 , c 2 , ⋯ , c 30 c_1,c_2,\cdots,c_{30} c1,c2,⋯,c30:每个节点的电池消耗速度
- r ( m A / s ) r(mA/s) r(mA/s):电池充电速度
- f f f:最低工作电量
- v ( m / s ) v(m/s) v(m/s):移动充电器移动速度
- d s t dst dst:总路程
等式
- 时间总花费: t t o t = d s t / v + ∑ i = 1 30 ( x i − f ) / r i t_{tot}=dst/v+\sum_{i=1}^{30}{(x_i - f)/r_i} ttot=dst/v+∑i=130(xi−f)/ri
- 电池容量推导: x i = t t o t ⋅ c i + f x_i=t_{tot}\cdot c_i+f xi=ttot⋅ci+f
约束条件
去掉数据中心节点的充电计算
x i = [ d s t / v + ∑ i = 2 30 ( x i − f ) / r i ] ⋅ c i + f x_{i} = [dst/v+\sum_{i=2}^{30}{(x_{i} - f)/r_i}]\cdot c_i+f xi=[dst/v+i=2∑30(xi−f)/ri]⋅ci+f
根据约束条件得出线性方程组
组合结果为一个29*29的矩阵:
[ x 2 ⋮ x 30 ] = [ d s t ⋅ c 2 v + f − f ⋅ c 2 r − ⋯ − f ⋅ c 30 r ⋮ d s t ⋅ c 30 v + f − f ⋅ c 2 r − ⋯ − f ⋅ c 30 r ] + [ x 2 ⋅ c 2 r + ⋯ + x 30 ⋅ c 30 r ⋮ x 2 ⋅ c 2 r + ⋯ + x 30 ⋅ c 30 r ] \left[ \begin{array}{l} \boldsymbol{x}_2\\ \vdots\\ \boldsymbol{x}_{30}\\ \end{array} \right] =\left[ \begin{array}{c} \frac{\boldsymbol{dst}\cdot \boldsymbol{c}_2}{\boldsymbol{v}}+\boldsymbol{f}-\frac{\boldsymbol{f}\cdot \boldsymbol{c}_2}{\boldsymbol{r}}-\cdots -\frac{\boldsymbol{f}\cdot \boldsymbol{c}_{30}}{\boldsymbol{r}}\\ \vdots\\ \frac{\boldsymbol{dst}\cdot \boldsymbol{c}_{30}}{\boldsymbol{v}}+\boldsymbol{f}-\frac{\boldsymbol{f}\cdot \boldsymbol{c}_2}{\boldsymbol{r}}-\cdots -\frac{\boldsymbol{f}\cdot \boldsymbol{c}_{30}}{\boldsymbol{r}}\\ \end{array} \right] +\left[ \begin{array}{c} \frac{\boldsymbol{x}_2\cdot \boldsymbol{c}_2}{\boldsymbol{r}}+\cdots +\frac{\boldsymbol{x}_{30}\cdot \boldsymbol{c}_{30}}{\boldsymbol{r}}\\ \vdots\\ \frac{\boldsymbol{x}_2\cdot \boldsymbol{c}_2}{\boldsymbol{r}}+\cdots +\frac{\boldsymbol{x}_{30}\cdot \boldsymbol{c}_{30}}{\boldsymbol{r}}\\ \end{array} \right] ⎣⎢⎡x2⋮x30⎦⎥⎤=⎣⎢⎡vdst⋅c2+f−rf⋅c2−⋯−rf⋅c30⋮vdst⋅c30+f−rf⋅c2−⋯−rf⋅c30⎦⎥⎤+⎣⎢⎡rx2⋅c2+⋯+rx30⋅c30⋮rx2⋅c2+⋯+rx30⋅c30⎦⎥⎤
化简:
[ x 2 ⋮ x 30 ] = [ d s t ⋅ c 2 v + f − f ⋅ c 2 r 2 − ⋯ − f ⋅ c 30 r 30 ⋮ d s t ⋅ c 30 v + f − f ⋅ c 2 r 2 − ⋯ − f ⋅ c 30 r 30 ] + [ x 2 ⋅ c 2 r 2 + ⋯ + x 30 ⋅ c 30 r 30 ⋮ x 2 ⋅ c 2 r 2 + ⋯ + x 30 ⋅ c 30 r 30 ] \left[ \begin{array}{l} \boldsymbol{x}_2\\ \vdots\\ \boldsymbol{x}_{30}\\ \end{array} \right] =\left[ \begin{array}{c} \frac{\boldsymbol{dst}\cdot \boldsymbol{c}_2}{\boldsymbol{v}}+\boldsymbol{f}-\frac{\boldsymbol{f}\cdot \boldsymbol{c}_2}{\boldsymbol{r}_2}-\cdots -\frac{\boldsymbol{f}\cdot \boldsymbol{c}_{30}}{\boldsymbol{r}_{30}}\\ \vdots\\ \frac{\boldsymbol{dst}\cdot \boldsymbol{c}_{30}}{\boldsymbol{v}}+\boldsymbol{f}-\frac{\boldsymbol{f}\cdot \boldsymbol{c}_2}{\boldsymbol{r}_2}-\cdots -\frac{\boldsymbol{f}\cdot \boldsymbol{c}_{30}}{\boldsymbol{r}_{30}}\\ \end{array} \right] +\left[ \begin{array}{c} \frac{\boldsymbol{x}_2\cdot \boldsymbol{c}_2}{\boldsymbol{r}_2}+\cdots +\frac{\boldsymbol{x}_{30}\cdot \boldsymbol{c}_{30}}{\boldsymbol{r}_{30}}\\ \vdots\\ \frac{\boldsymbol{x}_2\cdot \boldsymbol{c}_2}{\boldsymbol{r}_2}+\cdots +\frac{\boldsymbol{x}_{30}\cdot \boldsymbol{c}_{30}}{\boldsymbol{r}_{30}}\\ \end{array} \right] ⎣⎢⎡x2⋮x30⎦⎥⎤=⎣⎢⎡vdst⋅c2+f−r2f⋅c2−⋯−r30f⋅c30⋮vdst⋅c30+f−r2f⋅c2−⋯−r30f⋅c30⎦⎥⎤+⎣⎢⎡r2x2⋅c2+⋯+r30x30⋅c30⋮r2x2⋅c2+⋯+r30x30⋅c30⎦⎥⎤
转化成 A ⋅ X = b A\cdot X = b A⋅X=b形式:
[ c 2 r − 1 ⋯ c 30 r ⋮ ⋱ ⋮ c 2 r ⋯ c 30 r − 1 ] ⋅ [ x 2 ⋮ x 30 ] = − [ d s t ⋅ c 2 v + f − f ⋅ c 2 r − ⋯ − f ⋅ c 30 r ⋮ d s t ⋅ c 30 v + f − f ⋅ c 2 r − ⋯ − f ⋅ c 30 r ] \left[ \begin{matrix} \frac{\boldsymbol{c}_2}{\boldsymbol{r}}-1& \cdots& \frac{\boldsymbol{c}_{30}}{\boldsymbol{r}}\\ \vdots& \ddots& \vdots\\ \frac{\boldsymbol{c}_2}{\boldsymbol{r}}& \cdots& \frac{\boldsymbol{c}_{30}}{\boldsymbol{r}}-1\\ \end{matrix} \right] \cdot \left[ \begin{array}{l} \boldsymbol{x}_2\\ \vdots\\ \boldsymbol{x}_{30}\\ \end{array} \right] =-\left[ \begin{array}{c} \frac{\boldsymbol{dst}\cdot \boldsymbol{c}_2}{\boldsymbol{v}}+\boldsymbol{f}-\frac{\boldsymbol{f}\cdot \boldsymbol{c}_2}{\boldsymbol{r}}-\cdots -\frac{\boldsymbol{f}\cdot \boldsymbol{c}_{30}}{\boldsymbol{r}}\\ \vdots\\ \frac{\boldsymbol{dst}\cdot \boldsymbol{c}_{30}}{\boldsymbol{v}}+\boldsymbol{f}-\frac{\boldsymbol{f}\cdot \boldsymbol{c}_2}{\boldsymbol{r}}-\cdots -\frac{\boldsymbol{f}\cdot \boldsymbol{c}_{30}}{\boldsymbol{r}}\\ \end{array} \right] ⎣⎢⎡rc2−1⋮rc2⋯⋱⋯rc30⋮rc30−1⎦⎥⎤⋅⎣⎢⎡x2⋮x30⎦⎥⎤=−⎣⎢⎡vdst⋅c2+f−rf⋅c2−⋯−rf⋅c30⋮vdst⋅c30+f−rf⋅c2−⋯−rf⋅c30⎦⎥⎤
其中
A = [ c 2 r − 1 ⋯ c 30 r ⋮ ⋱ ⋮ c 2 r ⋯ c 30 r − 1 ] , b = − [ d s t ⋅ c 2 v + f − f ⋅ c 2 r − ⋯ − f ⋅ c 30 r ⋮ d s t ⋅ c 30 v + f − f ⋅ c 2 r − ⋯ − f ⋅ c 30 r ] \boldsymbol{A}=\left[ \begin{matrix} \frac{\boldsymbol{c}_2}{\boldsymbol{r}}-1& \cdots& \frac{\boldsymbol{c}_{30}}{\boldsymbol{r}}\\ \vdots& \ddots& \vdots\\ \frac{\boldsymbol{c}_2}{\boldsymbol{r}}& \cdots& \frac{\boldsymbol{c}_{30}}{\boldsymbol{r}}-1\\ \end{matrix} \right] , \boldsymbol{b}=-\left[ \begin{array}{c} \frac{\boldsymbol{dst}\cdot \boldsymbol{c}_2}{\boldsymbol{v}}+\boldsymbol{f}-\frac{\boldsymbol{f}\cdot \boldsymbol{c}_2}{\boldsymbol{r}}-\cdots -\frac{\boldsymbol{f}\cdot \boldsymbol{c}_{30}}{\boldsymbol{r}}\\ \vdots\\ \frac{\boldsymbol{dst}\cdot \boldsymbol{c}_{30}}{\boldsymbol{v}}+\boldsymbol{f}-\frac{\boldsymbol{f}\cdot \boldsymbol{c}_2}{\boldsymbol{r}}-\cdots -\frac{\boldsymbol{f}\cdot \boldsymbol{c}_{30}}{\boldsymbol{r}}\\ \end{array} \right] A=⎣⎢⎡rc2−1⋮rc2⋯⋱⋯rc30⋮rc30−1⎦⎥⎤,b=−⎣⎢⎡vdst⋅c2+f−rf⋅c2−⋯−rf⋅c30⋮vdst⋅c30+f−rf⋅c2−⋯−rf⋅c30⎦⎥⎤
参数设置
- 速度 v = 50 m / s v=50m/s v=50m/s
- 充电速度 r = 200 m A / s r = 200mA/s r=200mA/s
- 最低工作值 f = 10 m A f=10mA f=10mA
数值解结果
nodes | battery capacity |
---|---|
0 | 5145.627 |
1 | 5692.659 |
2 | 4940.490 |
3 | 5168.420 |
4 | 4735.353 |
5 | 4940.490 |
6 | 5373.557 |
7 | 4963.283 |
8 | 4940.490 |
9 | 5168.420 |
10 | 4940.490 |
11 | 5601.487 |
12 | 5396.350 |
13 | 4940.490 |
14 | 4780.939 |
15 | 4940.490 |
16 | 5168.420 |
17 | 5624.280 |
18 | 5168.420 |
19 | 4940.490 |
20 | 4712.560 |
21 | 5168.420 |
22 | 5624.280 |
23 | 4712.560 |
24 | 5168.420 |
25 | 4894.904 |
26 | 4735.353 |
27 | 5373.557 |
28 | 5145.627 |
第二问:符号解法(symbolic)
代码已经实现,但是矩阵渲染太大导致计算机崩溃,故此可以得出利用符号解求解该问题并没有意义。
第三问
参数设置
- 速度: v = 50 m / s v=50m/s v=50m/s
- 每辆车最多运行时间: 100 s 100s 100s
- 每个节点的时间窗: [ 0 , 70 ] [0, 70] [0,70]
运行结果
Route for vehicle 0:
0 Time(0,0) -> 2 Time(4,4) -> 9 Time(10,10) -> 6 Time(16,16) -> 14 Time(25,25) -> 11 Time(30,30) -> 8 Time(36,36) -> 12 Time(40,40) -> 15 Time(45,45) -> 27 Time(57,57) -> 16 Time(67,67) -> 0 Time(86,86)
Time of the route: 86 seconds
Route for vehicle 1:
0 Time(0,0) -> 1 Time(5,5) -> 7 Time(12,12) -> 20 Time(21,21) -> 19 Time(28,28) -> 18 Time(36,36) -> 25 Time(46,46) -> 26 Time(57,57) -> 29 Time(69,69) -> 0 Time(91,91)
Time of the route: 91 seconds
Route for vehicle 2:
0 Time(0,0) -> 5 Time(7,7) -> 10 Time(11,11) -> 13 Time(16,16) -> 3 Time(30,30) -> 0 Time(40,40)
Time of the route: 40 seconds
Route for vehicle 3:
0 Time(0,0) -> 17 Time(8,8) -> 21 Time(18,18) -> 23 Time(25,25) -> 24 Time(33,33) -> 28 Time(41,41) -> 22 Time(49,49) -> 4 Time(56,56) -> 0 Time(64,64)
Time of the route: 64 seconds
Total time of all routes: 281min