“段”的使用- LINGO实验华中农业大学建模基地

Download Report

Transcript “段”的使用- LINGO实验华中农业大学建模基地

华中农业大学建模基地
LINGO实验
请同学们掌握调课的方法
课程只能在一周之内调动,即
不能把本周的课调到下周。
第五次课也是课堂作业,望同
学们要预习一下。仓促做作业,
效果很差。
系统的问题,我们会逐步解决。
华中农业大学建模基地
系统可自由进行课堂调整
LINGO实验
第一步,登陆试验管理系统,点击“预约明
细”,点击“大学数学实验”
华中农业大学建模基地
LINGO实验
第二步,在调整的项目后点击“删除”,
弹出窗口
华中农业大学建模基地
LINGO实验
第三步,在周次后点击“第四周”(原
时间在哪周就调整到哪周),弹出窗口
LINGO实验
华中农业大学建模基地
第四步,点击可选课堂,在弹出窗口下面选择
实验室。点击窗口下方的“确定”以及弹出的
提示窗口的“确定”。
第五步,再次点击“预约明细”,点击“大学
数学实验”,才能查看修改后的信息
华中农业大学建模基地
优化软件LINGO使用入门
Lingo12初步
华中农业大学建模基地
LINGO实验
-LINGO入门-
1
初始印象
2
傻瓜输入法
3
4
“段”的使
用
数据交换
5
程序结构与调试
华中农业大学建模基地
LINGO实验
-初始印象-
界面介绍
工具栏
文件类型
运行过程
求解器状态窗口
求解报告窗口
华中农业大学建模基地
LINGO实验
-界面介绍-
• LINGO软件的主窗口(用
户界面),所有其他窗口
都在这个窗口之内。
• 当前光标的
位置
• 状态行(最左边显示
“Ready”,表示
“准备就绪”)
• 模型窗口(Model
Window),用于输
入LINGO优化模型
(即LINGO程序)。
• 当前时间
华中农业大学建模基地
LINGO实验
-工具栏-
File|Open
(F3)
打开文件
Edit|Copy
(Ctrl+C)
复制
File|Print
(F7)
打印文件
Edit|Undo
(Ctrl+Z)
取消操作
File|Save
(F4)
保存文件
File|New
(F2)
新建文件
Edit|Find
(Ctrl+F)
查找
Edit|Redo
(Ctrl+Y)
恢复操作
LINGO|Options
(Ctrl+I)
选项设置
LINGO|Solution
(Alt+O)显示解答
Edit | Go
To Line
(Ctrl+T)
定位某行
Edit|Paste
(Ctrl+V)
粘贴
Edit|Cut
(Ctrl+X)
剪切
Edit|Match
Parenthesis
(Ctrl+P)
匹配括号
LINGO|Sol
ve
(Ctrl+S)
求解模型
LINGO|Picture
(Ctrl+K)
模型图示
Window|Close All
(Alt+X)
关闭所有窗口
Help|Contents
(F1)
在线帮助
Window|Tile
(Alt+T)
平铺窗口
Window|Send to Back
(Ctrl+B)
窗口后置
上下文
相关的
帮助
华中农业大学建模基地
LINGO实验
-文件类型-
*.LG4:LINGO格式的模型文件,保存了模型窗口中所能够看到
的所有文本和其他对象及其格式信息;
*.LNG:文本格式的模型文件,不保存模型中的格式信息(如字
体、颜色、嵌入对象等);
除“LG4”文件外,
*.LDT:LINGO数据文件;
另外几种格式的文件
都是普通的文本文件,
*.LTF:LINGO命令脚本文件;
可以用任何文本编辑
*.LGR:LINGO报告文件;
器打开和编辑。
*.LTX: LINDO格式的模型文件;
*.MPS:示MPS(数学规划系统)格式的模型文件。
华中农业大学建模基地
LINGO实验
-运行过程-
1. 确定常数
2. 识别类型
LINDO/LINGO预处理程序
LP QP
NLP
IP
全局优化(选)
分枝定界管理程序
ILP
线性优化求解程序
1. 单纯形算法
2. 内点算法barrier(选)
IQP
INLP
非线性优化求解程序
1.顺序线性规划法(SLP)
2.广义既约梯度法(GRG) (选)
3.多点搜索(Multistart) (选)
华中农业大学建模基地
LINGO实验
-求解器状态窗口-
LP,QP,ILP,IQP,PILP,
PIQP,NLP,INLP,PINLP
变量数量
模型类型
T
Class
N
In
当前解状态
当前目标函数值 Ob
Infe
Ite
约束数量
"Global Optimum", "Local
Optimum", "Feasible",
"Infeasible“(不可行),
"Unbounded“(无界),
"Interrupted“(中断),
"Undetermined“(未确定)
T
约束不满足的总量
N
目前为止的迭代次数
扩展求解器
使用的特殊求解程序
到目前的最佳目标值
目标函数值的界
非零系数数量
T
Type
Obj
N
B-and-B
Global
Multistart
内存使用数量
特殊求解程序当前运行步数
有效步数
更新时间间隔
求解花费时间
分枝数(对B-and-B程序);
子问题数(对Global程序);
初始点数(对Multistart程序)
可直接求
解的变量
不作为决
策变量。
华中农业大学建模基地
-求解报告窗口-
LINGO实验
华中农业大学建模基地
LINGO实验
-初始印象练习-
打开lingo程序,将下面代码复制粘
贴到模型窗口,并运行后观察结果报告。
model:
title 入门练习;
max=2*x1+3*x2;
2*x1+x2<8;
4*x1+3*x2<15;
END
华中农业大学建模基地
LINGO实验
-傻瓜输入法-
傻瓜输入法格式
注意事项
算术运算符
逻辑运算符
数学函数
华中农业大学建模基地
LINGO实验
-傻瓜输入法格式-
例 直接用LINGO来解如下二次规划问题:
max 98 x1  277x2  x12  0.3x1 x2  2 x22
s.t.
x1  x2  100, x1  2 x2
x1 , x2  0, 取整
Model:
Title:傻瓜输入法;
!小程序可用,大程序不提倡;
[st1]x1+x2<100;
[opt]max=98*x1+277*x2-x1^2-0.3*x1*x2-2*x2^2;
[st2]x1<=2*x2;
@gin(x1);@gin(x2);
end
华中农业大学建模基地
LINGO实验
-注意事项-








“>”(或“<”)号与“>=”(或“<=”)功能相同;
LINGO模型以“MODEL:”开始,“END”结束;
目标函数为“MAX=”。不需要写“ST” ;
变量与系数间有乘号运算符“ * ”;
变量名以字母开头,不能超过64个字符;
变量名不区分大小写(包括LINGO中的关键字);
语句的顺序不重要;
行号自动产生或人为定义。目标函数所在行是第一行,
第二行起为约束条件,约束行名字被放“〔 〕”中;
 行中注有“!”符号的后面部分为注释;
华中农业大学建模基地
LINGO实验
-注意事项-





在模型的开头可以用“TITLE” 对模型命名;
变量可以放在约束右端;
每行(目标,约束,说明语句)后增加 “;”;
@开头都是函数调用;
上下界限定用@BND(),不计入模型的约束,也不能
给出其松紧判断和敏感性分析;
 缺省假定所有变量非负;可在模型的“END”语句后用
“@FREE() ”将变量的非负假定取消;
 对0-1变量说明:@BIN();对整型变量说明:@GIN
();
 模型由一系列语句组成,适当缩进,增强可读性。
华中农业大学建模基地
-算术运算符-
数与数之间的运算,运算结果也是数。
LINGO中的算术运算符有以下5种:
+(加法),
-(减法或负号),
*(乘法),
/(除法),
^ (求幂)。
LINGO实验
华中农业大学建模基地
LINGO实验
-关系运算符-
表示是“数与数之间”的大小关系,在LINGO中用
来表示优化模型的约束条件。
LINGO中关系运算符有3种:
<(即<=,小于等于);
=(等于),
>(即>=,大于等于)
在优化模型中约束一般没有严格小于、严格大于关系.
华中农业大学建模基地
LINGO实验
-数学函数-
@ABS(X):返回X的绝对值。
@SIN(X):正弦函数,返回X的正弦值(X的单位是弧度)。
@COS(X):返回X的余弦值(X的单位是弧度)。
@TAN(X):正切函数,返回X的正切值(X的单位是弧度)。
@EXP(X):返回eX的值(其中e=2.718281...)。
@POW(X,Y):指数函数,返回XY的值。
@SQR(X):平方函数,返回X的平方(即X*X)的值。
@SQRT(X):开平方函数,返回X的正的平方根的值。
@LOG(X):返回X的自然对数值。
华中农业大学建模基地
LINGO实验
-数学函数-
@MOD(X,Y):模函数,返回X对Y取模的结果,即X除以Y
的余数,这里X和Y应该是整数。
@SIGN(X):符号函数,返回X的符号值(X < 0时返回-1, X
>= 0时返回+1)。
@SMAX(list):最大值函数,返回一列数(list)的最大值。
@SMIN(list):最小值函数,返回一列数(list)的最小值。
@FLOOR(X):返回X的整数部分(向最靠近0的方向取整)。
@LGM(X) :返回X的伽玛(gamma)函数的自然对数值(当X为
整数时LGM(X) = LOG(X-1)!;当X不为整数时
,采用线性插值得到结果)。
华中农业大学建模基地
LINGO实验
-实例1-
生产计划问题 某工厂计划安排生产Ⅰ,Ⅱ两种产品,
已知每种单位产品的利润,生产单位产品所需设备台时
及A,B两种原材料的消耗,现有原材料和设备台时的定额
如表所示,问:怎么安排生产使得工厂获利最大?
产品Ⅰ
产品Ⅱ
最大资源量
设备
1
2
8台时
原材料A
4
0
16kg
原材料B
0
4
12kg
单位产品利润
2
3
华中农业大学建模基地
LINGO实验
-实例1-
模型建立
设用 x1 , x2 分别表示计划生产产品Ⅰ,Ⅱ的数量,可建立模型为:
max f  2 x1  3 x2
 x1  2 x2  8
 4 x  16
 1
