运筹优化学习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


相关文章
|
7月前
如何用公式化思维?几个经典公式收集
如何用公式化思维?几个经典公式收集
|
8天前
|
存储 算法 决策智能
《C 语言下模拟退火算法于组合优化的应用要点全解析》
组合优化问题是计算机科学与数学的交叉领域中的研究热点。模拟退火算法作为一种基于概率的随机搜索方法,通过模拟固体退火过程,能够在解空间中高效寻找全局最优或近似最优解。本文探讨了用C语言实现模拟退火算法的关键步骤,包括算法原理、数据结构设计、温度参数控制、邻域生成与搜索策略、接受准则、终止条件及性能评估与调优,旨在为解决组合优化问题提供有效途径。
51 11
|
3月前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
69 4
|
5月前
|
算法 搜索推荐 编译器
算法高手养成记:Python快速排序的深度优化与实战案例分析
【7月更文挑战第11天】快速排序是编程基础,以O(n log n)时间复杂度和原址排序著称。其核心是“分而治之”,通过选择基准元素分割数组并递归排序两部分。优化包括:选择中位数作基准、尾递归优化、小数组用简单排序。以下是一个考虑优化的Python实现片段,展示了随机基准选择。通过实践和优化,能提升算法技能。**
66 3
|
7月前
|
机器学习/深度学习 算法 vr&ar
【Python强化学习】动态规划法中策略迭代和值迭代求解冰湖问题实战(图文解释 附源码)
【Python强化学习】动态规划法中策略迭代和值迭代求解冰湖问题实战(图文解释 附源码)
140 0
|
机器学习/深度学习 人工智能 算法
强化学习从基础到进阶-案例与实践[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验
强化学习从基础到进阶-案例与实践[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验
强化学习从基础到进阶-案例与实践[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验
|
机器学习/深度学习 自然语言处理 算法
【机器学习实战】10分钟学会Python怎么用EM期望最大化进行参数估计(十五)
【机器学习实战】10分钟学会Python怎么用EM期望最大化进行参数估计(十五)
225 0
|
编解码 自然语言处理 数据可视化
MIM方法为什么简单高效?可视化和大规模实验给出了答案
MIM方法为什么简单高效?可视化和大规模实验给出了答案
225 0
MIM方法为什么简单高效?可视化和大规模实验给出了答案
|
机器学习/深度学习 人工智能 算法
强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验
强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验
|
决策智能
运筹优化学习01:Lingo入门与错误列表分析(三)
运筹优化学习01:Lingo入门与错误列表分析
运筹优化学习01:Lingo入门与错误列表分析(三)
下一篇
DataWorks