redis-cli 批量执行命令

js 计算图片比例

  返回  

1.3 matlab与LINGO编程

2021/7/20 18:54:51 浏览:

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

LINGO编程简介与实例

  • 一.LINGO使用介绍
    • 1. LINGO编写格式
    • 2 .LINGO内部函数使用详解.
  • 二、LINGO求解优化模型实例

一.LINGO使用介绍

LINGO是一种专门用于求解数学规划问题的软件包。由于LINGO执 行速度快,易于方便地输入、求解和分析数学规划问题,因此在 教学、科研和工业界得到广泛应用。 LINGO主要用于求解线性规划 、非线性规划、二次规划和整数规划等问题,也可以用于求解一 些线性和非线性方程组及代数方程求根等。

1. LINGO编写格式

LINGO模型以MODEL开始,以END结束.中间为语句,分为四大部分。
(1)集合部分(SETS):这部分以“SETS:”开始,以“ENDSETS”结 束. 这部分的作用在于定义必要的变量,便于后面进行编程进行大规模计 算,在LINGO中称为集合(SET)及其元素和属性。
LINGO中的集合有两类:一类是原始集合,其定义的格式为:
SETNAME/member list(or 1…n)/:attribute,attribute,etc.
另一类是导出集合,即引用其它集合定义的集合,其定义的格式为:
SETNAME(set1,set2,etc.):attribute,attribute,etc.
如果要在程序中使用数组,就必须在该部分定义,否则可不需要. 如
Person/1…10/:A;
Task/1…12/:B;
Link(Person,Task):X;
(2) 目标与约束:这部分定义了目标函数、约束条件等。 一般要用到 LINGO的内部函数。求解优化问题时,该部分是必须的.
(3)数据部分(DATA):这部分以“DATA:”开始,以“END DATA” 结束。其作用在于对集合的属性(数组)输入必要的数值. 格式为:attribute=value_list。该部分主要是方便数据的输入.
(4)初始化部分(INIT):这部分以“INIT:”开始,以“END INIT”结 束。作用在于对集合的属性(数组)定义初值.格式为: attribute=value_list.
编写LINGO程序要注意的几点:
(1) 所有的语句除SETS、ENDSETS、DATA、ENDDATA、INIT、ENDINIT和 MODEL,END之外必须以一个分号“;”结尾。
(2) LINGO求解非线性规划时已约定各变量非负

2 .LINGO内部函数使用详解.

LINGO建立优化模型时可以引用大量内部函数, 这些函数以“@”符号打头.
(1)常用数学函数

@ABS(X) 返回变量X的绝对数值.
@COS(X) 返回X的余弦值,X的单位为弧度
@EXP(X)返回指数函数值,其中e=2.72828…
@FLOOR(X)向0靠近返回X的整数部分.
@LGM( X) 返回Γ函数的自然对数值.
@LOG( X) 返回变量X的自然对数值
@SIGN( X) 返回变量X的符号值,当X<0时为-1; 当X>0时为1.
@SIN( X) 返回X的正弦值,X的单位为弧度
@SMAX( X1, X2,…, XN) 返回一列值X1, X2,…, XN的最大值.
@SMIN( X1, X2,…, XN) 返回一列值X1, X2,…, XN的最小值. @TAN( X) 返回X的正切值,X的单位为弧度

(2)集合函数 集合函数的用法如下:

set_operator (set_name|condition:expression)
其中set_operator是集合函数名,set_name是数据集合名,expression 部分是表达式,|condition部分是条件,用逻辑表达式描述(无条件时 可省略)。
逻辑表达式中可以三种逻辑算符#AND#(与),
#OR#(或),#NOT#(非) 和六种关系算符#EQ#(等于),#NE#(不等于),#GT#(大于),#GE# (大于等于),#LT#(小于),#LE#(小于等于)。

常见的集合函数如下:
@FOR (set_name:constraint_expressions)对集合(set_name)的每个元素 独立地生成约束,约束由约束表达式(constraint_expressions)描述.
@MAX(set_name:expression)返回集合上表达式(expression)的最大值.
@MIN(set_name:expression)返回集合上的表达式(expression)最小值.
@SUM(set_name:expression)返回集合上的表达式(expression)的和.
@SIZE(set_name)返回数据集set_name中包含元素的个数. @IN(set_name,set_element)如果数据集set_name中包含元素 set_element 则返回1,否则返回0

