Lingo优化软件初步

news2024/9/23 9:31:41

一、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,正数.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式监控系统之zabbix6.0二

分布式监控系统之zabbix6.0二 一、部署 zabbix 代理服务器二、部署 Zabbix 高可用集群三、Zabbix 监控 Windows 系统四、Zabbix 监控 java 应用五、Zabbix 监控 SNMP 一、部署 zabbix 代理服务器 分布式监控的作用&#xff1a; 分担 server 的集中式压力解决多机房之间的网络…

暑假第4天打卡

Java: &#xff08;1&#xff09;标识符命名规范&#xff1a; > 包名&#xff1a;多单词组成时所有字母都小写&#xff1a;xxxyyyzzz。 例如&#xff1a;java.lang、com.atguigu.bean > 类名、接口名&#xff1a;多单词组成时&#xff0c;所有单词的首字母大写&#xf…

【一步到位】Jenkins的安装、部署、启动(完整教程)

一、测试环境 Linux系统 Centos 7 二、安装步骤&#xff1a; 1、安装jdk 我安装的是jdk8&#xff0c;此处就不多说了&#xff0c;自己百度哈&#xff0c;很简单 2、安装jenkins 首先依次执行如下三个命令&#xff1a; 2.1、导入镜像&#xff1a; [rootcentos7 ~]# sudo …

阿里P6跟P7有什么区别?

在互联网领域&#xff0c;阿里的职级和腾讯的职级体系相当于行业标准了&#xff0c;所以技术人还是需要学习一下/对标一下&#xff0c;从而知道自己目前在哪里&#xff0c;努力的方向是哪里&#xff1f;那么&#xff0c;阿里 P7 级别到底需要哪些能力呢&#xff1f;如下图思维导…

指针和数组笔试题解析

目录 数组笔试题 一维数组 字符数组 题 一 题 二 题 三 题 四 题 五 题 六 二维数组 指针笔试题 笔试题一 笔试题二 笔试题三 笔试题四 笔试题五 笔试题六 笔试题七 本篇博文&#xff0c;将从指针和数组来为大家分析一些笔试题&#xff0c;设计内…

IDEA+SpringBoot+mybatis+SSM+layui+Mysql客户管理系统源码

IDEASpringBootmybatisSSMlayuiMysql客户管理系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.修改密码3.客户管理4.添加客户5.充值记录管理6.消费记录管理7.客户类型8.添加客户类型 三、部分代码UserMapper.javaLoginController.javaUser.java 四、其他获取源码 一、…

【ElasticSearch】ES案例:旅游酒店搜索

文章目录 一、项目分析二、需求1&#xff1a;酒店搜索功能三、需求2&#xff1a;添加过滤功能四、需求3&#xff1a;我附近的酒店五、需求4&#xff1a;置顶花广告费的酒店 一、项目分析 启动hotel-demo项目&#xff0c;访问localhost:servicePort&#xff0c;即可访问static下…

不停服迭代更新-服务网格

系列文章目录 本章将根据多年经验&#xff0c;进行规划讲解 文章目录 系列文章目录前言一、如何做到 不停服更新、 不停服更新的机制有什么好处&#xff0c; 前言 服务迭代发版、少不了的就是停服更新&#xff0c;为了不影响 用户体验&#xff0c;大部分公司选择半夜更新迭代&…

TPCE260PCIE转PMC载板

TPCE60是一个标准的高度PCI Express版本1.1兼容的模块&#xff0c;提供了一个槽用于安装标准PMC模块&#xff0c;灵活和成本有效的I/O解决方案的各种应用如过程控制、医疗系统、电信和交通控制。 桥接PCI Express x1连接到主机板和PCI总线信号的PMC槽之间是由透明的PCIe到PCI桥…

正确释放vector的内存:clear还是swap?

一、size()和capacity()方法的区别 1、vector有size()和capacity()方法都用来获取vector的大小&#xff0c;那么它们两之间有什么区别呢&#xff1f; 我们先来看一段代码&#xff1a; int main() {std::vector<int> v1;std::cout <<"size:"<< v…

