Lingo段编程快速入门

您所在的位置:网站首页 lingo怎么用 Lingo段编程快速入门

Lingo段编程快速入门

#Lingo段编程快速入门| 来源: 网络整理| 查看: 265

Lingo段编程,主要分为5个段。

集合段:定义要用到的集合与变量,(类似其他语言的数组)。

数据段:给部分变量赋值。

初始段:初始化迭代起始点。

计算段:程序运行开始时,需要计算的数据。

目标和约束段:编写目标函数和约束条件。

其中,常用的是集合段、数据段、目标和约束段,这三个段基本能解决绝大多数问题。初始段和计算段用的少,等用到了再学。下面介绍下各个段的使用。

一、集合段:

集合以sets:为开头,endsets为结尾。即:

sets:

! 集合段定义位置

endsets

集合段定义格式:集合名/集合长度/:属性变量;

例如,jh1/1..3/:x; 即定义了长度为3的集合,其中,这样长度的属性变量有一个,名为x。即你同时定义了x(1)、x(2)、x(3)。

例如,jh2/1..4/:y,z; 即定义了长度为4的集合,这样长度的属性变量有两个,名为y,z。即你同时定义了y(1),y(2),y(3),y(4),和z(1),z(2),z(3),z(4).

如果要定义二维以上的集合,则需要用到派生集合。

派生集合的定义方式:派生集合名(集合名1,集合名2):属性变量;

例如,根据前面定义的两个集合,派生出大小为3*4的集合,则可以这样定义:ps1(jh1,jh2):m; 即定义了集合名为ps1,里面有一个属性变量m,也就是同时定义了:m(1,1), m(1,2), m(1,3), m(1,4),

m(2,1), m(2,2), m(2,3), m(2,4),

m(3,1), m(3,2), m(3,3), m(3,4).

同样的,如果要定义3*3的集合,则可以用两个长度为3的集合来派生,即:ps2(jh1,jh1):a;

二、数据段

数据段很简单,就是给变量赋值的地方。以data:开头,enddata结尾。

Data:

! 数据段定义位置

enddata

例如,给我们前面定义的变量x(长度为3)赋值,则可以:

X = 1, 2, 3;

给集合m(大小为3*4)赋值,则可以:

M = 1 2 3 4

5 6 7 8

9 10 11 12;

注意 数据和数据之间用逗号或者空格分割都可以,赋值结束需要加分号。

三、目标和约束段

根据目标函数和约束条件编写代码。

目标,基本只需要min 和max关键字即可。

在学习目标和约束段之前,需要先学习几个常用函数:

1、求和函数@sum( ),调用格式:@sum(集合名 : 属性变量表达式)

这里就需要区分集合名和属性变量了。

例1-1:表示

,也就是x(1)+x(2)+x(3),x是定义在集合jh1里的。

则可以用语句表示为:@sum(jh1(i):x(i)),其中i为循环控制下标。(只需前后一致即可,未必要使用字母i。下标会根据集合的大小自动遍历)

例1-2:表示

,也就是z(1)*y(1)+z(2)*y(2)+...+z(4)*y(4),z,y定义在集合jh2里。

可以表示为:@sum(jh2(i):z(i)*y(i)) < 10

例1-3:表示:

Mi1 + mi2 + mi3 + mi4

@sum(jh2(j) : m(1,j)) ;

两个求和符号,其实经历了两步:

M(1,1)M(1,2)M(1,3)M(1,4)@sum(jh2(j):m(1, j))M(2,1)M(2,2)m(2,3)M(2,4)@sum(jh2(j):m(2, j))M(3,1)M(3,2)M(3,3)M(3,4)@sum(jh2(j):m(3, j))

先求出每行的和,再把每行的和进行求和。因此,可以写成:

@sum(jh1(i): @sum(jh2(j):m(i, j)) ) < 5

也可以利用派生集合,让@sum函数一次性遍历集合内所有元素并求和:

@sum(ps1(i,j): m(i,j)) < 5

2、循环函数@for()。调用形式:@for(集合名:属性变量表达式)

例2-1:让

,也就是让x(1)>3,x(2)>3,x(3)>3

这时候我们可以用@for操作:@for(jh1(i): x(i) > 3);

例2-2,sum和for的结合

M(1,1)M(1,2)M(1,3)M(1,4)@sum(jh2(j) : m(1, j))M(2,1)M(2,2)m(2,3)M(2,4)@sum(jh2(j) : m(2, j))M(3,1)M(3,2)M(3,3)M(3,4)@sum(jh2(j) : m(3, j))

把黄底字用循环控制,即成为了@for(jh1(i): @sum(jh2(j):m(i, j))

@for(jh1(i) : @sum(jh2(j)| : m(i,j)) > x(i) )

这里,如果不对下标j做限制,Lingo会自动认为j从1到4.因此,需要添加过滤条件。

@for(jh1(i): @sum(jh2(j) | j#ge#2 #and# j#le#3 :m(i,j) ) > x(i) );

附常用Lingo函数,其他函数用到时可百度:

实例:

设bj为目标函数中x前的系数,即bj = 2,3,1;

设C_ij是约束条件中x前的系数 c_ij = 1,4,2, 3,2,0;

设d_i是约束条件中的常数, d_i = 8,6;

model:sets:row/1..2/:d;col/1..3/:a,x;link(row,col):c;endsetsdata:a = 2,3,1;c = 1,4,2, 3,2,0;d = 8,6;enddatamin = @sum(col(j):a(j)*x(j));@for(row(i): @sum(col(j):c(i,j)*x(j)) > d(i));end

即:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3