s.t. 
 4 x1  12
 x1 , x2  0
华中农业大学建模基地
-实例1-
程序编写
model:
title 生产计划问题;
[maxf]max=2*x1+3*x2;
[TIME]x1+2*x2<8;
[A]4*x1<16;
[B]4*x2<12;
END
LINGO实验
华中农业大学建模基地
LINGO实验
-实例1-
运行结果
Model Title: 生产计划问题
Variable
Value
X1
4.000000
X2
2.000000
Row
Slack or Surplus
MAXF
14.00000
TIME
0.000000
A
0.000000
B
4.000000
Reduced Cost
0.000000
0.000000
Dual Price
1.000000
1.500000
0.1250000
0.000000
安排是生产产品Ⅰ4单位,产品Ⅱ2单位,最大盈利为14万元 。
华中农业大学建模基地
-傻瓜输入法练习-
《数学软件与数学实验》第二版
155页 第1题
LINGO实验
华中农业大学建模基地
LINGO实验
-“段”的使用-
集合段
数据段
目标与约束段
基本集合与派生集合
循环函数
循环求和函数
多维数组
过滤条件
逻辑运算符
华中农业大学建模基地
LINGO实验
-“段”的使用-
100
1.怎样表示:
x
i 1
i
 90?
sets:!集合段;
s/1..100/:x;!基本集合, 集合名与属性变量;
endsets
!目标与约束段;
@sum(s(i):x(i))<90;!循环求和函数;
华中农业大学建模基地
- “段”的使用-
2.怎样赋值:
b1  1, b2  0, b3  1; b4  2, b5  3,
b6  5, b7  2, b8  6, b9  1, b10  2 ?
sets:
ss/1..10/:b;
endsets
data:! 数据段;
b=1 0 1 2 3 5 2 6 1 2;
enddata
LINGO实验
华中农业大学建模基地
LINGO实验
- “段”的使用-
100 200
 x