(3)变量界定函数
变量函数对变量的取值范围附加限制,共有四种. @BND(L,X,U)限制L<=X<=U
@BIN(X)限制X为0或1.
@FREE(X)取消对X的符号限制(可取任意实数值).
@GIN(X)限制X为整数值.

二、LINGO求解优化模型实例

1.某昼夜服务的公交路线 每天各时间区段内需司机 和乘务人员见表1。 设司机和乘务人员分别在各 时间区段一开始上班,并连 续工作八小时,问该公交线 路至少配备多少名司机和乘 务人员?从第一班开始排, 试建立线性模型.
在这里插入图片描述
上班的时间点有6,10,14,18,22,2点这几个点
设xi为第i班报道人员(i=1,····,6)
总共需要的人员为x1+x2+···+x6
所以有以下的约束条件:
x1+x6>=60;
x1+x2>=70;
x2+x3>=60;
x3+x4>=50;
x4+x5>=20;
x5+x6>=30;
LINGO程序如下:

MODEL: 
min=x1+x2+x3+x4+x5+x6; 
x1+x6>=60; 
x1+x2>=70; 
x2+x3>=60; 
x3+x4>=50; 
x4+x5>=20; 
x5+x6>=30; 
END 

结果为:

					      Variable           Value        Reduced Cost
                                  X1        60.00000            0.000000
                                  X2        10.00000            0.000000
                                  X3        50.00000            0.000000
                                  X4        0.000000            0.000000
                                  X5        30.00000            0.000000
                                  X6        0.000000            0.000000

得到的解为: x1=60,x2=10,x3=50,x4=0,x5=30,x6=0; 配备的司机和乘务人员最少为150人.
2. 公司在各地有4项业务, 选定了4位业务员去处理. 由于业务能力、经验和 其它情况不同,4业务员 处理4项业务的费用 (单位:元)各不相同,见表2。 应当怎样分派任务, 才能使总的费用最小?
在这里插入图片描述
约束条件为:
在这里插入图片描述
每个任务只能有一位业务员完成,所以每列和为1
每个业务员只能完成一项业务,每行为1

这是一个最优指派问题,引入一个矩阵xij=0或1,四行四列,若分派第i个人作第j项任务为1,反之为0,表一可以为第i个人做第j项业务的花费矩阵,可以建立优化模型及LINGO程序。

MODEL: 
SETS: 
person/1..4/; 
task/1..4/; 
assign(person,task):a,x; 
ENDSETS 
DATA: 
a=1100,800,1000,700, 600,500,300,800, 400,800,1000,900, 1100,1000,500,700; 
ENDDATA 
min=@sum(assign:a*x); 
@for(task(j):@sum(person(i) :x(i,j))=1); 
@for(person(i):@sum(task(j) :x(i,j))=1); 
@for(assign(i,j):@bin(x(i,j))); 
END

结果为:
X( 1, 1) 0.000000 1100.000
X( 1, 2) 0.000000 800.0000
X( 1, 3) 0.000000 1000.000
X( 1, 4) 1.000000 700.0000
X( 2, 1) 0.000000 600.0000
X( 2, 2) 1.000000 500.0000
X( 2, 3) 0.000000 300.0000
X( 2, 4) 0.000000 800.0000
X( 3, 1) 1.000000 400.0000
X( 3, 2) 0.000000 800.0000
X( 3, 3) 0.000000 1000.000
X( 3, 4) 0.000000 900.0000
X( 4, 1) 0.000000 1100.000
X( 4, 2) 0.000000 1000.000
X( 4, 3) 1.000000 500.0000
X( 4, 4) 0.000000 700.0000

也可以采用数据文件方式程序

model: 
sets: person/1..4/; 
task/1..4/; 
assign(person,task):a,x; 
endsets 
data: 
a=@file(data.txt); 
enddata 
min=@sum(assign:a*x); @for(person(i):@sum(task(j):x(i,j))=1); @for(task(j):@sum(person(i):x(i,j))=1); @for(assign(i,j):@bin(x(i,j))); 
end

同时在LINGO目录下建立文本文件data.txt,数据如下:

1100,800,1000,700 600,500,300,800 400,800,1000,900 1100,1000,500,700

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号