工厂模式(工厂方法和简单工厂模式)

工厂模式 概述常见分类简单工厂模式概述设计图解创建People抽象类(产品说明书)创建子类(产品角色)创建工厂(用于根据需求实例化对象)消费者简单工厂模式优点简单工厂模式缺点 工厂方法模式概述设计图解创建抽象父类(产品说明书)子类&#xff08;产品角色&#xff09;工厂工厂接…

数据结构二叉树(OJ)题

分析&#xff1a; 2. 我们要想办法区分&#xff0c;从队列当中出队的数据是属于那一层的数据 3. 我们当前这一道题的时间复杂度是O&#xff08;h * N&#xff09; h是树的高度&#xff0c;我们最坏情况就是在树的最底下找到&#xff0c;得递归h次&#xff0c;树的高度&#x…

vue开发:vue的插槽功能讲解

vue的插槽 举一个生活中的例子&#xff1a;比如装修房子的时候我们会在很多地方预留出一些插孔&#xff0c;可能要插电冰箱&#xff0c;插电式&#xff0c;插充电器等&#xff0c;反正就是你觉得预留在这个位置的插座一定有用&#xff0c;这个预留的插座就类似我们今天要说的插…

【C语言13】结构体的声明,定义与结构体的内存对齐

文章目录 一、结构体1.1结构体是什么1.2结构体声明1.3结构体的内存 以上便是结构体的介绍&#xff0c;如有不足&#xff0c;请多多指正&#xff01; 一、结构体 1.1结构体是什么 通俗的说&#xff0c;结构体就是一个类的集合&#xff0c;如同整形数组是整形数字的集合体&…

高数中的驻点以及要注意的事项

在高等数学中&#xff0c;驻点是指函数导数为零的点&#xff0c;即函数的极值点或拐点。在求解函数的最大值、最小值或拐点时&#xff0c;需要找到函数的驻点。 要注意以下几点&#xff1a; 1. 导数为零不一定是驻点&#xff1a;虽然驻点定义为函数导数为零的点&#xff0c;但…

力扣 | 双指针技巧

前文回顾&#xff1a;力扣 | 数组和字符串简介 力扣LeetBook&#xff1a;数组和字符串 文章目录 &#x1f4da;双指针技巧&#xff1a;情形一&#x1f449;反转字符串&#x1f449;数组拆分I&#x1f449;两数之和 II - 输入有序数组 &#x1f4da;双指针技巧&#xff1a;情形二…

基于智能手机的医院服务客户端设计与实现(论文+源码)_kaic

摘 要 近年来&#xff0c;随着中国经济的迅猛发展&#xff0c;医疗技术水平也在不断提高&#xff0c;但由于人口数目巨大&#xff0c;导致医疗资源人均分配不足的情况依旧十分严峻。预约挂号一直是制约医疗机构服务质量提高的主要环节之一。在传统预约挂号方式下&#xff0c;繁…

EMQ X(3):客户端websocket消息收发

在EMQ X Broker提供的 Dashboard 中 TOOLS 导航下的 Websocket 页面提供了一个简易但有效的WebSocket 客户端工具&#xff0c;它包含了连接、订阅和发布功能&#xff0c;同时还能查看自己发送和接收的报文数据&#xff0c;我们期望 它可以帮助您快速地完成某些场景或功能的测试…

ncm格式如何转换为mp3,分享几个方法!

你是否曾在网易云音乐上下载了一些NCM格式的音频文件&#xff0c;但发现无法在其他设备上播放&#xff1f;别担心&#xff0c;记灵在线工具可以帮助你将这些NCM格式转换为常见的MP3格式。今天小编就来分享三种方法&#xff0c;教你如何搞定&#xff01; 方法一&#xff1a;曲线…

C#学习之路-循环

有的时候&#xff0c;可能需要多次执行同一块代码。一般情况下&#xff0c;语句是顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 编程语言提供了允许更为复杂的执行路径的多种控制结构。 循环语句允许我们多次执行一个…