Gurobi入门实践(一)——以16届华为杯F题为例

一、引言
本篇将介绍优化类建模的一般分析方法,以及优化求解器Gurobi+Python(Gurobipy)的使用。以2019年华为杯F题第一问为例,通过代码实践来提高解决问题的能力。

二、优化建模的关键
对于实际的问题,设立恰当的决策变量,将问题条件转化为可编程表达的数学语言,往往是解决问题的第一步。
而这其中的关键往往在于,我们所设定决策变量的各种取值应该无重复的代表实际的所有情况。因此,要培养优化建模能力,体会各种决策变量的类型以及其在计算机中的数据结构与实际问题的对应关系,是学习过程中当着重思考的。

三、问题分析
对于以下“多约束条件下智能飞行器航迹快速规划”问题:



阅读题目即可知,飞行器从A点到B点飞行,过程中会有水平、垂直两个指标的偏差。因此需要在途中经过两种类型的校正点,而对于途中所经过的点,飞行器的偏差同样需要满足特定要求(如图1)。

如果不考虑题目中所出现的各种约束,我们的目的就仅仅是让飞行器从A飞到B就好,图中可以可以飞过任意的点。因此可以发现,此处强调的是点与点之间的连接关系,每个点之间要么相连,要么断开。相连则为1,断开则为0,因此,为了覆盖所有的情况,我们可以建立0-1矩阵(方阵,边长为所有点的数量)来描述这种关系。
然而,对于一个所有点的0-1矩阵,在不考虑题目约束情况下,其中矩阵“1”元素的分布也是有限制的,因为之少从A到B,是一条连贯的通路,如果还考虑“不能转圈圈”,“不能重复经过点”等,则“1”的分布更加受限制。
因此,我们通过0-1矩阵的二进制变量,作为我们的决策变量,其能够无重复地反应所有的连接可能,且能够通过约束表达进一步限制。不过,这能否表达我们的目标函数呢?
由题目可知,目标函数是距离最短,经过的点最少。经过点的数量从0-1矩阵就可以获得,距离最短则牵扯到点-点距离,因此我们还需要构建所有点之间的距离矩阵。
最后观察约束,约束中的共性是,偏移不超过某个值。而偏移是由每移动1m产生的偏差积累而来。这是,我们可以将“偏移不超过某个值”转化为“移动距离不超过某个值”,从而减少参数的个数。具体约束的表达,后面将和代码一并分析。

四、模型建立与Gurobipy
此处将着重分析校正点的约束分析,给出其数学表达方法,其余约束模型以代码形式呈现。同时介绍Gurobipy的基本语法。
以上代码中,读取了数据,建立了点-点距离矩阵,还对数据进行了删减处理(预处理)。这是考虑到通过绘制题目所给数据点发现,所有点几乎均匀分布于一个较为广大的空间中,且两种校正点没有特定的集中分布。因此,此处连接A、B两点,以此为轴线,将15000距离以外的点都删去,提高了程序的执行效率。
Gurobipy基本语法,建立点×点范围的0-1变量矩阵,结合距离矩阵一起表达约束和目标函数。
以上为路径形成约束,即在没有校正点约束下,能够生成从A到B路径的约束。包括:从A出发,不回到自己,单入单出,不重复经过,路径连续等约束。这些约束通过分析0-1矩阵本身的特性不难得出。
可以发现,操作对象都是0-1决策变量。gp.quicksum()等都是Gurobipy的常见语法,需要结合Python生成器熟练运用。
以上是目标函数的表达,以及轨迹的打印。接下来将详细分析校正点的约束。
校正点约束即以下约束:

我们不妨列举一些可能的情况,如下图所示,从A出发,到达点无非两种,可以记为0和1,通过分析相同点(即下一个点仍然为同类型)以及相异点(下一个点为不同类型)之间的关系,便可以发现其中的数学规律。

数学表达式从前述代码容易看出。
最后经过4.32s迭代得到结果:
数据集一:

数据集二:

依据上述分析可设计程序,检验输入的路径是否满足约束要求:(以下可实现检验路径,计算路径长度,绘制坐标点功能)

五、总结
初始而言,对于日常优化建模的练习,应当着重分析决策变量的设立技巧,反思并积累经验,并将数学公式转化成可用求解器求解的形式;
本篇应用Gurobipy解决了一道较易的0-1优化问题,第二问可在此基础上进一步分析,重点则在于第一问校正点约束构建的思考方式。

六、参考文献
[1] 2019 年第十六届中国研究生数学建模竞赛 F 题.多约束条件下智能飞行器航迹快速规划.