热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LinGo基本用法总结

一、界面及基本用法所有代码在LingoModel-Lingo1中编写,写完后点击工具条上的红色的靶子运行例:求解线性整数规划model:maxx1

一、界面及基本用法

所有代码在 Lingo Model - Lingo 1中编写,写完后点击工具条上的红色的靶子运行

界面

例:求解
在这里插入图片描述

线性整数规划
model:max&#61;x1&#43;x2;x1&#43;9/14*x2<&#61;51/14;-2*x1&#43;x2<&#61;1/3;&#64;gin(x1);&#64;gin(x2);end

求得x1&#61;3&#xff0c;x2&#61;1&#xff0c;最大值为4.运用matlab求时可以发现有两组解&#xff1a;x1&#61;3&#xff0c;x2&#61;1和x1&#61;2&#xff0c;x2&#61;2。通过验证也可知这两组解均满足。Lingo的一个缺陷是&#xff1a;每次只能输出最优解中的一个&#xff08;有时不只一个&#xff09;。那么&#xff0c;怎样求得其他解呢&#xff1f;一个办法是将求得的解作为约束条件&#xff0c;约束x1不等于3&#xff0c;x2不等于1&#xff0c;再求解。如下&#xff1a;

model:max&#61;x1&#43;x2;x1&#43;9/14*x2<&#61;51/14;-2*x1&#43;x2<&#61;1/3;&#64;gin(x1);&#64;gin(x2);&#64;abs(x1-3)>0.001;&#64;abs(x2-1)>0.001;end

求得x1&#61;2&#xff0c;x2&#61;2.若再次排除这组解&#xff0c;发现Lingo解不出第三组解了&#xff0c;这时我们可以断定&#xff1a;此优化模型有两组解&#xff1a;

x1&#61;3&#xff0c;x2&#61;1和x1&#61;2&#xff0c;x2&#61;2.

求解模型时需注意&#xff1a;Lingo中&#xff0c;默认变量均为非负&#xff1b;输出的解可能是最优解中的一组&#xff0c;要判断、检验是否还有其他解&#xff08;根据具体问题的解的情况或用排除已知最优解的约束条件法&#xff09;。


二、常用函数及运算符

1、LINGO具有9种逻辑符号

#not# 否定该操作数的逻辑值&#xff0c;&#xff03;not&#xff03;是一个一元运算符
#eq# 若两个运算数相等&#xff0c;则为true&#xff1b;否则为flase
#ne# 若两个运算符不相等&#xff0c;则为true&#xff1b;否则为flase
#gt# 若左边的运算符严格大于右边的运算符&#xff0c;则为true&#xff1b;否则为flase
#ge# 若左边的运算符大于或等于右边的运算符&#xff0c;则为true&#xff1b;否则为flase
#lt# 若左边的运算符严格小于右边的运算符&#xff0c;则为true&#xff1b;否则为flase
#le# 若左边的运算符小于或等于右边的运算符&#xff0c;则为true&#xff1b;否则为flase
#and# 仅当两个参数都为true 时&#xff0c;结果为true&#xff1b;否则为flase
#or# 仅当两个参数都为false 时&#xff0c;结果为false&#xff1b;否则为true
这些运算符的优先级由高到低为&#xff1a;

高 &#xff03;not&#xff03;&#xff03;eq&#xff03; &#xff03;ne&#xff03; &#xff03;gt&#xff03; &#xff03;ge&#xff03; &#xff03;lt&#xff03; &#xff03;le&#xff03;
低 &#xff03;and&#xff03; &#xff03;or&#xff03;例&#xff1a;2 #gt# 3 #and# 4 #gt# 2&#xff0c;其结果为假&#xff08;0&#xff09;。

2、Lingo中关系运算符

在LINGO中&#xff0c;关系运算符主要是被用在模型中&#xff0c;来指定一个表达式的左边是否等于、小于等于、或者大于等于右边&#xff0c;形成模型的一个约束条件。关系运算符与逻辑运算符截然不同&#xff0c;前者是模型中该关系运算符所指定关系的为真描述&#xff0c;而后者仅仅判断一个该关系是否被满足&#xff1a;满足为真&#xff0c;不满足为假。
LINGO有三种关系运算符&#xff1a;“&#61;”、“<&#61;”和“>&#61;”。LINGO中还能用“<”表示小于等于关系&#xff0c;“>”表示大于等于关系。LINGO 并不支持严格小于和严格大于关系运算符。

3、数学函数

