Lingo初识

这篇博客介绍了Lingo在数模比赛中的应用,主要用于解决线性或非线性规划问题。Lingo的基本用法包括建立公式和约束条件,并通过示例展示了如何用lingo解决实际问题。文章提到了Lingo的语法特点,如变量默认非负,变量不区分大小写,以及如何定义集等。最后,博主分享了在使用Lingo时的一些注意事项和资源链接。

明天要进行数模比赛,今天晚上看了一些lingo的教程,整理成博客,有新的内容以后会添加。

Lingo作用

lingo对于一些线性或者非线性的规划,优化问题非常有效,在此不做展开。


Lingo基本用法

实际上lingo的操作需要建立在公式上,如果事先整理好公示以及约束条件,那么只需要转化成代码即可

公式非常重要!


接下来放些例题

例题一:


max=98*x1+277*x2-x1^2-0.3*x1*x2-2*x2^2; !目标函数;

!约束条件;
x1<=2*x2;
x1+x2<100;

@gin(x1);@gin(x2); !x1 x2非负整数

@gin()表示限制括号内参数为整数

这题很简单,看看即可。

最后会打印max。


这道例题可能不需要lingo,但是当数据量和约束条件复杂时,lingo能节省很多计算量。

例题二

建筑工地的位置(用平面坐标a,b表示,距离单位:公里)及水泥日用量d(吨)下表给出。有两个临时料场位于P (5,1), Q (2, 7),日储量各有20吨。从A, B两料场分别向各工地运送多少吨水泥,使总的吨公里数最小。两个新的料场应建在何处,节省的吨公里数有多大?




MODEL:
Title Location Problem;

sets:
	    demand/1..6/:a,b,d; !该集合对应着建筑工地,每一个建筑工地有两个坐标还有一个需求量,所以元素有三个;
    supply/1..2/:x,y,e; !该集合对应着料场,元素是坐标与储存量;
    link(demand,supply):c; !由上面的demand supply派生而成,可以认为现在link是一个6行(demand)2列(supply)的矩阵,
                                                      矩阵中元素的值代表着每一个建筑工地接受各个料场的具体水泥量;
endsets

data:
!locations for the demand(需求点的位置);
a=1.25,8.75,0.5,5.75,3,7.25;
b=1.25,0.75,4.75,5,6.5,7.75;
!quantities of the demand and supply(供需量);
d=3,5,4,7,6,11; e=20,20;
enddata

init:
!initial locations for the supply(初始点);
x,y=5,1,2,7;
endinit

!Objective function(目标);
min=@sum(link(i,j): c(i,j)*((x(j)-a(i))^2+(y(j)-b(i))^2)^(1/2) ); !表示对link中所有元素即六行二列都进行此求和操作;
!demand constraints(需求约束);
@for(demand(i):@sum(supply(j):c(i,j)) =d(i);); !@sum里面表示对j进行循环用supply,@for表示对i进行循环用demand(i),
                                                这里表示对所有的建筑工地,工地对应的的需求量等于各个草料场供给量的和;

!supply constraints(供应约束);
@for(supply(i):@sum(demand(j):c(j,i)) <=e(i); );

@for(supply: @bnd(0.5,X,8.75); @bnd(0.75,Y,7.75); ); !表示x, y的范围,@bnd(a, x, b): a <= x <= b;
END

这里介绍一个概念:集。

定义方法:

setname[/member_list/][:attribute_list]; 

注意:用“[]”表示该部分内容可选。

如: demand/1..6/:a,b,d;

这个概念类似于c的结构体,Java的类

demand为类名,a,b,d为属性。

具体可结合上面的例子分析。


注意事项

LINGO总是根据“MAX=”“MIN=”寻找目标函数;

程序语句的顺序一般不重要,既可以随意调换;

程序运用函数时都是以@开头;

程序中的变量默认为非负数,想要改变变量类型必须有相应函数调整

程序中变量不区分大小写;

语句必须以分号结尾;

注释以!开始,且注释语句后面必须也有分号,注释默认注释到第一个分号处,意思是分号前面会全部被注释掉。


本篇博客来源这篇文章,如果想了解的更详细,可点击查看。

lingo入门教程


PS:我在复制粘贴代码运行时,发现注释即使格式正确,还是会有部分代码会被当成注释,建议删除注释运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值