使用Lingo求解简单的线性规划问题

我们使用lingo可以解决数学规划问题,网络优化,多目标规划,博弈论,排队论,决策分析以及最小二常法等问题,而且编程简单易懂,是我们进行建模开发的必备技能之一。

1.Lingo中关系运算符

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

2.数学函数

LINGO提供了大量的标准数学函数,具体如下表所示:

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

3.变量界定函数

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

4.sum函数与for函数

1.sum函数

使用语法:

@sum(集合(下标):集合表达式);

代码示例:

表达方式示例
数学表达式 m i n = ∑ i = 1 3 ∑ j = 1 3 x ( i ) ∗ d ( i , j ) min=\sum_{i=1}^{3}\sum_{j=1}^{3}x(i)*d(i,j) min=i=13j=13x(i)d(i,j)
Lingo编码 m i n = min= min=@ s u m ( a r c ( i , j ) : x ( i ) ∗ d ( i , j ) ) sum(arc(i,j):x(i)*d(i,j)) sum(arc(i,j):x(i)d(i,j))

arc是一个3*3集合(矩阵)

2.for函数

使用方法:

@for(集合(下标)[逻辑表达式]:集合表达式);

代码示例:

表达方式示例
数学表达式 x ( i ) < 10 ; i ϵ { 1 , 2 , 3 } x(i)<10;i\epsilon\left \{ 1,2,3 \right \} x(i)<10;iϵ{1,2,3}
Lingo编码@ f o r ( n o d e ( i ) : x ( i ) < 10 ) for(node(i):x(i)<10) for(node(i):x(i)<10)

node同样是一个集合(矩阵)

5.常见的线性规划问题

在这里插入图片描述
对应求解的lingo程序如下所示:

model:
sets:
row/1..3/:b;
col/1..4/:c,x;
link(row,col):a;
endsets
data:
c=6 2 3 9;
a=5 6 -4 -4  3 -3 2 8  4 2 -1 3;
b=2 25 10;
enddata
max=@sum(col:c*x);
@for(row(i):@sum(col(j):a(i,j)*x(j))<b(i));
end

注意:lingo程序中的变量默认都是非负数。

在这里插入图片描述
对应的lingo程序如下所示:

model:
sets:
row1/1..4/:b1;
row2/1..2/:b2;
col/1..5/:c,x;
link1(row1,col):a1;
link2(row2,col):a2;
endsets
data:
c=10 2 1 8 6;
a1=1 0 1 0 0  0 1 0 1 0  0 0 1 0 1  0 0 0 1 1;
a2=1 2 1 1 -1  2 0 0 3 5;
b1=100 200 300 500;
b2=-400 -220;
enddata
min=@sum(col:c*x);
@for(row1(i):@sum(col(j):a1(i,j)*x(j))=b1(i));
@for(row2(i):@sum(col(j):a2(i,j)*x(j))>b2(i));
@for(col:@free(x));
end

在这里插入图片描述
对应求解的lingo程序如下所示:

model:
sets:
row/1..3/:b;
col/1..5/:c,x,L,U;
link(row,col):a;
endsets
data:
b=20 30 10;
c=8 6 5 9 3;
a=2 9 -1 3 1  1 -3 2 6 1  1 2 -1 1 -2;
L=-10 -50 -15 -20 -30;
U=20,50,60,30,10;
enddata
min=@sum(col:c*x);
@for(row(i):@sum(col(j):a(i,j)*x(j))<=b(i));
@for(col:@bnd(L,x,U));
end
Lindo 和 Lingo 是美国 Lindo 系统公司开发的一套专门用于求解最优化问题的软件包。Lindo 用于求解线性规划和二次规划问题,Lingo 除了具有 Lindo 的全部功能外,还可以用于求解线性规划问题,也可以用于一些线性和非线性方程(组)的求解,等等。Lindo 和 Lingo 软件的最大特色在于可以允许优化模型中的决策变量是整数(即整数规划),而且执行速度很快。   Lingo 实际上还是最优化问题的一种建模语言,包括许多常用的函数可供使用者建立优化模型时调用,并提供与其他数据文件(如文本文件、Excel电子表格文件、数据库文件等)的接口,易于方便地输入、求解和分析大规模最优化问题。   由于这些特点,Lindo系统公司的线性、非线性和整数规划求解程序已经被全世界数千万的公司用来做最大化利润和最小化成本的分析。应用的范围包含生产线规划、运输、财务金融、投资分配、资本预算、混合排程、库存管理、资源配置等等...   Lindo/Lingo 软件作为著名的专业优化软件,其功能比较强、计算效果比较好,与那些包含部分优化功能的非专业软件相比,通常具有明显的优势。此外,Lindo/Lingo 软件使用起来非常简便,很容易学会,在优化软件(尤其是运行于个人电脑上的优化软件)市场占有很大份额,在国外运筹学类的教科书中也被广泛用做教学软件。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

散一世繁华,颠半世琉璃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值