LINGO提供了大量的标准数学函数
&#64;abs(x) 返回x 的绝对值
&#64;sqrt() 开方
&#64;sin(x) 返回x 的正弦值&#xff0c;x 采用弧度制
&#64;cos(x) 返回x 的余弦值
&#64;tan(x) 返回x 的正切值
&#64;exp(x) 返回常数e 的x 次方
&#64;log(x) 返回x 的自然对数
&#64;lgm(x) 返回x 的gamma 函数的自然对数
&#64;sign(x) 如果x<0 返回-1&#xff1b;否则&#xff0c;返回1
&#64;floor(x) 返回x的整数部分。当x>&#61;0 时&#xff0c;返回不超过x 的最大整数&#xff1b;当x<0
时&#xff0c;返回不低于x 的最大整数。
&#64;smax(x1,x2,…,xn) 返回x1&#xff0c;x2&#xff0c;…&#xff0c;xn 中的最大值
&#64;smin(x1,x2,…,xn) 返回x1&#xff0c;x2&#xff0c;…&#xff0c;xn 中的最小值

变量界定函数
变量界定函数实现对变量取值范围的附加限制&#xff0c;共4种
&#64;bin(x) 限制x 为0 或1 — 用于0-1规划
&#64;bnd(L,x,U) 限制L≤x≤U
&#64;free(x) 取消对变量x 的默认下界为0 的限制&#xff0c;即x 可以取任意实数
&#64;gin(x) 限制x 为整数
在默认情况下&#xff0c;LINGO 规定变量是非负的&#xff0c;也就是说下界为0&#xff0c;上界为&#43;∞。&#64;free 取消
了默认的下界为0的限制&#xff0c;使变量也可以取负值。&#64;bnd用于设定一个变量的上下界,它也可 以取消默认下界为0的约束。

概率函数

1 . &#64;pbn(p,n,x) 二项分布的累积分布函数。当 n 和&#xff08;或&#xff09;x 不是整数时&#xff0c;用线性插值法进行计算。

2&#xff0e;&#64;pcx(n,x) 自由度为n的χ2分布的累积分布函数。

3&#xff0e;&#64;peb(a,x) 当到达负荷为 a&#xff0c;服务系统有 x 个服务器且允许无穷排队时的 Erlang 繁忙概率。

4&#xff0e;&#64;pel(a,x) 当到达负荷为 a&#xff0c;服务系统有 x 个服务器且不允许排队时的 Erlang 繁忙概率。

5&#xff0e;&#64;pfd(n,d,x) 自由度为 n 和 d 的 F 分布的累积分布函数。

6&#xff0e;&#64;pfs(a,x,c) 当负荷上限为 a&#xff0c;顾客数为 c&#xff0c;平行服务器数量为 x 时&#xff0c;有限源的 Poisson 服务系统的 等待或返修顾客数的期望值。a 是顾客数乘以平均服务时间&#xff0c;再除以平均返修时间。当 c 和 &#xff08;或&#xff09;x 不是整数时&#xff0c;采用线性插值进行计算。

7&#xff0e;&#64;phg(pop,g,n,x) 超几何&#xff08;Hypergeometric&#xff09;分布的累积分布函数。pop 表示产品总数&#xff0c;g 是正品数。从 所有产品中任意取出 n&#xff08;n≤pop&#xff09;件。pop&#xff0c;g&#xff0c;n 和 x 都可以是非整数&#xff0c;这时采用线性插值 进行计算。

8&#xff0e;&#64;ppl(a,x)Poisson 分布的线性损失函数&#xff0c;即返回 max(0,z-x)的期望值&#xff0c;其中随机变量 z 服从均值 为 a 的 Poisson 分布。

9&#xff0e;&#64;pps(a,x) 均值为 a 的 Poisson 分布的累积分布函数。当 x 不是整数时&#xff0c;采用线性插值进行计算。

10&#xff0e;&#64;psl(x) 单位正态线性损失函数&#xff0c;即返回 max(0,z-x)的期望值&#xff0c;其中随机变量 z 服从标准正态 分布。

11&#xff0e;&#64;psn(x) 标准正态分布的累积分布函数。

12&#xff0e;&#64;ptd(n,x) 自由度为 n 的 t 分布的累积分布函数。

13&#xff0e;&#64;qrand(seed) 产生服从(0,1)区间的拟随机数。&#64;qrand 只允许在模型的数据部分使用&#xff0c;它将用拟随机 数填满集属性。通常&#xff0c;声明一个 m×n 的二维表&#xff0c;m 表示运行实验的次数&#xff0c;n 表示每次实验所 需的随机数的个数。在行内&#xff0c;随机数是独立分布的&#xff1b;在行间&#xff0c;随机数是非常均匀的。这些随 机数是用“分层取样”的方法产生的。

