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


相关文章
|
4月前
|
Linux 计算机视觉 C++
【解决方案】Building wheel for opencv-python:安装卡顿的原因与解决方案
当你安装OpenCV时,命令行停在Building wheel for opencv-python (PEP 517) ... -似乎卡住了。这并非程序假死,而是其编译耗时巨大。本文将揭示原因,并提供优化安装体验的实用方法。
685 88
|
11月前
|
开发者 Python
阿里云PAI DSW快速部署服务
在使用阿里云DSW实例进行开发的时候,可能需要快速部署服务测试应用效果。DSW实例目前已经支持通过自定义服务访问配置功能,对外提供服务访问能力,您在应用开发过程中无需分享整个DSW实例,即可将服务分享给协作开发者进行测试和验证。
416 23
|
机器学习/深度学习 自动驾驶 算法
特斯拉发布Robotaxi,支撑其自动驾驶的FSD你需要了解一下
【10月更文挑战第11天】FSD(全自动驾驶)是特斯拉开发的自动驾驶技术,目标是在无需人工干预的情况下,让车辆自主识别路况并完成行驶。该系统基于CNN神经网络,能通过车载摄像头收集的数据进行图像识别与处理。FSD包含自动紧急刹车、自动变道等功能,并在2024年特斯拉“robotaxiday”活动中,推出了cybercab赛博无人出租车和robovan无人驾驶多功能车。基于“端到端”大模型算法,FSD未来将不依赖高精地图行驶,并计划于2025年在美国得州和加州实现“无监督版”完全自动驾驶。
322 16
|
供应链 算法 定位技术
运筹优化技术在供应链领域应用介绍
运筹优化技术在供应链领域应用介绍
1235 0
水星 SG108 PRO/1.0 网络端口镜像 使用流程
水星 SG108 PRO/1.0 网络端口镜像 使用流程
422 1
|
安全 数据处理 API
【Qt 线程】探索Qt线程编程的奥秘:多角度深入剖析(一)
【Qt 线程】探索Qt线程编程的奥秘:多角度深入剖析
845 0
|
关系型数据库 网络安全 数据库
PGPool-II+PG流复制实现HA主备切换
基于PG的流复制能实现热备切换,但是是要手动建立触发文件实现,对于一些HA场景来说,需要当主机down了后,备机自动切换,经查询资料知道pgpool-II可以实现这种功能。
3302 0
|
缓存
总线窥探(Bus Snooping)
总线窥探(Bus Snooping)
463 0
|
决策智能
运筹优化学习04:Lingo的sum函数和for函数的使用方法介绍
运筹优化学习04:Lingo的sum函数和for函数的使用方法介绍
运筹优化学习04:Lingo的sum函数和for函数的使用方法介绍
|
存储 缓存 NoSQL
EhCache缓存
在查询数据的时候,数据大多来自数据库,通常会基于SQL语句的方式与数据库交互,数据库一般会基于本地磁盘IO的形式将数据读取到内存,返回给Java服务端,Java服务端再将数据响应给客户端,做数据展示。
483 0