Lingo段编程快速入门 |
您所在的位置:网站首页 › lingo怎么用 › Lingo段编程快速入门 |
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的结合 把黄底字用循环控制,即成为了@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; 即: |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |