一、界面及基本用法 所有代码在 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集。
&#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注释方法;!注释内容;
&#64;sum 该函数返回遍历指定的集成员的一个表达式的和。 &#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