运筹优化学习01:Lingo入门与错误列表分析(一)

简介: 运筹优化学习01:Lingo入门与错误列表分析

今天老板安排了一个任务,让自己建立一个最经典的CVRP模型,然后用LINGO把建立的模型给求解出来;LINGO只是听说过,从来没有真正使用过,运筹学课程也是混着过来的,怎么办?硬着头皮上呗。


两种编程方法:使用集合语言编程和不使用集合语言编程(笨办法编程)

1 Lingo编程基础

1.1基本思路

  • 确保模型是对的,每个变量均进行了严格的定义;
  • 明确已知数据、模型的类型(线性模型、非线性模型)
  • 确定指标集(即每个变量的变化范围)
  • 确定变量依赖的指标集
  • 正确写出代码式子

1.2 建模思路

20190619232642311.png

1.3 注意事项

目标函数:min或max

基本语法:

普通代码行,以分号为一行代码的结束;代码注释行,以叹号开始分号结束

空格和回车字符会被忽略掉

变量名以字母开头,不区分大小写;

没有严格大于或严格等于的约束

2 整数规划模型求解示例(不使用集合语言)

2.1 问题模型

20190605215657778.png

2.2 lingo源代码:

max = 4*x1 + 3*x2;
2 * x1 + x2 <= 10;
    x1 + x2 <=  8;
   x2 <=  7;
@gin(x1);
@gin(x2);

2.3 结果展示

得到全局最优解,目标函数值为26

20190605220812914.png

解报告中显示:x1 = 2; x2 = 6

20190605220853976.png

2.4 小结

  • 每行源代码都是以 【;】 结束的;
  • 可以通过空格增强代码的易读性;
  • 乘号不能省略
  • lingo不区分大小写
  • 默认变量为非负变量
  • 注释代码以【!】开头,以【;】结尾
  • @开头的表示函数,常用的几个指令如下表所示

image.png

要求x取值范围为[-5,5]的实数的编码方式为:

1. @free(x);    !规定x为任意实数
2. @bnd(-5,x,5);    !规定x的范围
3. @gin(x);    !限定为整数


3  一个稍大规模的问题求解

3.1 问题描述

20190605221819699.png

3.2 模型建立

20190605221719418.png

3.3 模型分析

(1)确定模型的已知变量和未知变量:模型中除了gif.gif剩余的变量都是已知变量

(2)确定指标集:gif.gif;对应的lingo代码为:

3.3.1 定义集合段:使用【sets:】开始,【endsets】结束

!使用集合表示;
sets:
S/1..6/: a, b, d; !变量a_{i}, b_{i}, d_{i};
T/1,2/: e, x;   !变量e_{j}, x_{j};
U(S,T): ;            !双下标的集合c_{ij};
endsets

3.3.2 定义数据段:使用【data:】开始,【enddata】结束

!定义数据段;
DATA:
a = 1.25 8.75 0.5 5.75 3 7.25;
B = 1.25 0.75 4.75 5 6.5;
D = 3 5 4 7 6 11;
ENDDATA

3.3.3 目标函数的代码

gif.gif

编码该公式的Latex代码:min \sum_{j=1}^{2}\sum_{i=1}^{6}c_{ij}\sqrt { (x_j - a_j)^2 +(y_{i} - b_{i} )^2}

编码该公式的Lingo代码:

min = @sum(T(j) : @sum(S(i) : c(i,j) * @sqrt((x(j)- a(j))^2 + (x(i) - y(i))^2) ) );
!代码注释:
j \in T
i \in S
调用函数:@sqrt求平方根,@sum求和;

3.3.4 约束条件代码实现

gif.gif

编码该公式的Latex代码:\sum_{j=1}^2 c_{ij} = d_i; i = 1,2,..,6

编码该公式的Lingo代码:

