Lingo学习笔记

Lingo是很好用的规划类问题求解器,相对matlab而言,其形式更加灵活。其实我用的也不是非常多,只是用来求解一些数模或者作业里面的规划类问题。本文简单地罗列一下用过的函数、功能等。


一、界面简介

在这里插入图片描述
前面一些新建,打开文件夹,保存什么的就不一一介绍了。主要还是知道一下solver的位置,就是红色圈圈那个,模型写好后点击这个就可以运行了。
其他我用过的还有最上面菜单栏的solver-option。有时候模型比较复杂容易陷入局部最优,于是在里面选择global solver,还可以设置步长。


二、求解格式

model:
sets:
!这里可以设置集合
endsets

data:
!这里初始化数据
enddata

min=a+b+c+d;
!可以用min也可以用max
!这里可以写很多约束条件,不像matlab那样要转化成标准格式输入
end

举例:
set里面相当于声明了数组的长度,维度,以及后面写for循环时可以直接使用这个集合的类型名。
data里面赋值的长度一定要跟sets里面声明的一样长。

model:
sets:
supply/1..20/:c,k2; 
week/1..24/:in,out,s;
trans/1..6/:tr;
week1/1..23/:;
link1(supply,week):k1,m;  
endsets

data:
Mi=56400;
c=
1.38889	1.66667	1.51515	1.51515	1.66667	1.38889	1.66667	1.66667	1.66667	1.38889	1.51515	1.66667	1.51515	1.51515	1.51515	1.38889	1.51515	1.66667	1.51515	1.38889
;
m=
1859	19	11	94	981	1239	123	1284	151	1497	1448	1677	2188	1499	1313	1351	1237	1454	231	1615	223	1899	1574	1666
132	198	1666	1351	875	1474	858	1326	117	2136	1585	1629	136	1538	188	1429	975	1486	144	78	1248	2221	115	112
15543	0	1	0	14866	13	7	6	13	3	6	5	6	7	12	9	8	3	4	3	5	4	2	5
774	625	792	79	822	849	773	7	814	78	779	688	786	759	781	66	84	73	668	639	725	636	755	698
635	453	631	525	75	676	643	581	648	576	628	612	67	614	724	523	643	54	62	519	583	513	557	547
32	523	683	876	122	1181	835	729	93	879	877	681	757	96	991	97	77	758	798	777	811	742	779	961
337	493	812	67	726	81	754	632	686	77	623	537	6	793	686	785	766	569	611	639	676	632	553	73
413	258	27	162	178	33	448	625	77	839	856	889	926	1119	995	936	959	172	1216	1351	1412	1271	136	78
634	617	62	744	853	878	73	698	894	552	719	822	831	966	83	64	711	671	687	76	744	532	786	779
414	468	76	574	667	893	733	564	785	555	647	744	714	859	525	619	596	75	576	716	684	68	599	66
246	426	29	231	252	337	219	35	173	254	266	284	29	348	186	299	224	271	295	171	264	262	238	293
52	519	61	66	66	687	535	54	584	556	526	475	477	632	559	548	531	513	524	517	495	57	531	535
9253	0	7931	0	4	26	21	17	34	12	13	9	16	19	21	5	17	7	15	6	1	13	9	4
28	282	448	228	32	299	259	323	271	216	24	288	252	385	39	232	219	24	294	283	152	313	221	279
439	314	435	399	437	378	466	35	627	6	649	536	67	57	589	466	494	47	511	443	548	473	546	538
69	31	22	345	289	16	166	366	69	726	754	78	149	847	765	78	621	666	675	699	1222	98	631	1478
0	0	0	4	0	0	0	0	6	122	161	6	18	42	55	16	78	47	49	45	38	48	59	58
35	325	416	418	487	536	46	384	427	424	44	441	45	499	426	46	389	447	431	39	384	394	42	438
474	414	466	467	539	693	599	495	536	55	469	49	488	612	64	625	65	591	552	531	49	48	483	51
582	4	673	42	471	79	57	3	418	63	62	42	423	197	356	41	519	94	581	48	285	171	362	24

;

enddata
min=@sum(supply(i):k2(i));
@for(week(j):in(j)=@sum(supply(i):k1(i,j)*m(i,j)*c(i));
@for(week(j):out(j)=28200);
s(1)=56400+in(1)-out(1));
@for(week1(j):s(j+1)=s(j)+in(j+1)-out(j+1));