14&#xff0e;&#64;rand(seed) 返回 0 和 1 间的伪随机数&#xff0c;依赖于指定的种子。典型用法是 U(I&#43;1)&#61;&#64;rand(U(I))。注 意如果 seed 不变&#xff0c;那么产生的随机数也不变。

集循环函数
其语法为
&#64;function(setname[(set_index_list)[|conditional_qualifier]]:
expression_list);
&#64;function相对应于下面罗列的四个集循环函数之一&#xff1b;setname是要遍历的集&#xff1b;set_index_list是集索引列表&#xff1b;conditional_qualifier 是用来限制集循环函数的范围&#xff0c;当集循环函数遍历集的每个成员时&#xff0c;LINGO都要对conditional_qualifier 进行评价&#xff0c;若结果为真&#xff0c;则对该成员执行&#64;function操作&#xff0c;否则跳过&#xff0c;继续执行下一次循环。expression_list是被应用到每个集成员的表达式列表&#xff0c;当用的是&#64;for函数时&#xff0c;expression_list 可以包含多个表达式&#xff0c;其间用逗号隔开。这些表达式将被作为约束加到模型中。当使用其余的三个集循环函数时&#xff0c; expression_list 只能有一个表达式。如果省略set_index_list &#xff0c;那么在expression_list中引用的所有属性的类型都是setname集。


  1. &#64;for
    该函数用来产生对集成员的约束。基于建模语言的标量需要显式输入每个约束。&#64;for函数允许只输入一个约束&#xff0c;然后LINGO 自动产生每个集成员的约束。

&#xff01;具体用法&#xff1a;
例&#xff1a;
sets:
r/1..8/:d;
c/1..8/:; !就算没有集合属性也要写":";
link(r,c):x,y; !派生集合;
endsets&#64;for(r(i):&#64;for(c(j):x(i,j)<&#61;y(i,j))); !可用&#64;for(link:x<&#61;y)代替;
&#64;for(r(i)|i#ge#2:d(i)>&#61;3) !":"前说的是对哪个集合进行约束&#xff0c;":"后面说的事具体是什么样的约束;
!"|"表示过滤&#xff0c;即筛选r(i)下标集中i>&#61;2的下标&#xff0c;即/2,3..8/;plus:lingo注释方法;!注释内容;

  1. &#64;sum
    该函数返回遍历指定的集成员的一个表达式的和。
  2. &#64;min和&#64;max
    返回指定的集成员的一个表达式的最小值或最大值。

金融函数&#xff1a;
&#64;fpa&#xff08;I,&#xff0c;n&#xff09;&#xff1a;返回一个现值&#xff0c;其单位时间利率为I&#xff0c;连续支付n个时间段&#xff0c;该支付所对应的现值。
示例程序如下&#xff1a;
贷款金额 50000 元&#xff0c;贷款年利率 5.31%&#xff0c;采取分期付款方式&#xff08;每
年年末还固定金额&#xff0c;直至还清&#xff09;。问拟贷款 10 年&#xff0c;每年需偿还多少元&#xff1f;

50000 &#61; x * &#64;fpa(.0531,10)&#64;fpl&#xff08;I&#xff0c;n&#xff09;&#xff1a;返回如下情形的净现值&#xff0c;单位时间的利率为I&#xff0c;第n个时间段支付单位费用的现值&#xff0c;可以认为对它求和得到&#64;fpa&#xff08;I&#xff0c;n&#xff09;的值。

辅助函数

&#64;if(logical_condition,true_result,false_result)
&#64;if 函数将评价一个逻辑表达式logical_condition&#xff0c;如果为真返回true_ result&#xff0c;
否则返回false_result。
&#64;warn(’text’,logical_condition)
如果逻辑条件logical_condition为真&#xff0c;则产生一个内容为’text’的信息框。
&#64;text(’…/data.txt’)&#61;xx; 将xx的值输入到相应路径下的文件中

参考&#xff1a;
https://wenku.baidu.com/view/9da2f6bff8c75fbfc67db215.html
https://blog.csdn.net/coco_happy1314/article/details/82078742
https://blog.csdn.net/lancecrazy/article/details/78306154
https://blog.csdn.net/gnoixl/article/details/81145892
https://blog.csdn.net/qq_26591517/article/details/50674581
https://blog.csdn.net/lancecrazy/article/details/78306154
https://blog.csdn.net/qq_41196612/article/details/88789605


推荐阅读
author-avatar
欣儿2502862161
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有