@for (S(i) : @sum(T(j) : c(i,j) = d(i));
!代码注释:
i \in S
j \in T;

gif.gif

编码该公示的Latex代码:\sum_{i=1}^{6} c_{ij} \leq e_{j}; j = 1,2

编码该约束的Lingo代码:

@for (T(j) : \sum(S(i) : c(i,j) <= e(j) ));

3.3.5 完整代码

!使用集合表示;
sets:
S/1..6/: a, b, d;   !变量a_{i}, b_{i}, d_{i};
T/1,2/: e, x, y;    !变量e_{j}, x_{j}, y_{j};
U(S,T): c ;   !双下标的集合c_{ij};
endsets
!定义数据段;
DATA:
a = 1.25 8.75 0.5 5.75 3 7.25;
B = 1.25 0.75 4.75 5 6.5 7.75;
D = 3 5 4 7 6 11;
x = 5 2;
y = 1 7;
ENDDATA
min = @sum(T(j) : @sum(S(i) : c(i,j) * @sqrt((x(j) - a(i))^2 + (y(j) - b(i))^2)));
@for(S(i) : @sum(T(j): c(i,j)) = d(i));
@for(T(j) : @sum(S(i) : c(i,j)) <= e(j));

3.3.6 结果演示

20190605230328649.png

 Global optimal solution found.
  Objective value:                              134.4157
  Infeasibilities:                              0.000000
  Total solver iterations:                             0
                       Variable           Value        Reduced Cost
                          A( 1)        1.250000            0.000000
                          A( 2)        8.750000            0.000000
                          A( 3)       0.5000000            0.000000
                          A( 4)        5.750000            0.000000
                          A( 5)        3.000000            0.000000
                          A( 6)        7.250000            0.000000
                          B( 1)        1.250000            0.000000
                          B( 2)       0.7500000            0.000000
                          B( 3)        4.750000            0.000000
                          B( 4)        5.000000            0.000000
                          B( 5)        6.500000            0.000000
                          B( 6)        7.750000            0.000000
                          D( 1)        3.000000            0.000000
                          D( 2)        5.000000            0.000000
                          D( 3)        4.000000            0.000000
                          D( 4)        7.000000            0.000000
                          D( 5)        6.000000            0.000000
                          D( 6)        11.00000            0.000000
                          E( 1)        15.00000            0.000000
                          E( 2)        21.00000            0.000000
                          X( 1)        5.000000            0.000000
                          X( 2)        2.000000            0.000000
                          Y( 1)        1.000000            0.000000
                          Y( 2)        7.000000            0.000000
                       C( 1, 1)        3.000000            0.000000
                       C( 1, 2)        0.000000            2.040383
                       C( 2, 1)        5.000000            0.000000
                       C( 2, 2)        0.000000            5.440861
                       C( 3, 1)        0.000000            3.153524
                       C( 3, 2)        4.000000            0.000000
                       C( 4, 1)        7.000000            0.000000
                       C( 4, 2)        0.000000           0.1802949
                       C( 5, 1)        0.000000            4.734316
                       C( 5, 2)        6.000000            0.000000
                       C( 6, 1)        0.000000            1.811824
                       C( 6, 2)        11.00000            0.000000
                            Row    Slack or Surplus      Dual Price
                              1        134.4157           -1.000000
                              2        0.000000           -3.758324
                              3        0.000000           -3.758324
                              4        0.000000           -2.704163
                              5        0.000000           -4.069705
                              6        0.000000           -1.118034
                              7        0.000000           -5.303301
                              8        0.000000            0.000000
                              9        0.000000            0.000000


相关文章
|
5月前
如何用公式化思维?几个经典公式收集
如何用公式化思维?几个经典公式收集
|
12天前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
30 4
|
2月前
|
SQL 存储 关系型数据库
5大步骤+10个案例,堪称SQL优化万能公式
5大步骤+10个案例,堪称SQL优化万能公式
|
4月前
|
数据可视化 算法 大数据
深入解析高斯过程:数学理论、重要概念和直观可视化全解
这篇文章探讨了高斯过程作为解决小数据问题的工具,介绍了多元高斯分布的基础和其边缘及条件分布的性质。文章通过线性回归与维度诅咒的问题引出高斯过程,展示如何使用高斯过程克服参数爆炸的问题。作者通过数学公式和可视化解释了高斯过程的理论,并使用Python的GPy库展示了在一维和多维数据上的高斯过程回归应用。高斯过程在数据稀疏时提供了一种有效的方法,但计算成本限制了其在大数据集上的应用。
114 1
|
3月前
|
机器学习/深度学习 开发框架 数据可视化
我们可以从系统工程的角度来讨论如何优化组织架构,并给出一些可能涉及的Python应用领域的示例。
我们可以从系统工程的角度来讨论如何优化组织架构,并给出一些可能涉及的Python应用领域的示例。
|
机器学习/深度学习 自然语言处理 算法
【机器学习实战】10分钟学会Python怎么用EM期望最大化进行参数估计(十五)
【机器学习实战】10分钟学会Python怎么用EM期望最大化进行参数估计(十五)
200 0
|
机器学习/深度学习 算法 安全
基于遗传算法的梯级水电站群优化调度研究(Python代码实现)
基于遗传算法的梯级水电站群优化调度研究(Python代码实现)
165 0
从0到1学习Yalmip工具箱(2)-决策变量进阶
从0到1学习Yalmip工具箱第二章,决策变量进阶学习
|
编解码 自然语言处理 数据可视化
MIM方法为什么简单高效?可视化和大规模实验给出了答案
MIM方法为什么简单高效?可视化和大规模实验给出了答案
199 0
MIM方法为什么简单高效?可视化和大规模实验给出了答案
|
机器学习/深度学习 人工智能 算法
强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验
强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验
下一篇
无影云桌面