@for(supply(i):k2(i)=@if(@sum(week(j):k1(i,j)),1,0));

@for(week(j):s(j)>mi);
@for(link1(i,j):@bin(k1(i,j)));

end

三、基础函数

1.数据类型

一般默认变量连续非负,如果想要设置为0-1变量,可以

@bin(x1);

如果是整数变量,

@gin(x1);

2.for 循环

格式:week1是sets里面定义好的,具体可以看上面的代码。冒号后面直接接语句就行了。

@for(week1(j):s(j+1)=s(j)+in(j+1)-out(j+1));

3.sum求和

格式跟循环类似,一般要赋值给等式左边:

k=@sum(supply(i):k2(i));

4.if语句

实现如果a>3,k=1,否则k=0:

k=@if(a>3,1,0));
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
LINGO是用来求解线性和非线性优化问题的简易工具。LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果。 §1 LINGO快速入门 当你在windows下开始运行LINGO系统时,会得到类似下面的一个窗口: 外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO的默认模型窗口,建立的模型都都要在该窗口内编码实现。下面举两个例子。 例1.1 如何在LINGO中求解如下的LP问题: 在模型窗口中输入如下代码: min=2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600; 然后点击工具条上的按钮 即可。 例1.2 使用LINGO软件计算6个发点8个收点的最小费用运输问题。产销单位运价如下表。 单 位 销地 运 价 产地 B1 B2 B3 B4 B5 B6 B7 B8 产量 A1 6 2 6 7 4 2 5 9 60 A2 4 9 5 3 8 5 8 2 55 A3 5 2 1 9 7 4 3 3 51 A4 7 6 7 3 9 2 7 1 43 A5 2 3 9 5 7 2 6 5 41 A6 5 5 2 2 8 1 4 3 52 销量 35 37 22 32 41 32 43 38 使用LINGO软件,编制程序如下: model: !6发点8收点运输问题; sets: warehouses/wh1..wh6/: capacity; vendors/v1..v8/: demand; links(warehouses,vendors): cost, volume; endsets !目标函数; min=@sum(links: cost*volume); !需求约束; @for(vendors(J): @sum(warehouses(I): volume(I,J))=demand(J)); !产量约束; @for(warehouses(I): @sum(vendors(J): volume(I,J))<=capacity(I)); !这里是数据; data: capacity=60 55 51 43 41 52; demand=35 37 22 32 41 32 43 38; cost=6 2 6 7 4 2 9 5 4 9 5 3 8 5 8 2 5 2 1 9 7 4 3 3 7 6 7 3 9 2 7 1 2 3 9 5 7 2 6 5 5 5 2 2 8 1 4 3; enddata end 然后点击工具条上的按钮 即可。 为了能够使用LINGO的强大功能,接着第二节的学习吧。 §2 LINGO中的集 对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等。LINGO允许把这些相联系的对象聚合成集(sets)。一旦把对象聚合成集,就可以利用集来最大限度的发挥LINGO建模语言的优势。 现在我们将深入介绍如何创建集,并用数据初始化集的属性。学完本节后,你对基于建模技术的集如何引入模型会有一个基本的理解。 2.1 为什么使用集 集是LINGO建模语言的基础,是程序设计最强有力的基本构件。借助于集,能够用一个单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型。 2.2 什么是集 集是一群相联系的对象,这些对象也称为集的成员。一个集可能是一系列产品、卡车或雇员。每个集成员可能有一个或多个与之有关联的特征,我们把这些特征称为属性。属性值可以预先给定,也可以是未知的,有待于LINGO求解。例如,产品集中的每个产品可以有一个价格属性;卡车集中的每辆卡车可以有一个牵引力属性;雇员集中的每位雇员可以有一个薪水属性,也可以有一个生日属性等等。 LINGO有两种类型的集:原始集(primitive set)和派生集(derived set)。 一个原始集是由一些最基本的对象组成的。 一个派生集是用一个或多个其它集来定义的,也就是说,它的成员来自于其它已存在的集。 2.3 模型的集部分 集部分是LINGO模型的一个可选部分。在LINGO模型中使用集之前,必须在集部分事先定义。集部分以关键字“sets:”开始,以“endsets”结束。一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分。一个集部分可以放置于模型的任何地方,但是一个集及其属性

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Huiyeee

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

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

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

打赏作者

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

抵扣说明:

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

余额充值