Lingo优化软件初步

一、Lingo软件介绍

1、lingo软件的简单介绍

美国芝加哥大学的Linus Schrage教授于1980年左右开发的专门用于求解最优化问题的软件包,后经多年完善与扩充,并成立了LINDO系统公司进行商业运作取得巨大成功。根据 LINDO公司主页(http://www.lindo.com)提供的信息,位列《财富》杂志500强的企业中,有一半以上使用Lingo优化软件,前25强有23企业使用Lingo优化软件。用户可以在主页自由下载各类子包的演示版和应用例子。演示版和正式版功能类似,只是求解问题规模受到限制。各类版本的限制如下表

版本类型

总变量数

整数变量数

非线性变量数

约束数

演示版

300

30

30

150

求解包

500

50

50

250

高级版

2000

200

200

1000

超级版

8000

800

800

4000

工业版

32000

3200

3200

16000

扩展版

无限

无限

无限

无限

 LINGO是英文Linear Interactive and General Optimizer首写字母的缩写,即“交互式线性和通用优化求解器”。

 Lindo/Lingo软件内部有以下4个求解程序用于求解不同类型的优化模型

  • 直接求解器(Direct Solver)
  • 线性优化求解程序(Linear Solver)
  • 非线性优化求解程序(Nonlinear Solver)
  • 分支定界管理程序(Branch and Bound Manager)

  对于已经输入的一个优化模型,一旦发出求解指令,第一步是对等式约束的直接处理,例如,如果约束中有三个等式约束

xyz=30,
x+y=8,
y=5

  则Lingo软件能直接确定y=5,x=3,z=2,这三个变量就变成常数了。这样就尽量减少模型的规模(变量数和约束数),从而使得求解更加有效快捷。第二步就是识别模型的类型,根据类型调用不同的处理器来求解。

而处理器识别模型会在计算界面给出说明:

  • LP:线性规划模型
  • QP:二次规划模型
  • NLP:非线性规划
  • ILP:整数线性规划
  • INLP:整数非线性规划
  • IQP:整数二次规划

2、使用lingo求解优化模型应该注意的几个问题

  1.  尽量使用实数优化模型,尽量减少整数约束和整数变量的个数;
  2. 尽量使用光滑优化模型,尽量避免使用非光滑函数;(尽量少用绝对值函数(|x|)、符号函数(当x<0,函数为-1,x=0时,函数为0,当x>0时,函数为1)、多个变量求最大(或最小)、四舍五入函数、取整函数等。)
  3. 尽量使用线性优化模型,尽量减少非线性约束和非线性变量(非线性约束中的变量)的个数;
  4. 合理设定变量的上下界,避免计算陷入“大海捞针”。
  5. 模型中使用的单位的数量级要适当( Lingo计算时,最大数尽量不要超过最小数的1000倍,如果出现100000000与0.1的计算,误差很大!小数湮没于大数!)

举个例子,如果进行100000000(一亿)与0.1的计算,由于这两个数字之间相差很大,计算结果有可能出现较大的误差。这是因为计算机在表示数字时使用的是有限的二进制表示,如果一个数字过大,它的小数部分可能会被舍入或截断,导致计算结果不准确。在这种情况下,0.1这个较小的数可能会被表示成一个近似值,而且由于与较大数进行计算,计算结果可能会受到舍入误差的影响,进一步增大误差。

二、 编写简单的优化程序

1、编写一个简单的LINGO程序

在lingo的编辑窗口输入如下规划(二次规划)

x1+x2<100;
x1<2*x2;
max=98*x1+277*x2-x1^2-0.3*x1*x2-2*x2^2;
@gin(x1);@gin(x2);!x1,x2取整;

注意:输入程序时,输入法状态是英文!!

这段文字描述了一个优化问题的求解结果。下面对其中的各个内容进行解释:

- Global optimal solution found: 求解器找到了全局最优解,即在给定的约束条件下,找到了使目标函数取得最大(或最小)值的变量取值。

- Objective value: 目标函数的值,即在最优解下,目标函数所取得的数值。在这个问题中,目标函数的值为11076.80。

- Objective bound: 目标函数的边界值,即目标函数的最优解的理论上限(或下限)。与目标函数值相同,也为11076.80,表示找到的最优解是达到了目标函数的最优值。

- Infeasibilities: 不可行性的量度,即指约束条件是否满足。在这个结果中,所有约束条件均满足,不可行性为0.000000,表示所有约束都被满足。

- Extended solver steps: 求解器执行的扩展步骤数,表示在求解过程中,求解器进行了8次扩展步骤。

- Total solver iterations: 总的求解器迭代次数,表示在求解过程中,求解器进行了658次迭代。

- Variables: 相关变量的信息,包括变量名称、变量取值以及变量的减少成本(Reduced Cost)。在这个结果中,有两个变量X1和X2,它们的取值分别为36.00000和64.00000,并且对应的减少成本为-6.800002和-10.20000。

- Rows: 相关约束行的信息,包括行名称、松弛量或盈余量(Slack or Surplus)以及对应的对偶价格(Dual Price)。在这个结果中,有三个约束行,分别是行1、行2、行3。行1和行3的松弛量均为0.000000,表示约束条件被精确地满足。行2的松弛量为92.00000,表示约束条件有一定的余量。行3的对偶价格为1.000000,表示在最优解下,对应的约束条件对目标函数值的影响程度。

这些结果提供了关于优化问题求解的详细信息,包括最优解、约束条件情况以及相关变量和约束行的数值和性质。

 2、lingo程序输入时的规范格式

  1. Lingo总是根据“max=”或“min=”语句寻找目标函数,其它语句都是约束条件(注释句除外),即输入时不需要按顺序输入;
  2. Lingo中不区分大小写字母,Lingo中的变量名可以超过8个字符,但不能超过32个字符,且必须以字母开头,其中不能含有中文;
  3.  Lingo中已假设所有变量都是非负的,所以当x>=0时,不必在输入计算机中,相反,如果有变量x可以取负数,则应规范@free(x);(例如:y=sinx-1,数学上y取值于【-2,0】,如果是写在lingo程序中,就导致y==0!)
  4. Lingo中的>=,<=可以用>,<替换,即不区分大于等于和大于,小于等于和小于;
  5. 输入的多余的空格和回车都会被忽略,一个约束可以分两行或者多行书写;
  6. Lingo模型是由一系列语句构成,即语句是组成Lingo模型的基本单位,每个语句都是以分号“;”结尾,但尽量一个语句用一行来书写;
  7. 以感叹号“!”开始的语句是说明语句(注释语句,以便读者更好理解程序),但计算机在读取模型时,会忽略这样的语句。
  8. 在Lingo中,以“@”开头的都是调用函数(数据库),这在后面专门叙述。

3、程序计算(模型计算)的运行

4、Lingo程序常见错误 

  1. 表示倍数的乘号“*”漏掉;
  2.  语句结束后漏掉分号“;”
  3. 变量名没有定义(数组sets中没有出现);
  4. 函数标示“@”漏掉;
  5. 括号不配对;
  6. sets,data后的冒号“:”漏掉,或       endsets,enddata(不是enddate!)多后加分号。
  7. 中文输入法忘记关闭!!

5、求解器状态的解读

启动lingo计算摁扭后,会弹出如下界面:

 6、lingo求解状态窗口的注释

 三、Lingo运算符与函数

1、算术运算符

+         -          *          /        ^

加      减       乘       除        幂

算术运算符是数与数之间的运算,结果也是数。

2、逻辑运算符

2.1 逻辑值之间的运算符

#and#        #or#        #not#  

与                或            非

2.2  逻辑表达式的比较符(不区分大小写)

#eq#     #ne#     #gt#      #ge#         #lt#        #le#

 等于   不等于    大于     大于等于   小于      小于等于

 这6个操作符实际还是“数与数之间的”比较,而逻辑表达式计算的结果是逻辑值。

例如表述为计算机能接受的逻辑表达:   i#gt#3#and#i#le#7

 参与运算的是逻辑值,结果也是逻辑值,逻辑值只有“真”(True=1)和“假”(False=0)两个值。

3、关系运算符

< (<=)                              >(>=)                       =

小于(小于等于)   大于(大于等于)        等于

这三个符号表示数与数之间的大小关系

4、lingo基本函数

4.1  基本函数

@abs(x):   绝对值函数,返回x的绝对值;
@cos(x):   x的余弦值,x是弧度值;  @acos(x)
@sin(x):   x的正弦值,x是弧度值;  @asin(x)
@tan(x):   x的正切值,x是弧度值;  @atan(x)
@exp(x):   e^x;  
@log(x):   ln(x);
@lgm(x): 返回x的伽玛函数的自然对数,
      x为整数时,@lgm(x)=ln[(x-1)!],
      x不是整数采用线性插值,即:  @lgm(4.3)≈0.7@lgm(4)+0.3@lgm(3)(是近似)
@mod(x,y):   模函数,即x除以y的余数,x,y是整数;
@pow(x,y):   x^y;
@sign(x):     返回x的符号值,
  x>0,sign(x)=1;x<0,sign(x)=-1;x=0,sign(x)=0;
@floor(x):     取整(返回x的整数部分);
@sqr(x):        x*x;
@sqrt(x):       x的平方根;
@smin(list):  返回数列list的最小值;
@smax(list): 返回数列list的最大值;
@prod(list):   返回连乘的积;

4.2  变量定界函数

  • @bnd(L,x,U): 限制L<x<U;L,U与x同维度;
  • @bin(x):     限制x为0或1;
  • @gin(x):     限制x只能取整数;
  • @free(x):    解除对x的符号限制,可以取负数,0,正数.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/35529.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

六、HAL_Timer的PWM功能

1、开发环境 (1)Keil MDK: V5.38.0.0 (2)STM32CubeMX: V6.8.1 (3)MCU: STM32F407XGT6 2、PWM简介 2.1、什么是PWM (1)PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用&#xff0c;方波的占空比被调制用来对一个具体模拟信号的电平进行编码。 (2)P…

蓝奥声开发高性价比智能wifi插座进军智能家居

关键词&#xff1a;智能家居、家用插座、WiFi插座、高性价比插座 智能硬件的大潮袭来让智能家居这一并不新鲜的概念再次火热起来&#xff0c;关于智能家居的各种场景的描述给了我们很大的想象空间&#xff0c;然而落到实处真正开始走进生活时却又显得那么骨感&#xff0c;一时间…

(30)精准降落和悬停(IRLock)

文章目录 30.1 概述 30.2 哪里可以买到 30.3 连接到自动驾驶仪 30.4 安装到框架上 30.5 通过任务规划器进行设置 30.6 飞行和测试 30.1 概述 Copter 支持使用 IR-LOCK 传感器(IR-LOCK sensor)和声纳或激光雷达(sonar or lidar)进行精确着陆。使用该系统&#xff0c;当飞行…

基于深度学习的目标检测的介绍(Introduction to object detection with deep learning)

物体检测的应用已经深入到我们的日常生活中&#xff0c;包括安全、自动车辆系统等。对象检测模型输入视觉效果(图像或视频)&#xff0c;并在每个相应对象周围输出带有标记的版本。这说起来容易做起来难&#xff0c;因为目标检测模型需要考虑复杂的算法和数据集&#xff0c;这些…

内存的五大分区

一些套话 一个由C/C编译的程序占用的内存分为以下几个部分&#xff1a;栈区&#xff0c;堆区&#xff0c;全局区&#xff08;静态区&#xff09;&#xff0c;文字常量区&#xff0c;代码区 在执行一个C/C 程序时&#xff0c;此程序拥有唯一的“内存四区”&#xff08;栈区&…

00-C++-ccache使用

ccache使用 前言ccache是什么ccache使用 前言 在编译大型C项目代码时编译时间比较长&#xff0c;那么可以使用ccache来加速代码的编译&#xff0c;一起来学习吧。 ccache是什么 ccache是一个编译器缓存。它通过缓存以前编译的结果并检测何时再次进行相同的编译来加快重新编译…

聊聊不同集群的微服务如何通过feign调用

前言 之前业务部门的某项目微服务调用关系如下图 后因业务改造需要&#xff0c;该项目需要将服务A部署到另外一个集群&#xff0c;但服务A仍然需要能调用到服务B&#xff0c;调用关系如下图 之前调用方式是负责服务B的开发团队提供相应的feign客户端包给到服务A开发团队&…

k8s 第一篇 基础知识

一 k8s 1.1 概念 k8s 是一个能让应用部署到容器中&#xff0c;实现自动部署和管理更加高效 自能化的平台。 也就是说通过k8s&#xff0c;能够进行应用的自动化部署和扩容。 1.2 集群的架构流程 1.3 k8s的核心概念 1.4 k8s 集群规划 从第6集开始看

基于OpenCV 实现车牌号码识别--附免费源码

在本教程中,您将学习如何使用 OpenCV 和 EasyOCR 包自动执行车牌/车牌识别 (LPR/NPR)。 EasyOCR是一个开源 Python 包,用于执行光学字符识别 - OCR(从图像中提取文本)。 该软件包非常易于使用,在撰写本文时,它支持 80 多种语言,包括中文、阿拉伯语、法语、英语、西里尔…

MySQL-SQL全部锁详解(上)

​♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#x…

金山企业版杀毒软件平台“终端安全系统V9”linux客户端不能注册的问题解决方法。

金山企业版杀毒软件平台“终端安全系统V9”&#xff0c;出现部分Linux客户端安装后无法注册到服务器的问题&#xff0c;本文提供了一种问题解决方法。 一、平台版本 平台为金山企业版杀毒软件平台“终端安全系统V9”&#xff1a; 平台端版本为V9.SP2.E1004 客户端安装包&…

50从零开始学Java之万类之王Object是怎么回事?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在前面的文章中&#xff0c;壹哥跟大家说过&#xff0c;Java是面向对象的编程语言&#xff0c;而在面…

langchain调用chatGLM2纪实

一、科学上网要注意&#xff1a; 域名全代和全局代理&#xff08;网卡&#xff09;&#xff0c;都要打开。这样conda install特别快。 二、安装langchain 1、 conda install langchain 2、 conda install openai 注意&#xff1a; 使用pip install和conda install 是不同…

SpringBoot使用EasyExcel批量导出500万数据

SpringBoot使用EasyExcel批量导出500万数据 说明excel版本比较EasyExcel介绍项目目录mysql对应表建表语句pom.xmlapplication.yml配置类启动类代码OrderInfo 实体类OrderInfoExcel excel模版标题类(EasyExcel需要使用这个)TestController控制层接口层TestServiceTestServiceImp…

十五、docker学习-docker核心docker数据卷

什么是数据卷 当我们在使用docker容器的时候&#xff0c;会产生一系列的数据文件&#xff0c;这些数据文件在我们删除docker容器时是会消失的&#xff0c;但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的&#xff0c;Docker将应用与运行环境打包成容器发布&…

创建启动前端vue与后端python/flask,前后端分离,相互传递参数

创建启动vue 确保你已经安装了Node.js和npm 安装vue npm install -g vue/cli创建vue项目&#xff1a; vue create my-project cd my-project启动vue npm run serve如果安装vue报错&#xff1a;管理员权限模式打开powershell Windows PowerShell 版权所有&#xff08;C&#…

斐波那契数列

目录 斐波那契数列 斐波那契数列和黄金分割率的关联 解析表达式 练习 斐波那契数列 一个人将一对兔子放到一个封闭的围墙内&#xff0c;并假设每对兔子每个月都繁殖出一对兔子&#xff0c;且新生兔子从第二个月开始有繁殖能力&#xff0c;那么一年以后这个封闭的围墙内有多…

kotlin Flow系列之 - 冷流SafeFlow源码解析之 - Safe在那里?

本文涉及源码基于kotlinx-coroutines-core-jvm:1.7.1 kotlin 协成系列文章: 你真的了解kotlin中协程的suspendCoroutine原理吗? Kotlin Channel系列&#xff08;一&#xff09;之读懂Channel每一行源码 kotlin Flow系列之-冷流SafeFlow源码解析之 - Safe在那里&#xff1f; ko…

vue el-table的每行操作el-button添加单独的loading效果实现

vue el-table的每行操作el-button添加单独的loading效果实现 效果图&#xff1a;实现代码&#xff1a;结语 效果图&#xff1a; 实现代码&#xff1a; <tamplate><el-table :data"list" ><el-table-column fixed"right" label"操作&q…

服务负载均衡Ribbon

服务负载均衡Ribbon Ribbon 介绍Ribbon 案例Ribbon 负载均衡策略Ribbon 负载均衡算法设置自定义负载均衡算法 Ribbon 介绍 Ribbon 是一个的客服端负载均衡工具&#xff0c;它是基于 Netflix Ribbon 实现的。它不像 Spring Cloud 服务注册中心、配置中心、API 网关那样独立部署…