3.怎样表示:
i 1 j 1
ij
 280?
sets:
a/1..100/:;
b/1..200/:;
C(a,b):x;!派生集合;
endsets
@sum(c(i,j):x(i,j))=280;
华中农业大学建模基地
LINGO实验
- “段”的使用-
100
4.怎样表示:
x
i 1
ij
 150, j  1,2,..,200
sets:
a/1..100/:;
b/1..200/:;
C(a,b):x;
endsets
@for(b(j):@sum(a(i):x(i,j))=280);
!集合元素的循环函数;
华中农业大学建模基地
LINGO实验
-集合循环函数-
@FOR( )(集合元素的循环函数): 对集合setname的每个元
素独立地生成表达式,表达式由expression_list描述。
@MAX( )(集合属性的最大值函数):返回集合setname上
的表达式的最大值。
@MIN( )(集合属性的最小值函数):返回集合setname上
的表达式的最小值。
@PROD( )(集合属性的乘积函数): 返回集合setname上的
表达式的积。
@SUM( ) (集合属性的求和函数):返回集合setname上的表达
式的和。
华中农业大学建模基地
- “段”的使用-
5.怎样表示:
y j 取整数, j  1,2,..,200
xij为0 - 1变量,i  1,2,,100, j  1,2,..,200
sets:
a/1..100/:;
b/1..200/:y;
C(a,b):x;
endsets
@for(b(j):@gin(y(j)));
@for(c(i,j):@bin(x(i,j));
LINGO实验
华中农业大学建模基地
LINGO实验
- “段”的使用-
x
6.怎样表示:
2 k  40
k 10
ijk
 100
i  120, j  130
sets:
a/1..20/:;
b/1..30/:;
C/1..40/:;
d(a,b,c):x;
endsets
@for(a(i):@for(b(j):
@sum(c(i,j,k)|k#gt#1#and#k#ne#10:x(i,j,k))=100));
!过滤条件;
华中农业大学建模基地
LINGO实验
-逻辑运算符-
运算结果只有“真”(TRUE)和“假”(FALSE)两个值(称为
“逻辑值”),LINGO中用数字1代表TRUE,其他值(典型的值是
0)都是FALSE。
在LINGO中,逻辑运算(表达式)通常作为过滤条件使用。
逻辑运算符有9种,可以分成两类:
#AND#(与),#OR#(或),#NOT#(非):逻辑值之间的运算,它们
操作的对象本身已经是逻辑值或逻辑表达式;
#EQ#(等于),#NE#(不等于),#GT#(大于),#GE#(大于等
于),#LT#(小于),#LE#(小于等于):是“数与数之间”的比较。
例 2 #gt# 3 #and# 4 #gt# 2 结果是:真(1)
√
假(0)?
华中农业大学建模基地
LINGO实验
- “段”的使用-
7.怎样表示:
x1  2 x2  3x3  x4  4
2 x1  5 x2  x3  2 x4  5
3x1  x2  6 x3  2 x4  7
ai1 x1  ai 2 x2  ai 3 x3  ai 4 x4  bi
i  1,2,3
SETS:
HANG/1..3/:B;
LIE/1..4/:X;
XISHU(HANG,LIE):A;
ENDSETS
DATA:
A= 1 2 3 1
2 5 1 2
3 1 6 -2;
B=4 5 7;
ENDDATA
@FOR(HANG(I):
@SUM(LIE(J):A(I,J)*X(J))>B(I));
华中农业大学建模基地
LINGO实验
-程序编写-
model:
title 生产计划程序1;
Sets:
yuefen/1..4/:c,x,e,d;
endsets
data:
c=70 71 80 76;
d=6000 7000 12000 6000;
e=2 2 2 2 ;
a=10000;
enddata
min=@sum(yuefen:c*x)+ @sum(yuefen(j)|j#lt#4:@sum(yuefen(i)|i#le#j:x-d)*e(j+1));
@for(yuefen(j)|j#lt#4: @sum(yuefen(i)|i#le#j:x)> @sum(yuefen(i)|i#le#j:d));
@sum(yuefen:x)= @sum(yuefen:d);
@for(yuefen:x<a);
遍历集合每一元素,下标可省略
end
华中农业大学建模基地
LINGO实验
-程序展开-
MODEL:
TITLE :生产计划程序1;
[_1] MIN= 76 * X_1 + 75 * X_2 + 82 * X_3 + 76 * X_4 88000 ;
[_2] X_1 >= 6000 ;
[_3] X_1 + X_2 >= 13000 ;
[_4] X_1 + X_2 + X_3 >= 25000 ;
[_5] X_1 + X_2 + X_3 + X_4 = 31000 ;
[_6] X_1 <= 10000 ;
[_7] X_2 <= 10000 ;
[_8] X_3 <= 10000 ;
[_9] X_4 <= 10000 ;
END
华中农业大学建模基地
-程序编写-
Model:
Title 生产计划程序2;
Sets:
yuefen/1..4/:c,x,e,d,s;
endsets
data:
c=70 71 80 76;
d=6000 7000 12000 6000;
e=2 2 2 2 ;
a=10000;
enddata
min=@sum(yuefen:c*x+e*s);
@for(yuefen(i)|i#lt#4:s(i+1)=s(i)+x(i)-d(i));
s(4)+x(4)-d(4)=0;
s(1)=0;
@for(yuefen:x<a);
@for(yuefen:@gin(x));
@for(yuefen:@gin(s));
End
LINGO实验
华中农业大学建模基地
-“段”的使用练习-
《数学软件与数学实验》第二版
155页 第1题(1),(2),(3)
LINGO实验
华中农业大学建模基地
LINGO实验
-数据传递-
与EXCEL交换数据
华中农业大学建模基地
LINGO实验
-与EXCEL交换数据-
F4:F7单元
E4:E7单元
D4:D7单元
B4:B7单元 C4:C7单元
命名为SOLUTION
命名为SUPPLY
命名为 COST
命名为 NEED
命名为 CITIES
用于输出结果
用“插入︱名称︱定义”命名选中区域
华中农业大学建模基地
MODEL:
SETS: -数据传递-与EXCEL交换数据
MYSET: COST, ORDERED,NEED,SUPPLY;
ENDSETS
MIN = @SUM( MYSET( I): ORDERED ( I) * COST( I));
@FOR( MYSET( I):
[CON1] ORDERED( I) > NEED( I);
[CON2] ORDERED( I) < SUPPLY( I));
DATA:
MYSET =@OLE(‘D:\rxl\lingo程序\mydata.xls’,‘CITIES’);
!全路径指明文件,否则当前目录;
COST,NEED,SUPPLY =@OLE(mydata.xls); !按对应的相同名称输入;
@OLE(mydata.xls,‘SOLUTION’)=ORDERED;
!将SHIP 值赋给Excel中的SOLUTION;
! 或者直接写地址:@OLE(mydata.xls,‘Sheet1!$F$4:$F$7’)=ORDERED;
ENDDATA
END
LINGO实验
华中农业大学建模基地
LINGO实验
-数据传递-与EXCEL交换数据
报告窗口输出总结报告:
Export Summary Report
--------------------Transfer Method:
OLE BASED
Workbook:
mydata.xls
Ranges Specified:
1
SOLUTION
Ranges Found:
1
Range Size Mismatches:
0
Values Transferred:
4
采用OLE方式传输数据;
EXCEL文件为mydata.xls;
指定的接收单元范围为SOLUTION;
在mydata.xls正好找到一个名为SOLUTION的域名;
不匹配的单元数为0;
传输了4个数值。
华中农业大学建模基地
LINGO实验
-实例2-2011全国数模竞赛的一个模型
从excel文档中读入数
据,先给数据区域命名。
用“插入︱名称︱定义”
命名选中区域。
model:
title 分片;
sets:
pingtai/1..24/:p;
lukou/1..92/:n;
link(pingtai,lukou):t,x;
endsets
data:
t=@ole('d:\time1.xls','t');
n=@ole('d:\fa.xls','n');
enddata
华中农业大学建模基地
LINGO实验
-实例2-2011全国数模竞赛的一个模型
min=u;
@for(pingtai(i):p(i)=@sum(lukou(j):x(i,j)*n(j)
));
@for(pingtai(i):
@for(pingtai(k):
p(i)-p(k)<u;));
@for(link:t*x<30;);
@for(link:@bin(x));
@for(lukou(j):@sum(pingtai(i):x(i,j))=1);
end
华中农业大学建模基地
LINGO实验
-程序结构与调试-
程序结构
程序调试
华中农业大学建模基地
LINGO实验
-程序结构-
一般来说, LINGO中建立的优化模型可以由六个部
分组成,或称为六“段”(SECTION):
(1)集合段(SETS):以“ SETS:” 开始, “ENDSETS”
结束,定义必要的集合变量(SET)及其元素(MEMBER,
含义类似于数组的下标)和属性(ATTRIBUTE,含义类似于
数组)。
(2)目标与约束段:目标函数、约束条件等,没有段的开
始和结束标记,因此实际上就是除其它四个段(都有明确的段标
记)外的LINGO模型。
(3)数据段(DATA):以 “DATA:” 开始, “ENDDATA”结束,
对集合的属性(数组)输入或输出必要的常数数据。
格式为:“attribute(属性) = value_list(常数列表);”
华中农业大学建模基地
LINGO实验
-程序结构-
(4)初始段(INIT):以“INIT: ”开始, “ENDINIT”结束,
对集合的属性(数组)定义初值(因为求解算法一般是迭代算法,
所以用户如果能给出一个比较好的迭代初值,对提高算法的计
算效果是有益的)。
格式为:“attribute(属性) = value_list(常数列表);”
(5) 计算段:在数据段输入完成之后在正式求解模型之前对
原始数据进行处理,语句是顺序执行的,不能更换顺序,在计
算段可以使用程序流程控制和子模型。也可进行数据的输出。
以“CALC:”开始, “ENDCALC”结束。
华中农业大学建模基地
LINGO实验
-程序结构-
(6)子模型段:子模型必须包含在主模型之内,即必须位
于以“MODEL:”开头、以“END”结束的模块内。同一个
主模型中,允许定义多个子模型,其基本语法是:
@SUBMODEL mymodel:
可执行语句(约束+目标函数);
ENDSUBMODEL
其中mymodel 是该子模型的名字,可执行语句一般是一些
约束语句,也可能包含目标函数,但不可以有自身单独的
集合段、数据段、初始段和计算段。在计算段中可以用语
句“@SOLVE( mymodel);”求解这个子模型。
我们介绍了前三个段,有兴趣的同学可扩展阅读。
华中农业大学建模基地
LINGO实验
-程序调试-
很多时候是程序写出来了,但是有很多错误,
怎么进行程序的调试呢?可按下面步骤进行:
1.直接点击运行,如果出错会弹出错误提示,根据提示做
相应的修改;
2.可以用“!”把约束变成说明语句,而把这条语句屏蔽
掉,缩小寻找出错的范围;
3.可以边写程序边运行,保证每行书写都是正确的程序;
华中农业大学建模基地
LINGO实验
-程序调试-
•
•
•
•
•
•
•
•
•
•
一般容易出错的地方有:
定义了多个长度一样的集合,而在使用中区分不明确;
定义了同名的属性;
分号不是英文半角输入;
使用的字母没有定义;
循环语句中元素下标颠倒或者不明或越界;
约束错误变成不可行或无界;
关系运算符(如“=”)使用逻辑运算符(如“#EQ#”);
使用了非LINGO语言的输入;(比如%引导说明语句)
函数调用错误;
掉了或多了括号,函数的括号写错了地方等.