“段”的使用- 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 120, j 130
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语言的输入;(比如%引导说明语句)
函数调用错误;
掉了或多了括号,函数的括号写错了地方等.