常见Lingo指令介绍
LINGO教程(基本语法)
H
20
输出结果: 运行菜单命令“LINGO|Solve”
最大利润=11077.5
最优整数解 X=(35,65)
H
21
输出结果备注: LINGO是将它作为PINLP(纯整数非线性规划)来求解,因此找到的是局部最优解。
通过菜单 “WINDOW| Status Window”看到状态窗口,可 看到最佳目标值“Best Obj” 与问题的上界“Obj Bound”已 经是一样的,当前解的最大 利润与这两个值非常接近, 是计算误差引起的。如果采 用全局最优求解程序(后面介 绍),可以验证它就是全局最 优解。
•限定变量取整数值的语句为“@GIN(X1)”和“@GIN(X2)”,不可以写成“@GIN(2)”,否 则LINGO将把这个模型看成没有整数变量。
•LINGO中函数一律需要以“@”开头,其中整型变量函数(@BIN、@GIN)和上下界 限定函数(@FREE、@SUB、@SLB)与LINDO中的命令类似。而且0/1变量函数 是@BIN函数。
H
18
一个简单的LINGO程序
例 直接用LINGO来解如下二次规划问题:
Max98x127x72x120.3x1x22x22 1
s.t. x1x2100
2
x12x2
3
x1,x2 0 为整数
4
输入窗口如下:
H
19
程序语句输入的备注:
•LINGO总是根据“MAX=”或“MIN=”寻找目标函数,而除注释语句和TITLE语句外的其 他语句都是约束条件,因此语句的顺序并不重要 。
H
27
集合及其属性
• QUARTERS集合的属性
• DEM
• RP
• OP
• INV
常见Lingo指令介绍
常见Lingo指令介绍常见Lingo指令介绍一、控制Sprite的常见指令1.指令名称:sprite member指令语法:the member of sprite指令说明:sprite所代表的cast member。
例:精灵替换set the member of sprite 1 to "yuan"可改为:Sprite(1).member=”yuan”点句表示法:ObjectName.[Property|function|Chunk that you want to specity]2.指令名称:sprite memberNum指令语法:the memberNum of sprite指令说明:sprite所代表的cast member所在的位置。
例:循环播放on exitFrame meif sprite (1). memberNum =10 thensprite (1). memberNum = 1elsesprite (1) .memberNum=sprite(1).memberNum+1end ifgo to the frameend3.旋转、倾斜、翻转精灵指令说明:这些变换可以应用于位图、文本、矢量图形、GIF及Flash,但不能用于域,以及工具面板上的椭圆和矩形。
(1)旋转:正值代表顺时针,负值代表逆时针sprite(1).rotation=30set the rotation of sprite 1 to 30例:指针调节sprite(1).rotation=sprite(1).rotation+5(2)倾斜:正值向右倾斜,负值向左倾斜,正常状态为0sprite(1).skew=10set the skew of sprite 1 to 10例:图形变形sprite(1).skew=sprite(1).skew+10(3)翻转:左右(水平)翻转flipH,上下(垂直)翻转flipV,设置值为TRUE或FALSE (1或0)sprite(1).flipH=TUREsprite(1).flipV=1例:翻转与恢复指令说明:相当于sprite在stage上的透明度,值可从0到100,数值越小透明度越高。
lingo函数命令
集合操作函数
@IN( set_name, primitive_index_1 [, primitive_index_2 ...]) 判断一个集合中是否含有某个索引值。如果集合set_name中包含 由索引primitive_index_1 [, primitive_index_2 ...]所对应元素,则返 回1(逻辑值“真”),否则返回0(逻辑值“假”)。索引用“&1”、 “&2”或@INDEX函数等形式给出,这里“&1”表示对应于第1个 父集合的元素的索引值,“&2”表示对应于第2个父集合的元素的 索引值。 例:定义一个集合STUDENTS(基本集合),派生出集合PASSED和 FAILED,定义: SETS: STUDENTS / ZHAO, QIAN, SUN, LI/:; PASSED( STUDENTS) /QIAN,SUN/:; FAILED( STUDENTS) | #NOT# @IN( PASSED, &1):; ENDSETS
• @PFS(A,X,C) :当负荷上限为A,顾客数为C,并行服务器数 量为X时,有限源的Poisson服务系统的等待或返修顾客数的期 望值。(A是顾客数乘以平均服务时间,再除以平均返修时间。 当C和(或)X不是整数时,采用线性插值进行计算)。
概率相关函数
• @PFD(N,D,X):自由度为N和D的F分布的分布函数在X点的取 值。
• @FPL(I,N) 返回如下情形下总的净现值:单位时段 利率为I,第N个时段支付单位费用。根据复利的计 算公式,很容易知道 1 @FPL(I,N) ( 1 I ) N 。
概率相关函数
• @PSN(X):标准正态分布函数,即返回标准正态分布的分布函 数在X点的取值。 • @PSL(X):标准正态线性损失函数,即返回 MAX(0, Z-X)的期 望值, 其中 Z为标准正态随机变量。 • @PPS(A,X):Poisson分布函数,即返回均值为A的Poisson分布 的分布函数在X点的取值(当X不是整数时,采用线性插值进行 计算)。 • @PPL(A,X):Poisson分布的线性损失函数,即返回 MAX(0, ZX)的期望值, 其中 Z为均值为A的Poisson随机变量。 • @PBN(P,N,X):二项分布函数,即返回参数为(N,P)的二项 分布的分布函数在X点的取值(当N和(或)X不是整数时,采 用线性插值进行计算) 。
LINGO的基本运算和函数
这些运算符的优先级由高到低为: 高 #not# #eq# #ne# #gt# 低 #and# #or#
关系运算符
#ge#
#lt#
#le#
LINGO 有三种关系运算符:“=”、“<=”和“>=”。
LINGO 函数
数学函数
LINGO 提供了大量的标准数学函数:
@ABS( X)
绝对值
@ACOS( X)
反余弦
x 的 gamma 函数的自然对数
@LOG( X)
自然对数
@LOG10( X)
以十为底的对数
@MOD( X, Y) X 模 Y
@POW( X, Y) X 的 Y 次方
@SIGN( X)
符号函数
@SIN( X)
正弦
@SINH( X)
双曲正弦
@SMAX( X1, X2,..., XN)
求最大
@SMIN( X1, X2,..., XN)
数
@gin(x)
限制 x 为整数
பைடு நூலகம்
在默认情况下,LINGO 规定变量是非负的,也就是说下界为 0,上界为+∞。
@free 取消了默认的下界为 0 的限制,使变量也可以取负值。@bnd 用于设定一个
变量的上下界,它也可以取消默认下界为 0 的约束。
集操作函数
@size(set_name) 该函数返回集 set_name 的成员个数。在模型中明确给出集大小时最好使用 该函数。它的使用使模型更加数据中立,集大小改变时也更易维护。
集循环函数
@function(setname[(set_index_list)[|conditional_qualifier]]:expressio n_list);
Lingo基本用法总结
Lingo基本用法总结LINGO是用来求解线性和非线性优化问题的简易工具。
Lingo免费版可以支持30个未知数,lingo破解版可以支持几万个未知数、几万个约束条件。
当你在windows下开始运行LINGO系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO的默认模型窗口,建立的模型都都要在该窗口内编码实现。
然后点击工具条上的按钮即可。
算术运算符Lingo中变量不区分大小写,以字母开头不超过32个字符算术运算符是针对数值进行操作的。
LINGO提供了5种二元运算符:^乘方﹡乘/除﹢加﹣减LINGO唯一的一元算术运算符是取反函数“﹣”。
这些运算符的优先级由高到底为:高﹣(取反)^﹡/低﹢﹣运算符的运算次序为从左到右按优先级高低来执行。
运算的次序可以用圆括号“()”来改变。
数学函数标准数学函数:@abs(x) 返回x的绝对值@sin(x) 返回x的正弦值,x采用弧度制@cos(x) 返回x的余弦值@tan(x) 返回x的正切值@exp(x) 返回常数e的x次方@log(x) 返回x的自然对数@lgm(x) 返回x的gamma函数的自然对数@sign(x) 如果x<0返回-1;否则,返回1@floor(x) 返回x的整数部分。
当x>=0时,返回不超过x的最大整数;当x<0时,返回不低于x的最大整数。
最大最小函数:@smax(x1,x2,…,xn) 返回x1,x2,…,xn中的最大值@smin(x1,x2,…,xn) 返回x1,x2,…,xn中的最小值边界限定函数:@bin(x) 限制x为0或1@bnd(L,x,U) 限制L≤x≤U@free(x) 取消对变量x的默认下界为0的限制,即x可以取任意实数@gin(x) 限制x为整数辅助函数1.@if(logical_condition,true_result,false_result)@if函数将评价一个逻辑表达式logical_condition,如果为真,返回true_ result,否则返回false_result在默认情况下,LINGO规定变量是非负的,也就是说下界为0,上界为+∞。
Lingo中的命令
LINGO WINDOWS命令5.1 文件菜单(File Menu)1.1.新建(New)从文件菜单中选用“新建”命令、单击“新建”按钮或直接按F2键可以创建一个新的“Model”窗口。
在这个新的“Model”窗口中能够输入所要求解的模型。
2.2.打开(Open)从文件菜单中选用“打开”命令、单击“打开”按钮或直接按F3键可以打开一个已经存在的文本文件。
这个文件可能是一个Model文件。
3.3.保存(Save)从文件菜单中选用“保存”命令、单击“保存”按钮或直接按F4键用来保存当前活动窗口(最前台的窗口)中的模型结果、命令序列等保存为文件。
4.4.另存为...(Save As...)从文件菜单中选用“另存为...”命令或按F5键可以将当前活动窗口中的内容保存为文本文件,其文件名为你在“另存为...”对话框中输入的文件名。
利用这种方法你可以将任何窗口的内容如模型、求解结果或命令保存为文件。
5.5.关闭(Close)在文件菜单中选用“关闭”(Close)命令或按F6键将关闭当前活动窗口。
如果这个窗口是新建窗口或已经改变了当前文件的内容,LINGO系统将会提示是否想要保存改变后的内容。
6.6.打印(Print)在文件菜单中选用“打印” (Print)命令、单击“打印”按钮或直接按F7键可以将当前活动窗口中的内容发送到打印机。
7.7.打印设置(Print Setup...)在文件菜单中选用“打印设置...”命令或直接按F8键可以将文件输出到指定的打印机。
8.8.打印预览(Print Preview)在文件菜单中选用“打印预览...”命令或直接按Shift+F8键可以进行打印预览。
9.9.输出到日志文件(Log Output...)从文件菜单中选用“Log Output...”命令或按F9键打开一个对话框,用于生成一个日志文件,它存储接下来在“命令窗口”中输入的所有命令。
10.提交LINGO命令脚本文件(Take Commands...)从文件菜单中选用“Take Commands...”命令或直接按F11键就可以将LINGO命令脚本(command script)文件提交给系统进程来运行。
LINGO使用说明(比较简单)
Lingo介绍Lingo是美国LINDO系统公司(Lindo Symtem Inc)开发的求解数学规划系列软件中的一个(其他软件为LINGDO,GINO,What’s Best等),它的主要功能是求解大型线性、非线性和整数规划问题,目前的版本是lingo11.0。
lingo分为Demo、solve suite、hyper、industrial、extended等六类不同版本,只有Demo版本是免费的,其他版本需要向LINDO系统公司(在中国的代理商)购买,Lingo的不同版本对模型的变量总数、非线性变量个数、整型变量个数和约束条件的数量做出不同的限制(其中extended版本无限制)。
Lingo的主要功能特色为:(1)既能求解线性规划,也有较强的求解非线性规划的能力;(2)输入模型简练直观;(3)运行速度快、计算能力强;(4)内置建模语言,提供几十种内部函数,从而能以较少语句,较直观的方式描述较大规模的优化模型;(5)将集合的概念引入编程语言,很容易将实际问题转换为Lingo语言;(6)能方便地与excel、数据库等其他软件交换数据。
学校图书馆40本《lingo和excel在数学建模中的应用》,袁新生、邵大宏、郁时炼主编,科学出版社Lingo程序设计简要说明在数学建模中会遇到如规划类的题型,在这种模型中总存在着一个目标,并希望这个目标的取值尽可能的大或小,同时与这个目标有关的一系列变量之间存在一些约束。
在构造出目标函数和约束条件的表达式后,我们需要对求出这个最值和各变量的取值。
一般我们用LINGO来对模型进行求解,本文将通过举一个简单的例子,围绕这个例子逐步学习LINGO 的使用。
LINGO只是一个求解工具,我们主要的任务还是模型的建立!当你在windows下开始运行LINGO系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
在主窗口内的标题为LINGO Model –LINGO1的窗口是LINGO的默认模型窗口,建立的模型都都要在该窗口内编码实现。
lingo中links用法
lingo中links用法在Lingo中,"links"是一个很常见的命令,用于创建和管理不同部分之间的链接或关联。
具体用法如下:1. 创建链接:使用"links"命令可创建一个链接,将一个对象与另一个对象关联起来。
例如,要将对象A与对象B关联起来,可以使用以下命令:```links(A).to(B)```这将创建一个从对象A指向对象B的链接。
2. 检查链接:可以使用"links"命令检查两个对象之间是否存在链接。
例如,要检查对象A和对象B之间是否存在链接,可以使用以下命令:```links(A).has(B)```如果存在链接,则返回true;否则返回false。
3. 获取链接的数量:可以使用"links"命令获取某个对象所拥有的链接的数量。
例如,要获取对象A的链接数量,可以使用以下命令:```links(A).count```这将返回与对象A相关的链接的数量。
4. 获取链接的目标对象:可以使用"links"命令获取某个对象链接的目标对象。
例如,要获取对象A的链接的目标对象,可以使用以下命令:```links(A).target```这将返回与对象A链接的目标对象。
5. 删除链接:使用"links"命令可以删除两个对象之间的链接。
例如,要删除对象A与对象B之间的链接,可以使用以下命令:```links(A).remove(B)```这将删除从对象A指向对象B的链接。
请注意,上述示例中的"A"和"B"是用作对象的占位符。
您可以将其替换为实际的对象名称或引用。
常用的Lingo语句
常用的Lingo语句一、常用的Lingo命令尽管在Lingo中有700多条命令,但是在编写Lingo剧本时,经常用到的Lingo命令并不是很多,下面简单介绍一下常用的一些Lingo命令。
1.go这是一个在Director中非常常用的命令,在前面的制作中我们曾经不只一次用到它,它的用法也比较多,主要包括下面一些情况:go to Frame [FrameNumber]:跳转到帧。
go to [FrameNumber]:go [FrameNumber]go to movie “[MovieName]”go movie “[MovieName]”go to Frame “[MarkerName]”go to “[MarkerName]”go “[MarkerName]”go to Frame [FrameNumber] of movie “[MovieName]”go to [FrameNumber] of movie “[MovieName]”go [FrameNumber] of movie “[MovieName]”go loopgo nextgo previous在上面的表达式中,[ ]中的内容表示这里要用相应的内容替换,以下都采用这种方式。
其中,[FrameNumber]表示帧的序号,[MovieName]表示影片的名称(包括路径或Internet网址),[Markername]表示标记名称。
这几个命令所要表达的是当发生某个事件时,影片的播放位置将跳转到某一帧,或者跳转到某指定标记的帧,或者跳转到某部影片,或者跳转到某一影片中的某一帧。
最下面的三个命令可以使影片循环播放、前进或倒退。
2.setset也是一个经常用到的命令,它的用法可以包括下面四种情况:set the [LingoProperty] to [expression]set the [LingoProperty=expression]set [variable=expression]3.playplay的用法如下:play frame [FrameNumber]play [FrameNumber]play movie “[MovieName]”play frame [FrameNumber] of movie “[MovieName]”play Sprite [FlashSpriteNumber]上述命令分别表示播放指定的帧,播放指定的影片,播放指定影片中的某一帧,播放指定通道中的Flash影片。
常用lingo字典
Lingo 的运算符 1、Lingo 的运算符运算符是任何一种语言中最基本的要素,它可以帮助变量值达到运算、比较、分配等功能,所以优先来介绍它。
一般来说运算符不外具有计算、比较等功能,而在Lingo中,有很多运算符是与现实生活中的符号相同的,请参考表1。
表1: # 定义符号- 负号-- 说明符号& 连接两字串&& 连接两字串,但在两字串之间加入一个空格键* 乘号+ 加号/ 除号- 减号< 小于<= 小于等于<> 不等于= 等于> 大于>= 大于等于[ ] 阵列符号连接两行的指令为同一表达式 ( ) 括弧#符号语法: #symbol Name 定义一个符号,这个符号在Director中,是另外一种对象的类型,与字串、整数、浮点数等类似。
使用符号的原因是因为它的速度比字串来得快,所以可以利用符号代替字串,通常在#之后可接一个名称,例如: #newType 这表示有一个符号为newType,事实上它可以当作是一个值,是指定给某一个变量的,例如: put #newType into newType 这表示将#newType 这个值放在变量newType 之中。
符号可以与阵列配全着一起使用,例如: [#a:1, #b:2, #c:3] 这就表示一个含有内容的阵列property list,其中的项目是一个符号对应一个数值。
可以视符号为这个数值的描述文字,与字串比较起来,符号的处理速度比较快,所以某些时候选择符号是比较好的做法。
当然不一定非这样用不可,但是符号的确是一个很方便的工具。
-符号语法: -expression 算术符号中的负号。
它的功能是可以将某个数值变为负数,具有算术式中的减号性质。
--符号语法: --[comment] 在编写程序时希望为程序加上说明的文字,以便以后的维护工作,如图1所示。
图1就是一个很好的例子,因为在指令的最前面记录着程序的编写者及编写的时间。
lingo常用辞典
abortabort当Handler 中的指令被执行时这个指令可以利用来中断剩余指令的动作一旦碰到这个指令剩余的指令将不会再执行而离开此Handlerabsabs (数值或算术式)取得数值的绝对值activateWindowon activeWindowend在子视窗中执行的电影启动时的动作activeWindowthe activeWindow变数值代表目前正在执行中的视窗此数值是唯一的actorListthe actorList这是一个阵列物件在阵列中所存放的都是一个物件而不是一般的值这些物件可以执行的有如perFrameHook 的指令也就是每当播映头移到一个新的镜头上时就会执行perFrameHook 之中的动作而actorList 则是每当播映头移到一个新的镜头上时就会执行这个阵列之中的所有物件因为物件都是指令所以也就是等於在执行这些指令add the actorList, birth(script "Ball", 1, 200,200)如果要将actorList中的物件移去时只要将它设为空的阵列即可如set the actorList = []addadd线性阵列, 数值为线性阵列(Linear List)加入一个数值例如set newList = [4, 3, 2]add newList, 1结果的线性阵列为[4, 3, 2, 1]addAtaddAt 线性阵列, 位置, 值这与add 相类似也是加入线性阵列一个值但是addAt 可以指定所加入的位置例如set newList = [4, 3, 2]add newList, 2 1结果的阵列为[4, 1, 3, 2]addPropaddProp 阵列, 内容, 值这个指令的功能与add 相同只是它所应用的不是一个线性的阵列而是一个含有内容的阵列所以多了一个引数请看下列所示set newList = [#four:4, #three:3, #two:2]addProp newList, #one, 1结果为[#four:4, #one, #three:3, #two:2]alert "字串"显示一个警告对话方块字串将会显示在方块中alignment of memberthe alignment of member 数值设定或查询文字Cast Member的对齐状态结果值为一字串有三种"left""center"或"right"ancestorproperty ancestorancestor 是一个property它表示子物件可以参考父程式之外的Handler换句话说就是可以将部份的handlers 放置在另一个script 之中而这个script 中所含有的handler 可以被其它的子物件参考and逻辑运算式一and 逻辑运算式一判断前後二个逻辑值的及值appendappend 线性阵列, 值将一个值加在线性阵列的最後位置上例如set newList = [4, 3, 2]add newList, 1atanatan (数值)取得一个数值径度的A径度值位於-π/2 与π/2 之间autoTab of memberthe autoTab of member 数值如果文字Cast Member是可以在执行中被使用者打字输入一般会在使用者按下Tab键後自动进入如果将此值设定为真值就表示使用者按下Tab键後就可输入文字到此Cast Member中backColor of memberthe backColor of member 值设定文字物件的背景颜色backColor of spritethe backColor of sprite 数值设定sprite的背景颜色在设定前必须将这个sprite设定为Puppet这个指令主要是用在使用工具视窗所绘制的向量图形上其它的图形也是可以适用的但必须特别去注意使用之後的变化在使用这个指令之後必须使用updateStage 指令更新舞台上的所有图形这样才会得到新的画面BACKSPACEBACKSPACE本指令代表键盘上的backspace 键beepbeep [数值]使用电脑内部的喇叭哔一声後面所加上的数字表示哔声的次数beepOnthe beepOn当画面上某些特定的sprite启动後启动表示将它指定为puppetSrpite若使用按了画面上的图形而这些图形并不是启动的sprite时就会哔一声但是记得要将the beepOn 设定为真beforeput 字串值一before 字串值二要将字串值一放在字串值二所指定的位置之前这个字串值一可能是一个字串也可能是一个文字的Cast Member但也可能是一个数值不过put...before 是可以将二个指定的字串加在一起的例如put "This is book." into thisBookput "a " before word 3 of thisBook结果变成了"This is a book."beginRecordingbeginRecording启动录制Frame的动作birthbirth (script 父程式的名称, 值1 , 值2 , ...)产生子物件的指令例如在父程式Bird 之中的指令如下on birth mereturn meendon fly meput "I am flying"end则子物件的产生方式为set myBird to birth (script "Bird")如此一来子物件便可以使用父程式之中的handler所以可以写成如下列的指令fly myBirdblend of spritethe blend of sprite可以设定sprite融合的程度数值可以是从0 到100 之间的数border of memberthe border of member 数值文字的边线宽度bottom of memberthe bottom of sprite 值查询sprite中的图形最低点到视窗上方边界的距离本指令仅提供查询之用是不能够设定boxDropShadow of memberthe borderShadow of member 数值文字的边线阴影高度boxType of memberthe borderType of member 数值文字的类别总共有四种以符号表示#adjust#scroll#fixed#limitbuttonStylethe buttonStyle按钮的类别在此可分为二种一种是将它设定为0另一种是将它设定为10 的意思是表示当画面上有许多的按钮而且都非常靠近时若使用者按了某一个按钮在还没有放开滑鼠键的时候拖曳过其它的按钮时其它的按钮也会显示被按到的情形但当使用者滑到某一个按钮放开滑鼠键後这个按钮的指令就会被启动但设定为1 的意思表示即使使用者按住滑鼠键移动到其它的按钮但是其它的按钮是不会有任何反应的buttonTypethe buttonType of member 值按钮的型态共有三种#pushButton#checkBox#radioButtoncancelIdleLoadcancelIdleLoad 数值取消记忆体中已载入的Cast Member数值代表顺位casecase 表示式of值一: 动作一值二: 动作二(可多个动作以分行区隔就可以)值三, 值四: 动作三otherwise最後动作(可不做)end case这是取代If 厎.. Then的另一种写法蛮好用的castLibcastLib 值查询某个Cast Library中某个Cast Member的位置the castLibNum of spritethe castLibNum of sprite 数值设定某个Sprite中的Cast Member是谁而它位於指定的Cast Library中center of memberthe center of member 值当the crop of member为真值时此指定的设定才有意义它表示数位影片的大小改变将会以中心为出发点扩大或变小centerStagethe centerStage查询或设定舞台的位置若the centerStage 值为真则舞台将显示在画面的中央若the centerStage 值为假则舞台将不会显示在画面的中央changeArea of memberthe changeArea of member 值只适用於Transition Cast Member当它的值为真时表示画面改变只发生在所改变的部份画面反之则会影响整个舞台channelCountthe channelCount of member 值计算某个Sound Cast Member所占用的Channel数char...ofchar 数值of 表示式char 数值一to 数值二of 表示式找出字串之中的某一个字元或是某部份的字串例如put char 3 of "This is a book." into newChar结果newChar 的值为"i"put char 3 to 7 "This is a book." into newChar结果newChar 的值为"is is"charPosToLoccharPosToLoc(member 值, 数值)查询某个字元在文字Cast Member中真正的位置charschars(表示式, 数值一, 数值二)从文字中找出子字串子字串的起点处为数值一终止处为数值二例如put chars("This is a book.", 6, 7) into newChar结果newChar 的值为"is"charToNumcharToNum(字串表示式)找出某一个字元的ASCII code 值为何也就是将一个字元转为数值型态例如put charToNum("a") 的值为97checkBoxAccessthe checkBoxAccess在工具视窗之中的二种按钮(checkbox radio button)的设定样式主要是控制使用者是否可以改变按钮的型态它的设定方式有三种如下表所示数值说明让使用者按了之後可以开关按钮1让使用者按了之後只可以开但不能关2让使用者按了之後不可以开关按钮checkBoxTypethe checkBoxType当使用者可以改变按钮(checkbox radio button)的型态後这个指令可以为它设计一点形状请参考下表数值说明加上一个X 的符号1加上一个填满黑色的方块图形checkMark of menuItemthe checkMark of menuItem 项目of menu 项目当程式之中设计有自订的功能表时可以为它设计是否有符号会出现在子功能表之中例如使用到这个指令时可以在它的前面加上一个打勾的符号当设定为真时表示会显示所选取的符号设定为假时则不会有任何的符号chunkSize of memberthe chunkSize of member 值只适用於Transition cast member指令可以设定它的Chunk大小也就是区块的大小clearFrameclearFrame清除整个Frame的内容但只与beginRecording合用clearGlobalsclearGlobals将所有的global 变数设定为初始值也就是0clickLocthe clickLoc这个指令会显示出上一次使用者按滑滑鼠键所在的萤幕位置显示的位置会以Point 指令的方式显示出来如果使用者所按的位置为200, 200则显示後的结果为Point(200, 200)clickOnthe clickOn当某些特定的Sprites 设定为真时the clickOn 的值为使用者所按的Sprite是一个数值可以利用这个数值来判断使用者所按的是@个图形close windowclose window 视窗值将某一个视窗关闭视窗的开启请参考window 的指令closeWindowon closeWindow动作end当电影在某一个视窗中执行时若使用者按了右上炸"澈s可以利用此Handler 做动作closeXlibcloseXlib [档案]关闭某一个Xliberary事实上在window 中它的意思是表示关闭一个.dll 的档案例如closeXlib表示关闭所有的XlibrarycloseXlib "Sample"表示关闭同一目录底下的sample.dll 档案当然可以加上路径的名称cropthe crop of member 值当它为真值时表示数位影片会被剪裁成所要的大小如果为假值时则会被挤压成所要的大小colorDepththe colorDepth查询目前电脑上所设定的颜色深度如下表所示数值说明1黑白24 种颜色416 色8256 色1632,768 色3216,777,216 色constrainH语法constrainH (数值一, 数值二)查一个数值看它是否落在某个sprite图形的左右边以内的位置上若此数值在这图形的左右边以内的位置结果值为此数值若是小於图形左边的位置则结果值为图形左边的值若大於图形右边的位置则结果值为图形右边的值例如sprite 1的图形左右边的位置为100 与200则put constrainH(1, 90) into newPosition结果newPosition 值为100put constrainH(1, 150) into newPosition结果newPosition 值为150put constrainH(1, 250) into newPosition结果newPosition 值为200constraint of sprite语法the constraint of sprite 数值设定某一个sprite可以移动的范围当使用constarint 的设定後此sprite将只会在所定的区域之中移动而无法移动到所定的区域之外要取消区域的设定只要将它设定为0 即可constrainV语法constrainV (数值一, 数值二)与constrainH 的用法类似是可以查询一个数值看看是否落在某一个sprite图形的上下边之内的位置若此数值在的图形的上下边的位置之内结果值即为此数值若小於图形上边的位置则结果值为图形上边的值若大於图形下边的位置则结果值为图形下边的值contains语法表示式一contains 表示式二测试表示式一是否含表示式二若是含有的话则传回的结果值为真若是没有含有的话则传回的结果值为假continue语法continue将所设有pause 的暂停动作结束而继续电影的播映controlDown语法the controlDown测试control 键是否被按到若有被按到时the controlDown 的值为真若未被按到时the controlDown 的值为假controller of member语法the controller of member 值针对QuickTime for Windows 的影片档案而言这个指令可以将它的控制按钮显示或隐藏若设定值为0 表示隐藏控制按钮若设定值为1表示显示控制按钮copyToClipBoard语法copyToClipBoard cast 值将某一个Cast Member的内容复制到剪贴簿中cos语法cos (angle)求取某一个?cos 值count语法count(list)计算阵列中到底有几个项目cursorcursor [值]cursor [值一, 值二]cursor 值设定游标的形状如果在cursor 後直接加上数字的话各个数字的意义如下图所示数值意义不设定游标-1箭头式的游标1I 字符号的游标2十字式的游标3十字条状式的游标4漏斗式的游标200游标消失如果在Windows 的环境下想使用其它的游标形状可以设计16*16 大小的Cast Member然後将它在卡司视窗中的编号放置在中括弧内如果这个Cast Member是在第一个位置上则为cursor [1]这个时候的游标是透明的但如果想使用的是不透明的游标就请将原来的Cast Member 复制成另外一个将所有的空白填满然後在中括弧中再加入一个引数如果这个CastMember是在第二个位置上则指令为cursor [1, 2]记得要将这二个Cast Member都转换为1 bit16*16 的大小这样比较不会出错cursor of spritethe cursor of sprite whichSprite to [值]the cursor of sprite 数值to [值一, 值二]the cursor of sprite 数值to 值光是使用cursor 指令是表示游标在任何位置上时都会出现这个新的游标但是如果使用这个指令则当游标在画面上到指定的Sprite 时才会出现新的游标其它的方法都与cursor 相同datethe abbr datethe abbrev datethe abbreviated datethe datethe long datethe short date日期的指令deactivateWindowon deactivateWindow动作end在关闭视窗时所做的动作delaydelay数值延迟的时间计数以Tick为单位60个Tick等於一秒钟所以delay 60等於延迟一秒钟deletedelete表示式删除某个字元字项目字串等内容deleteAtdeleteAt阵列, 值删除线性阵列中的指定项目deleteFramedeleteFrame删除一个镜头(Frame)但必须配合beginRecording使用deleteOnedeleteOne阵列, 值删除阵列中的指定值若阵列中含有多个相同的值则会删除第一个符合的项目deletePropdeleteProp阵列, 值删除含有内容(property)阵列中的指定内容depth of memberthe depth of member值查询某个Cast Member的颜色深度desktopRectListthe deskTopRectList若同一电脑有多个萤幕本指令会查询所有萤幕的解析度digitalVideo member centerthe center of member值必须配合the crop of cast使用当the crop of cast为真时而又将the center of cast设定为真时假如影片是大於sprite的矩形则截边的方式会出现在周边的地方而让影片看起来比较好digitalVideo member controllerthe controller of member值针对QuickTime for Windows的影片档案而言这个指令可以将它的控制按钮显示或隐藏若设定值为0时表示隐藏控制按钮若设定值为1时表示显示控制按钮digitalVideo member cropthe crop of member值可以让数位影片显示在sprite的矩形中当the crop of cast设定为假时它会将数位影片挤压或放大显示在sprite的矩形之中但若是the crop of cast设定为真时而数位影片又大於sprite的矩形时它就会将部份的画面截掉不显示digitalVideo member directToStagethe directToStage of member值本指令可以控制影片所在萤幕上的层次但因为Windows中不允许这个设定所以指令并无效果digitalVideo member durationthe duration of member值查询某个影片的长度单位以tick计算digitalVideo member frameRatethe frameRate of member值影片的速度设定的数值意义如下表所示数值意义正常设定的速度-1依正常速度播映每一个镜头-2以最快的速度播映每一个镜头255最大的速度digitalVideo member loopthe loop of member值设定影片是否重覆播映若设定值为1时则影片会以回圈方式重覆播映若设定值为0时则影片就只会播映一次就停止digitalVideo member pausedAtStartthe pausedAtStart of member值设定影片一开始出现时是否为暂停的方式若本指令的值为真时则将影片会在一开始出现时先行暂停等播映的按钮或指令启动时影片才会播映digitalVideo member preloadthe preLoad of member值设定影片是否先载入到记忆体中若本指令的值为真影片会先载入到记忆体中digitalVideo member soundthe sound of member值to on/Off设定影片的声音是否播映若本指令的值为真则影片的声音会随著影片一起播映digitalVideo member videothe video of member值设定影片是否要播映若本指令的值为假时则影片就不会播映digitalVideo sprite movieRatethe movieRate of sprite数值设定某个sprite上的影片速度若指令的值为1时则影片会以正常的速度播映若指令的值为-1时则影片会以倒播的速度播映若指令的值为0时则影片会停止播映digitalVideo sprite movieTimethe movieTime of sprite数值查询某个sprite上影片所播映的时间数值的单位以tick为计算单位digitalVideo sprite startTimethe startTime of sprite数值设定影片在某个特定channel上开始播映的时间digitalVideo sprite stopTimethe stopTime of sprite数值设定影片在某个特定channel上结束播映的时间digitalVideo sprite volumethe volume of sprite数值控制影片的声音大小范围从-256到256小於0的数值是表示影片将不会播映声音digitalVideoTimeScalethe digitalVideoTimeScale设定影片的时间计算单位可以大於电影本身的计算单位digitalVideoTypethe digitalVideoType of member值数位影片的类型有二种#quickTime或#videoForWindowsdodo表示式表示执行在表示式所写的指令doneplay done结束play指令的动作回到呼叫它的地方dontPassEventdontPassEvent在Handler结束後可能会将执行的动作交给下个可执行的Handler但若是在Handler结束前再加上dontPassEvent指令它就会将执行的动作停止而不会交给下个可执行的HandlerdoubleClickthe doubleClick当它为真时表示使用者按了滑鼠键二下当它为假时表示使用者并没有按滑鼠键二下downrepeat with变数= 起始值down to结束值配合repeat的计数down表示计数的动作是往回算每次计算是以减一的方式计数例如repeat with i = 10 down to 1表示会做10个回圈离开回圈的方式可以去设定i的值为1或是exit repeat指令drawRect of windowthe drawRect of window视窗名称查询或是设定视窗的大小利用四个数值来定义视窗的上下左右dropShadow of memberthe dropShadow of member值文字Cast Member的阴影高度duplicateFrameduplicateFrame复制一个镜头(Frame)但必须配合beginRecording使用duplicate(list)duplicate(阵列)复制一个阵列duplicate memberduplicate member原来的[, 新的]复制一个Cast Member中括弧中可填入指定放入的位置若不填写则系统会自动找出最近的位置存放duration of memberthe duration of member值影片的长度editable of memberthe editable of member 值设定文字Cast Member是否可以被编辑若为真值则表示其可以被编辑editable of spritethe editableText of sprite 数值设定某个sprite中的Cast Member是否可以被编辑电影在播映的过程间若Cast Member 是可以被编辑的则可以将指令的值设定为真如果不行则设定为假但是这个指令在使用之前必须要将这个sprite设定为PuppetSpriteelseif 表示式一then 动作else 动作end if逻辑判断配合if 使用的在if 後面所使用的表示式为真值时所做的事在else 後面所使用的表示式为假值时所做的事EMPTYEMPTY表示空的字串enabled of menuItemthe enabled of menuItem 项目of menu 值设定功能表之中的某个或多个项目为可以选取的型态或是不可以选取的型态在使用指令的过程时某些指令在某些情形之下也许是无法使用的所以可以将它设定为假而这个指令就会显示成淡灰色的颜色在这个指令之中whichItem 可以是数值也可以是项目的名称endend结束动作通常是Handler的动作end caseend case结束case的动作end repeatexit repeat离开repeat 的回圈endRecordingendRecording结束beginRecording的动作ENTERENTER代表键盘的Enter 键enterFrameon enterFrame动作end enterFrameenterFrame 表示进入此镜头时所该做的动作通常会使用在Handler 中erase membererase member 值删除某个Cast Memberexitexit这个指令会离开目前所执行的Handler回到所呼叫它的地方如果它是由另一个Handler 呼叫就会回到@个Handler 的上面继续执行exit repeatexit repeat结束repeat的动作exitFrameon exitFrame动作end exitFrame这个指令通常是用在Handler 的上面表示当离开此镜头时所可以做的事exitLockthe exitLock这个指令可以锁住Projector 是否可以离开程式若the exitLock 值为真时则不管使用者是否按了Control-. 或是Esc 键都是无法离开程式的但是the exitLock 值若为假时则使用者按了Control-. 或是Esc 键都可以离开程式expexp(整数)取一个自然对数的值曾安德编著editable of memberthe editable of member 值设定文字Cast Member是否可以被编辑若为真值则表示其可以被编辑editable of spritethe editableText of sprite 数值设定某个sprite中的Cast Member是否可以被编辑电影在播映的过程间若Cast Member 是可以被编辑的则可以将指令的值设定为真如果不行则设定为假但是这个指令在使用之前必须要将这个sprite设定为PuppetSpriteelseif 表示式一then 动作else 动作end if逻辑判断配合if 使用的在if 後面所使用的表示式为真值时所做的事在else 後面所使用的表示式为假值时所做的事EMPTYEMPTY表示空的字串enabled of menuItemthe enabled of menuItem 项目of menu 值设定功能表之中的某个或多个项目为可以选取的型态或是不可以选取的型态在使用指令的过程时某些指令在某些情形之下也许是无法使用的所以可以将它设定为假而这个指令就会显示成淡灰色的颜色在这个指令之中whichItem 可以是数值也可以是项目的名称endend结束动作通常是Handler的动作end caseend case结束case的动作end repeatexit repeat离开repeat 的回圈endRecordingendRecording结束beginRecording的动作ENTERENTER代表键盘的Enter 键enterFrameon enterFrame动作end enterFrameenterFrame 表示进入此镜头时所该做的动作通常会使用在Handler 中erase membererase member 值删除某个Cast Memberexitexit这个指令会离开目前所执行的Handler回到所呼叫它的地方如果它是由另一个Handler 呼叫就会回到@个Handler 的上面继续执行exit repeatexit repeat结束repeat的动作exitFrameon exitFrame动作end exitFrame这个指令通常是用在Handler 的上面表示当离开此镜头时所可以做的事exitLockthe exitLock这个指令可以锁住Projector 是否可以离开程式若the exitLock 值为真时则不管使用者是否按了Control-. 或是Esc 键都是无法离开程式的但是the exitLock 值若为假时则使用者按了Control-. 或是Esc 键都可以离开程式expexp(整数)取一个自然对数的值fadeInsound fadeIn 数值sound fadeIn 数值, 时间声音淡入的时间长度若您没有附予时间的值时系统内定的值为15 * (60 / (节拍)) fadeOutsound fadeOut 数值sound fadeOut 数值, 时间声音淡出的时间长度若您没有附予时间的值时系统内定的值为15 * (60 / (节拍)) FALSEFALSE逻辑值之假值fieldfield 值当field 指令使用时就表示所指出的Cast Member为一个文字性的Cast Member例如field "entry" 表示名为entry 的文字Cast MemberfileName of castLibthe fileName of castLib 值此Cast Member Library所参考到的档案名称包含它的路径名称fileName of memberthe fileName of member 值Cast Member所参考到的档案名称包含它的路径名称fileName of windowthe fileName of window 值设定某个视窗内执行的电影名称也就是Director 的电影档案这个档案的名称包含路径名filledthe filled of member 值图形填满的方式但只限於应用在Tool视窗的工具所绘制的图形findEmptyfindEmpty(member 值)查询下一个位置为空白的Cast视窗编号例如put findEmpty(cast 10)表示从第10 个Cast Member之後的第一个空白的Cast Member编号为何findPosfindPos(阵列, 值)从含有内容(property)的阵列中找寻出含有身赤涨鼽m为何findPosNearfindPosNear(阵列, 值)findPos 是从含有内容(property)的阵列之中找寻出含有身赤涨鼽m为何而findPosNear 则是从阵列之中找出最接近的一个位置而不是精确的位置finishIdleLoadfinishIdleLoad 值取消载作的动作fixStageSizethe fixStageSize这个指令可以设定是否将舞台的大小固定但只适用於载入新的电影时若fixStageSize 的值为真则载入新的电影时舞台的大小不会受到改变若fixStageSize 的值为假则载入新的电影时舞台的大小会受到改变floatfloat (表示式)将某一个数值表示式改变成为浮点数floatPfloatP(表示式)查询某个数值表示式是否为浮点数若它为浮点数则指令的值为真若它不是浮点数则指令之值为假floatPrecisionthe floatPrecision to 整数设定浮点数後小数位置的位数最大的位数为19font of memberthe font of member 值某个Cast Member所使用的字型fontSize of memberthe fontSize of member 值某个Cast Member所使用的字型大小fontStyle of memberthe fontStyle of member 值某个Cast Member所使用的字型样式foreColor of memberset the foreColor of member 值to 数值设定某个Cast Member的前景颜色foreColor of spritethe foreColor of sprite 数值设定某个sprite的前景颜色但它主要应用在使用工具视窗所制作出来的图形对其它的图形虽有影响但不明显不建议您使用它forget windowforget window 值将某个视窗关闭framethe frame记得使用frame 这个指令时请一定记得使用the 这个字所以the frame 最好配合使用以免出现问题它的意思表示目前镜头的意思通常会与其它的指令使用frameLabelthe frameLabel查询目前这个镜头的名称Marker若没有任何的名称则the frameLabel 的值为空字串framePalettethe framePalette查询目前镜头使用色盘的Cast Member编号frameRate of memberthe frameRate of member 值若Cast Member为影片指令可以用数值来控制影片的播映例如数值意义正常设定的速度-1依正常速度播映每一个镜头-2以最快的速度播映每一个镜头255最大的速度frameScriptthe frameScript查询目前这个镜头所使用的script 编号为何frameSound1the frameSound1第一个声音channel所使用的Cast Member位置frameSound2the frameSound2第二个声音channel所使用的Cast Member位置framesToHMSthe framesToHMS(frames, tempo, dropFrame, fractionalSeconds)当在利用Director 制作出真正的电影时这个指令可以帮助预估设计完成後镜头数相等的时间长度如果想要将电影输出到类比的系统中或许是录影带这个指令可以预先估计所制作的时间长度但是当您在制作NTSC 的系统时而且节拍为30 FPS 时请将dropFrame 设计为真这样会比较精确frameTempothe frameTempo查询目前镜头的节拍frameTransitionthe frameTransition画面更换Transition channel所使用的Cast Member位置freeBlockthe freeBlock记忆体可以使用的空间freeBytesthe freeBytes记忆体可以使用的空间在windows 下freeBlock 与freeBytes 是相同的frontWindowthe frontWindow目前最上方的视窗名称getaPropgetaProp(阵列, 值)从阵列中找寻某个位置上的内容或值如果这是一个线性的阵列Linear List则可以指定某个位置让指令找出它的相对应值为何如果这是含有内容的阵列Property List则可以指定某个内容Property让指令找出它的相对应值为何getAtgetAt(阵列, 位置)找出某个阵列指定位置上的项目填入数值表示阵列的位置指令会找出相对位置上的项目值getLastgetLast(阵列)找出某个阵列最後一个项目的值getNthFileNameInFoldergetNthFileNameInFolder(路径, 档名)找出某一目录之下特定位置的档案名称这个名称包含有路径的名称只要将fileNumber 替代成为档案的位置即可getOnegetOne(阵列, 值)找出阵列之中特定值的位置但这个指令适用於二种不同的阵列它与getPos 唯一不同的地方就是getPos 只适用於线性阵列getPosgetPos(阵列, 值)找出阵列之中特定值的位置但这个指令只适用於线性阵列getPropgetProp(阵列, 值)找出含有内容阵列中特定内容所相对应的值getPropAtgetPropAt(阵列, 值)找出含有内容阵列之中特定位置上相对应的内容符号globalglobal 变数一[,变数二] ...宣告变数为global 的变数所谓global 的变数是表示这个变数可以在电影的任何位置上使用它global 变数也可以在任何位置上宣告它gogo 数值go to 数值go to frame 值go movie 电影档名go to movie 电影档名go 值of movie 电影名go to 值of movie 电影名go to frame 值of movie 电影名跳跃到特定的镜头上播映用法有许多种看您的用途而定go loopgo loopLoop 是回圈之意但回圈的动作以(Marker)为主所以它的回圈动作并非在特定的镜头上做回圈的动作如果go loop 所在的镜头上有一个场记它的动作就等於go to the frame等於画面在同一个镜头上一直回圈也就等於镜头静止的意思但若是go loop 所在的位置上没有(Marker)名称则播映头会跳跃到从现在的镜头往回数到有场记的镜头上重覆播映这二种不同的应用要特别注意go nextgo next。
LINGO基本语法和编程
问题旳模型(能够看出是LP模型 )
目旳函数是全部费用旳和 MIN {400RP(I ) 450OP(I ) 20INV (I )} I 1,2,3,4
位置为(x j , y j ),日储量为ej , j 1,2 ;从料场 j 向工地i 旳
运送量为cij 。
2 6
2
2
MIN f
cij x j ai y j bi
1
j1 i1
2
s.t.
cij di , i 1, 2, , 6
2
j 1
6
cij ej , j 1, 2
3
“X=5,2; Y=1,7;”
输入程序
定义目旳和约束,与前例旳措施是类似(这里
包括了派生集合),请注意这里用到了集合函
在程序开头用TITLE语句 对这个模型取了一种标题 “LOCATION PROBLEM; 而且对目旳行([OBJ])和 两类约束
注:在程序中若没有Model和End也能执行,但提 议写完整原则旳程序
LINGO程序基本构造
2:五段(Section)构造
Model:
Title “Example” 集合段 数据段 初始段 计算段 目的和约束段
五段构造中目旳和约束段一般 是不可少旳,集合段用得比较 多,数据段次之,初始段和计 算段不一定有。这些段旳顺序 可调换。
集合及其属性
• QUARTERS集合旳属性
• DEM
• RP
第三章 LINGO软件使用入门及命令集
第三章 LINGO软件使用入门LINGO是美国LINDO系统公司开发的一套专门用于求解最优化问题的软件.它为求解最优化问题提供了一个平台,主要用于求解线性规划、非线性规划、整数规划、二次规划、线性及非线性方程组等问题.它是最优化问题的一种建模语言,包含有许多常用的函数供使用者编写程序时调用,并提供了与其他数据文件的接口,易于方便地输入,求解和分析大规模最优化问题,且执行速度快.由于它的功能较强,所以在教学、科研、工业、商业、服务等许多领域得到了广泛的应用.§3.1 LINGO操作界面简介在Windows操作系统下启动LINGO软件,屏幕上首先显示如图1.1所示的窗口.图1.1图1.1中最外层的窗口是LINGO软件的主窗口(LINGO软件的用户界面),所有其他窗口都在这个窗口之内.主窗口有:标题栏、菜单栏、工具栏和状态栏.目前,状态栏最左边显示的是“Ready”,表示准备就绪,右下角显示的是当前时间,时间前面是当前光标的位置“Ln 1,Col 1”(即1行1列).将来用户可以用选项命令(LINGO|Options|Interface菜单命令)决定是否需要显示工具栏和状态栏.LINGO有5个主菜单:●File(文件)●Edit(编辑)●LINGO(LINGO系统)●Windows(窗口)●Help(帮助)这些菜单的用法与Windows下其他应用程序的标准用法类似,下面只对主菜单中LINGO系统的主要命令进行简要介绍.LINGO系统(LINGO)的主菜单●LINGO|Solve(Ctrl-S)LINGO|Solve(Ctrl-S)(求解)命令对当前模型进行编译并求解.如果当前模型输入有错误,编译时将报告错误.求解时会显示一个求解器运行状态窗口.●LINGO|Solution(Ctrl-O)LINGO|Solution(Ctrl-O)(解答)命令显示当前解.●LINGO|Range(Ctrl-R)LINGO|Range(Ctrl-R)(灵敏度分析)命令显示当前解的灵敏度分析结果.(你必须在此之前求解过当前模型)●LINGO|Options(Ctrl-I)LINGO|Options(Ctrl-I)(选项)命令将打开一个含有7个选项卡的对话框窗口,你可以通过它修改LINGO系统的各种控制参数和选项.修改完以后,你如果单击“应用”按钮,则新的设置马上生效;如果单击“OK”按钮,则新的设置马上生效,并且同时关闭该窗口;如果单击“Save”按钮,则将当前设置变为默认设置,下次启动LINGO时这些设置仍然有效;如果单击“Default”按钮,则恢复LINGO系统定义的原始默认设置;如果单击“Cancel”按钮将废弃本次操作,退出对话框;单击“Help”按钮将显示本对话框的帮助信息.●LINGO|Generate和LINGO|PictureLINGO|Generate和LINGO|Picture命令都是在模型窗口下才能使用,他们的功能是按照LINGO模型的完整形式分别以代数表达式形式和矩阵图形形式显示目标函数和约束.●LINGO|Debug(Ctrl+D)LINGO|Debug(Ctrl+D)命令分析线性规划无解或无界的原因,建议如何修改●LINGO|Model Statistics(Ctrl+E)LINGO|Model Statistics(Ctrl+E)命令显示当前模型的统计信息.●LINGO|Look(Ctrl+L)LINGO|Look(Ctrl+L)命令显示当前模型的文本形式,显示时对所有行按顺序编号.图1.2给出了工具栏的简要功能说明.图1.2当前光标所在的窗口(窗口标题栏上标有“LINGO Model-LINGO1”),就是模型窗口(model windows),也就是用于输入LINGO优化模型(即LINGO程序)的窗口.§3.2 LINGO模型的基本特征LINGO模型(程序)从LINGO模型窗口输入,它以语句“MODEL:”开始,以语句“END”结束.它是由一系列语句组成,每个语句都是以分号“;”结束,语句是组成LINGO模型的基本单位.每行可以写多个语句,为了保持模型的可读性,最好一行只写一个语句,并且按照语句之间的嵌套关系对语句安排适当的缩进,增强层次感.以感叹号“!”开始的语句是注释语句(注释语句也需要以分号“;”结束).LINGO模型(程序)一般由5个部分(或称5段)组成:(1)集合段(SETS):这部分要以“SETS:”开始,以“ENDSETS”结束,作用在于定义必要的集合变量(SET)及其元素(member,含义类似于数组的下标)和属性(attribute,含义类似于数组).格式有基本集和派生集两种.基本集:Setname(集合变量名)[/member_list(元素列表)/][:attribute_list(属性列表)];元素列表可以全部一一列出,也可以用格式“/元素1..元素N/”列出,例如SETS:STUDENTS/1,2,3,4,5/:NAME,AGE;ENDSETSSETS:STUDENTS/1..5/:NAME,AGE;ENDSETS派生集:Setname(parent_set_list(源集列表))[/member_list/][:attribute_list];例如SETS:PRODUCT/A B/;MACHINE/M N/;WEEK/1..2/;ALLOWED( PRODUCT,MACHINE,WEEK);ENDSETS列表可以用逗号“,”分开,也可以用空格分开.(2)数据段(DATA):这部分要以“DATA:”开始,以“ENDDATA”结束,作用在于对集合的属性(数组)输入必要的常数数据.格式为:attribute_list(属性列表)=value_list(常数列表);例如SETS:SET1 /A, B, C/: X, Y;ENDSETSDATA:X = 1 2 3;Y = 4 5 6;ENDDATA(3)初始化段(INIT):这部分要以“INIT:”开始,以“ENDINIT”结束,作用在于对集合的属性(数组)给出初值.格式为:attribute_list(属性列表)=value_list(常数列表);与数据段的用法类似.(4)计算段(CALC):这部分要以“CALC:”开始,以“ENDCALC”结束,作用在于对一些原始数据进行计算处理.因为在实际问题中,输入的数据往往是原始数据,不一定能在模型中直接使用,可以在这个段对这些原始数据进行一定的“预处理”,得到模型中真正需要的数据.在计算段中语句是顺序执行的.(5)目标与约束段:这部分没有段的开始和结束标记,作用在于给定目标函数与约束条件.可见除这一段外,其他4个段都有明确的段标记.这一段是模型的主要部分,其他段是为这一段服务的.其他四段可以没有,这一段必须要有.否则不称其为模型.这一段一般要用到LINGO的运算符和各种函数.§3.3 LINGO的运算符和函数LINGO包含有大量的运算符和函数,供程序(建立优化模型)调用,其功能很强.充分利用这些函数,对解决问题将是非常方便的.下面给出部分函数及简要功能介绍,全部函数及详细功能说明可进一步参考LINGO的使用手册.一、运算符及其优先级LINGO的运算符有三类:算数运算符、逻辑运算符和关系运算符.1.算术运算符:LINGO中的算术运算符有以下5种:+(加法),-(减法或负号),*(乘法),/(除法),∧(求幂).算术运算是数与数之间的运算,运算结果仍是数.2.逻辑运算符:LINGO中的逻辑运算符有以下9种,可以分成两类:(1)#AND#(与),#OR#(或),#NOT#(非):这三个运算是逻辑值之间的运算,也就是它们操作的对象本身必须已经是逻辑值或逻辑表达式,计算结果也是逻辑值.(2)#EQ#(等于),#NE#(不等于),#GT#(大于),#GE#(大于等于),#LT#(小于),#LE#(小于等于):这6个操作实际上是“数与数之间”的比较,也就是它们操作的对象本身必须是两个数,而逻辑表达式计算的结果是逻辑值.3.关系运算符:LINGO中的关系运算符有以下3种:<(即<=,小于等于),=(等于),>(即>=,大于等于)这三个运算符虽然也是“数与数之间”的比较,但在LINGO中只用来表示优化模型的约束条件,所以不是真正意义上的运算.这些运算符的优先级如表3.1所示(同一优先级按左到右的顺序执行;如果有括号“()”,则括号内的表达式优先进行计算)表3.1二、基本的数学函数在LINGO中写程序时可以调用大量的内部函数,这些函数以“@”符号打头(类似调用命令).LINGO中数学函数的用法与其它语言中的数学函数的用法类似,主要有以下函数:@ABS(X):绝对值函数,返回X的绝对值.@COS(X):余弦函数,返回X的余弦值(X的单位是弧度).@EXP(X):指数函数,返回e x的值.@FLOOR(X):取整函数,返回X的整数部分(向最靠近0的方向取整).@LGM(X):返回X的伽马(Gamma)函数的自然对数值.@LOG(X):自然对数函数,返回X的自然对数值.@MOD(X,Y):模函数,返回X对Y取模的结果.@POW(X,Y):指数函数,返回X Y的值.@SIGN(X):符号函数,返回X的符号值(X<0时返回-1,X>=0返回1).@SIN(X):正弦函数,返回X的正弦值.@SMAX(list):最大值函数,返回列表(list)中的最大值.@SMIN(list):最小值函数,返回列表(list)中的最小值.@SQR(X):平方函数,返回X的平方值.@SQRT(X):平方根函数,返回X的正的平方根的值.@TAN(X):正切函数,返回X的正切值.三、集合循环函数集合循环函数是指对集合上的元素(下标)进行循环操作的函数,主要有@FOR,@MAX,@MIN,@SUM,@PROD五种,其用法如下:@function(setname[(set_index_list)[|conditional_qualifier]]:expression_list);其中:Function是集合函数名;Setname是集合名;set_index_list是集合索引列表(不需要使用索引时可以省略);|conditional_qualifier是用逻辑表达式给出的过滤条件(无条件时可以省略);:expression_list是一个表达式(对@FOR函数,可以是一组表达式).下面简要介绍其作用.@FOR(setname[(set_index_list)[|cond_qualifier]]:exp_list):对集合setname中的每个元素独立地生成由exp_list描述的表达式(通常是优化问题的约束).@MAX(setname[(set_index_list)[|cond_qualifier]]:exp):返回集合setname上的表达式exp的最大值.@MIN(setname[(set_index_list)[|cond_qualifier]]:exp):返回集合setname上的表达式exp的最小值.@SUM(setname[(set_index_list)[|cond_qualifier]]:exp):返回集合setname上的表达式exp的和.@PROD(setname[(set_index_list)[|cond_qualifier]]:exp):返回集合setname上的表达式exp的积.四、集合操作函数集合操作函数是指对集合进行操作的函数,主要有@INDEX,@IN,@WRAP,@SIZE四种,下面简要介绍其作用.@INDEX([set_name,]primitive_set_element):返回元素primitive_set_element在集合set_name中的索引值(即按定义集合时元素出现顺序的位置编号).如果省略集合名set_name,LINGO按程序定义的集合顺序找到第一个含有元素primitive_set_element的集合,并返回索引值.如果在所有集合中均没有找到该元素,会给出出错信息.@IN(set_name,primitive_index_1[,primitive_index_2 ...]):判断一个集合中是否含有索引值.集合set_name 中包含由索引primitive_index_1[,primitive_index_2...]所表示的对应元素,则返回1(逻辑值“真”),否则返回0(逻辑值“假”).@WRAP(INDEX,LIMIT):返回J=INDEX-K*LIMIT,其中J 位于区间[1,LIMIT],K 为整数.当INDEX 位于区间[1,LIMIT]内时直接返回INDEX .相当于数学上用INDEX 对LIMIT 取模函数的值+1,即@WRAP(INDEX,LIMIT)=@MOD(INDEX,LIMIT)+1.此函数对LIMIT <1无定义.可以想到,此函数的目得之一是防止集合的索引值越界.@SIZE(set_name):返回集合set_name 的模,即元素的个数.五、变量定界函数变量定界函数是对变量的取值范围加以限制的函数.主要有@BIN, @BND, @FREE, @GIN 四种,下面简要介绍其作用.@BIN(variable):限制变量variable 为0或1. @BND(lower_bound, variable, upper_bound):限制lower_bound <=variable <=upper_bound@FREE(variable):取消对变量variable 的符号限制(即可取负数、0或正数). @GIN(variable):限制变量variable 为整数.六、财务会计函数财务会计函数是用于计算净现值的函数.主要有@FPA, @FPL 两种,下面简要介绍其作用. @FPA(I,N):返回若干时段单位等额回收净现值.其中单位时段利率为I,时段N 个,即∑=+=Nn nI N I FPA 1)1(1),(@@FPL(I,N):返回一个时段单位回收净现值.其中单位时段利率为I,时段N ,即NI N I FPL )1(1),(@+=七、概率中的相关函数概率中的相关函数是涉及到概率论和随机过程中的一些函数.主要有以下函数: @PSN(X):返回标准正态分布的分布函数在X 点的取值.@PSL(X):标准正态的线性损失函数,即返回MAX(0,Z-X)的期望值,其中Z 为均值为A的Poisson随机变量.@PPS(A,X):返回均值为A的Poisson分布的分布函数在X点的取值.@PPL(A,X):Poisson分布的线性损失函数,即返回MAX(0,Z-X)的期望值,其中Z为标准正态随机变量.@PBN(P,N,X):返回参数为(N,P)的二项分布的分布函数在X点的取值.@PHG(POP,G,N,X):返回总共有POP个球,其中G个是白球,随机地从中取出N个球,白球不超过X的概率.@PFD(N,D,X):返回自由度为N和D的F分布的分布函数在X点的取值.@PCX(N,X):返回自由度为N的2分布的分布函数在X点的取值.@PTD(N,X):返回自由度为N的t分布的分布函数在X点的取值.@PEB(A,X):返回当到达负荷(强度)为A,服务系统有X个服务器且允许无穷排队时的Erlang繁忙概率.@PEL(A,X):返回当到达负荷(强度)为A,服务系统有X个服务器且不允许排队时的Erlang繁忙概率.@PFS(A,X,C):返回当负荷上限为A,顾客数为C,并行服务器数量为X时,有限源的Poisson服务系统得等待顾客数的期望值.@QRAND(SEED):返回0与1之间的多个拟均匀随机数,其中SEED为种子,默认时取当前计算机时间为种子.该函数只能用在数据段(DATA-ENDDATA).@RAND(SEED):返回0与1之间的一个伪均匀随机数,其中SEED为种子.八、文件输入输出函数文件输入输出函数是指通过文件输入数据和输出结果的函数.主要有以下函数:@FILE('filename'):这个函数提供LINGO与文本文件的接口,用于引用其它ASCII码或文本文件中的数据,其中filename为存放数据的文件名(包括路径,没有指定路径时表示当前目录),该文件中记录之间必须用符号“~”分开.主要用在集合段和数据段,通过文本文件输入数据.@TEXT(['filename']):用于数据段中将解答结果送到文本文件filename中.@ODBC(['data_source'[,'table_name'[,'col_1'[, 'col_2'...]]]]):这个函数提供LINGO与ODBC(open data base connection,开放式数据库连接)的接口,用于集合段和数据段中引用其它数据库数据或将解答结果送到数据库中.其中data_source是数据库名,table_name是数据表名,col_i是数据列名(数据域名).@OLE('spreadsheet_file'[,range_name_list]):这个函数提供LINGO与OLE(object linking and embedding,对象链接与嵌入)的借口,用于集合段、数据段和初始段中输入和输出数据库.其中spreadsheet_file是文件名,range_name_list是文件中包含数据的单元范围.@POINTER(N):在Windows 下使用LINGO 的动态链接库(dynamic link library ,DLL ),直接从共享的内存中传送数据.§3.4 LINGO 软件求解案例一、生产管理问题1.问题实例某厂有5种设备A 1,A 2,…,A 5,用来加工7种零部件B 1,B 2,…,B 7,每种设备的数量、每种零部件的单位成本及所需各设备的加工工时(以小时计)见表1表1在其后的半年中,工厂有设备检修计划(停工检修时间一个月)见表2 表2工厂在半年中有订单(必须按时交货)见表3 表3 每种零部件库存最多可到100件,现每种零部件有库存80件,库存费用每件每月为0.5元,,要求到六月底每种零部件有存货50件,每种零部件生产至少50件.工厂每周工作5天,每天2班,每班8小时.试回答如下问题:(1) 工厂如何安排各月份各种零部件的加工数量? (2) 单位成本有10%的变化,对计划有什么影响? (3) 设备各增加1台对计划有什么的影响. 2.模型建立设: ij a 为第j 种零部件在第i 种设备上的单位加工工时)7,,2,1,5,,2,1( ==j i ;ik b 为第i 种设备在第k 月的数量)6,,2,1,5,,2,1( ==k i ; kj d 为第k 月第j 种零部件的顶单数量)7,,2,1,6,,2,1( ==j k ; j c 为第j 种零部件的单位收益)7,,2,1( =j ;kj x 为第k 月第j 种零部件的生产数量)7,,2,1,6,,2,1( ==j k ; kj s 为第k 月末第j 种零部件的库存数量)7,,2,1,6,,2,1( ==j k ; 800=j s 为初始库存)7,,2,1( =j假设每月以20天计,有以下模型:⎪⎪⎪⎪⎪⎩⎪⎪⎪⎪⎪⎨⎧==≥≥==≥=≤====-+===≤+-=====∑∑∑∑∑)(7,,2,1,6,,2,1,0,07,,2,1,6,,2,1,50)(7,,2,1,100)(7,,2,1,50)(7,,2,1,6,,2,1,)(6,,2,1,5,,2,13205.0min6(617161617171非负约束生产要求个月末的库存第种零部件的库存月第第种设备的有效工时月第第费用目标))(,库存约束 j k s x j k x j s j s j k d x s s k i b x a sx ckj kj kj kjjkj kj j k kj ik j kj ij k k j kjj kj jj k i k3.模型求解利用LINGO 软件计算,输入model: sets:cp/1..7/:c; yf/1..6/:; sb/1..5/:;sl1(yf,cp):x,d,s; sl2(sb,cp):a;sl3(sb,yf):b; endsets data:a=0.5 0.7 0.0 0.0 0.3 0.2 0.5 0.1 0.2 0.0 0.3 0.0 0.6 0.0 0.2 0.0 0.8 0.0 0.0 0.0 0.6 0.05 0.03 0 0.07 0.1 0 0.08 0 0 0.01 0 0.05 0 0.05; b=3 4 4 4 3 4 2 2 1 1 1 2 3 1 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1;d=250 500 150 150 400 100 100 300 250 100 0 200 150 100 150 300 0 0 250 200 100 100 150 200 250 100 0 100 0 100 250 100 500 150 0 250 250 100 300 550 250 100; c=100 60 80 40 110 90 30; enddatamin=@sum(sl1(k,j):c(j)*x(k,j)+0.5*s(k,j));@for(yf(k):@for(sb(i):@sum(cp(j):a(i,j)*x(k,j))<=320*b(i,k))); @for(yf(k)|k#gt#1:@for(cp(j):s(k,j)=s(k-1,j)+x(k,j)-d(k,j))); @for(cp(j):s(1,j)=80+x(1,j)-d(1,j)); @for(cp(j):s(6,j)=50);@for(sl1(k,j):s(k,j)<=100); @for(sl1(k,j):x(k,j)>=50); end(1)计算结果有:目标函数:590580 z(2)目标的灵敏度分析:Objective Coefficient Ranges(目标系数的灵敏度分析)Current Allowable Allowable Variable Coefficient Increase Decrease 变量目前系数允许增加范围允许减少范围X( 1, 1) 100.0000 INFINITY 0.5000000 X( 1, 2) 60.00000 INFINITY 0.5000000X( 1, 3) 80.00000 INFINITY 0.5000000X( 1, 4) 40.00000 INFINITY 1.500000X( 1, 5) 110.0000 INFINITY 0.5000000X( 1, 6) 90.00000 INFINITY 0.5000000X( 1, 7) 30.00000 INFINITY 0.5000000X( 2, 1) 100.0000 0.5000000 0.5000000X( 2, 2) 60.00000 0.5000000 0.5000000X( 2, 3) 80.00000 0.5000000 1.000000X( 2, 4) 40.00000 INFINITY 1.000000X( 2, 5) 110.0000 0.5000000 0.5000000X( 2, 6) 90.00000 0.5000000 0.5000000X( 2, 7) 30.00000 0.5000000 0.5000000X( 3, 1) 100.0000 0.5000000 0.5000000X( 3, 2) 60.00000 0.5000000 0.5000000X( 3, 3) 80.00000 INFINITY 0.5000000X( 3, 4) 40.00000 INFINITY 0.5000000X( 3, 5) 110.0000 0.5000000 0.5000000X( 3, 6) 90.00000 0.5000000 1.000000X( 3, 7) 30.00000 0.5000000 0.5000000X( 4, 1) 100.0000 0.5000000 1.000000X( 4, 2) 60.00000 0.5000000 0.5000000X( 4, 3) 80.00000 0.5000000 0.5000000X( 4, 4) 40.00000 0.5000000 0.5000000X( 4, 5) 110.0000 0.5000000 0.5000000X( 4, 6) 90.00000 INFINITY 0.5000000X( 4, 7) 30.00000 0.5000000 1.000000X( 5, 1) 100.0000 INFINITY 0.5000000X( 5, 2) 60.00000 0.5000000 0.5000000X( 5, 3) 80.00000 0.5000000 0.5000000X( 5, 4) 40.00000 0.5000000 0.5000000X( 5, 5) 110.0000 0.5000000 0.5000000X( 5, 6) 90.00000 0.5000000 0.5000000X( 5, 7) 30.00000 INFINITY 0.5000000X( 6, 1) 100.0000 0.5000000 INFINITYX( 6, 2) 60.00000 0.5000000 INFINITYX( 6, 3) 80.00000 0.5000000 INFINITYX( 6, 4) 40.00000 0.5000000 INFINITYX( 6, 5) 110.0000 0.5000000 INFINITYX( 6, 6) 90.00000 0.5000000 INFINITYX( 6, 7) 30.00000 0.5000000 INFINITY 其中INFINITY是无穷.从以上灵敏度分析可见,提高10%,有超出允许范围的,所以对计划有影响.(3)约束条件的灵敏度分析:Righthand Side Ranges(右边常数项的灵敏度分析)Row Current Allowable AllowableRHS Increase Decrease行目前常数项允许增加范围允许减少范围2 960.0000 INFINITY 450.00003 640.0000 INFINITY 488.00004 960.0000 INFINITY 840.00005 320.0000 INFINITY 258.00006 320.0000 INFINITY 300.80007 1280.000 INFINITY 836.00008 640.0000 INFINITY 473.00009 320.0000 INFINITY 138.000010 320.0000 INFINITY 268.400011 320.0000 INFINITY 305.500012 1280.000 INFINITY 830.000013 320.0000 INFINITY 110.000014 960.0000 INFINITY 830.000015 320.0000 INFINITY 267.000016 320.0000 INFINITY 302.000017 1280.000 INFINITY 1035.00018 320.0000 INFINITY 205.000019 960.0000 INFINITY 760.000020 320.0000 INFINITY 282.000021 320.0000 INFINITY 308.500022 960.0000 INFINITY 670.000023 640.0000 INFINITY 525.000024 960.0000 INFINITY 720.000025 320.0000 INFINITY 253.500026 320.0000 INFINITY 290.000027 1280.000 INFINITY 655.000028 640.0000 INFINITY 270.000029 640.0000 INFINITY 410.000030 320.0000 INFINITY 206.000031 320.0000 INFINITY 283.5000 从以上灵敏度分析可见,提高1台,没有超出允许范围的,所以对计划没有影响.也可以将数据与模型分离,先准备数据文件exam01.ldt:!单耗;0.5 0.7 0.0 0.0 0.3 0.2 0.50.1 0.2 0.0 0.3 0.0 0.6 0.00.2 0.0 0.8 0.0 0.0 0.0 0.60.05 0.03 0 0.07 0.1 0 0.080 0 0.01 0 0.05 0 0.05~!设备数量;3 4 4 4 3 42 2 1 1 1 23 1 3 3 3 21 1 1 1 1 11 1 1 1 1 1~!需求;250 500 150 150 400 100 100300 250 100 0 200 150 100150 300 0 0 250 200 100100 150 200 250 100 0 1000 100 250 100 500 150 0250 250 100 300 550 250 100~!单位成本;100 60 80 40 110 90 30~再写程序如下:model:sets:cp/1..7/:c;yf/1..6/:;sb/1..5/:;sl1(yf,cp):x,d,s;sl2(sb,cp):a;sl3(sb,yf):b;endsetsdata:a=@file('exam01.ldt');b=@file('exam01.ldt');d=@file('exam01.ldt');c=@file('exam01.ldt');enddatamin=@sum(sl1(k,j):c(j)*x(k,j)+0.5*s(k,j));@for(yf(k):@for(sb(i):@sum(cp(j):a(i,j)*x(k,j))<=320*b(i,k)));@for (yf(k)|k#gt#1:@for (cp(j):s(k,j)=s(k-1,j)+x(k,j)-d(k,j))); @for (cp(j):s(1,j)=80+x(1,j)-d(1,j)); @for (cp(j):s(6,j)=50);@for (sl1(k,j):s(k,j)<=100); @for (sl1(k,j):x(k,j)>=50); end二、下料问题1.问题实例有某种材料一根长19米.现需用其切割4米长毛坯50根、5米长毛坯10根、6米长毛坯20根、8米长毛坯15根.如何切割使其用料最省?要求切割模式不能超过3种. 2.模型建立设:4,3,2,1=i 分别表示4米长,5米长,6米长,8米长的毛坯;i a 为第i 种毛坯的长度)4,3,2,1(=i ; i b 为第i 种毛坯的需要量)4,3,2,1(=i ;j x 为第j 种切割模式所用的材料数量)3,2,1(=j ;ij r 为第j 种切割模式切割第i 种毛坯的数量)3,2,1,4,3,2,1(==j i .一种合理的切割模式应满足:其余料长度不应该大于或等于需要切割毛坯的最小长度.于是有模型如下⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧==≥≥=≥=≤=≥=∑∑∑∑====3,2,1,4,3,2,1,0,0(3,2,1,16(3,2,1,19(4,3,2,1,(min 41413131j i r x j r a j r a i b x r xz ij ji ij i i ij i i j j ij j j且整数合理的下料模式所下毛坯的总长所下毛坯的需要量用料目标))))3.模型求解为了便于运算,我们先来缩小可行域.由于3种切割模式的排列顺序是无关紧要的,所以不妨增加以下约束:321x x x ≥≥又注意到用料的总量有明显的上界和下界.首先,无论如何,用料总量不可能少于2619158206105504=⎥⎥⎤⎢⎢⎡⨯+⨯+⨯+⨯其次,考虑一种特殊的下料计划:模式1:切割成4根4米钢管,需13根;模式2:切割成1根5米和2根6米钢管,需10根;模式3:切割成2根8米钢管,需8根.这样需要13+10+8=31于是可得到解的一个上界.所以又可增加约束:3126321≤++≤x x x利用LINGO 软件计算,输入 model: sets:needs/1..4/:a,b; cuts/1..3/:x;patterns(needs,cuts):r; endsets data: a=4 5 6 8; b=50 10 20 15; enddatamin=@sum(cuts(j):x(j));!用料目标;@for(needs(i):@sum(cuts(j):x(j)*r(i,j))>b(i));!需要量要求; @for(cuts(j):@sum(needs(i):a(i)*r(i,j))<19);!材料总长; @for(cuts(j):@sum(needs(i):a(i)*r(i,j))>16);!合理模式; @sum(cuts(j):x(j))>26;!用料下限; @sum(cuts(j):x(j))<31;!用料上限;@for(cuts(j)|j#lt#@size(cuts):x(j)>x(j+1));!人为约束; @for(cuts(j):@gin(x(j)));!整数约束;@for(patterns(i,j):@gin(r(i,j)));!整数约束; end经过LINGO 求解,得到输出如下:Objective value: 28.00000 Variable Value Reduced Cost X( 1 ) 10.00000 0.000000X( 2 ) 10.00000 2.000000X( 3 ) 8.000000 1.000000R( 1, 1) 3.000000 0.000000R( 1, 2) 2.000000 0.000000R( 1, 3) 0.000000 0.000000R( 2, 1) 0.000000 0.000000R( 2, 2) 1.000000 0.000000R( 2, 3) 0.000000 0.000000R( 3, 1) 1.000000 0.000000R( 3, 2) 1.000000 0.000000R( 3, 3) 0.000000 0.000000R( 4, 1) 0.000000 0.000000R( 4, 2) 0.000000 0.000000R( 4, 3) 2.000000 0.000000即按照模式1、2、3分别切割10、10、8根材料,使用材料总根数为28根.第一种切割模式下1根材料切割3根4米的和1根6米的;第二种切割模式下1根材料切割2根4米的、1根5米的和1根6米的;第三种切割模式下1根材料切割2根8米的.三、投资组合问题1.问题实例有三种股票A,B,C,其前12年的价值每年的增长情况如表所示表中还给出了相应年份的500种股票的价格指数的增长情况.假设目前你有一笔资金准备投资这三种股票,并期望年收益率达到15%,那么你应如何投资? 2.模型建立设:3,2,1=i 分别表示表示A,B,C 三种股票;i R 为第i 种股票的价值)3,2,1(=i ;ij R 为第i 种股票第j 年的价值)12,,2,1,3,2,1( ==j i ; M 为指数;j M 为第j 年的指数)12,,2,1( =j ;i x 为投资第i 种股票比例)3,2,1(=i .股票指数反映的是股票市场的大势信息,对每只股票的涨跌是有影响的.假设每只股票的收益与股票指数成线性关系.即i i i i e M b a R ++=或12,,2,1,3,2,1, ==++=j i e Mb a R ij jij ij ij其中ij ij b a ,是待定系数,ij e 是一个随机误差,其均值为0)(=ij e E ,方差为)(2ij ij e D s =,此外假设随机误差ij e 与其他股票和股票指数都是独立的,所以0)()(==j ij kj ij M e E e e E .先根据所给数据回归计算ij ij b a ,,即使误差的平方和最小:3,2,1,||min12121212=-+=∑∑==i R Mb aej ij jij ijj ij可用Matlab 软件做该回归计算,也可用LINGO 软件分别来做每只股票的回归计算,输入 model: sets:year/1..12/:M,R,a,b,e; endsets data:R=1.300 1.103 1.216 0.954 0.929 1.056 1.038 1.089 1.090 1.083 1.035 1.176;M=1.258997 1.197526 1.364361 0.919287 1.057080 1.055012 1.187925 1.317130 1.240164 1.183675 0.990108 1.526236; enddatacalc:mean0=@sum(year(j):M(j))/@size(year);s20=@sum(year(j):@sqr(M(j)-mean0))/(@size(year)-1); s0=@sqrt(s20); endcalc min=s2;s2=@sum(year(j):@sqr(e(j)))/(@size(year)-2); s=@sqrt(s2);@for(year(j):e(j)=R(j)-a-b*M(j)); @for(year(j):@free(e(j))); @free(a);@free(b);End对上面的程序,注意以下几点: (1)只给了一种股票的价值R ;(2)在CALC 段直接计算了M 的均值mean0和方差s20以及标准差s0(为了使这个估计是无偏估计,分母是11而不是12);(3)程序中用到平方函数@sqr 和平方根函数@sqrt ;(4)除了计算回归系数外,同时估计了回归误差s2和标准差s ,为了使这个估计是无偏估计,分母是10而不是11和12,这是因为此时已经假设保持误差的均值为0,所以自由度又少了一个;(5)@free(a),@free(b),@free(e)三个语句不能少,因为它们不一定是非负的; 运行这个LINGO 模型,结果为:Objective value: 0.5748320E-02Variable Value Reduced Cost MEAN0 1.191458 0.000000 S20 0.2873661E-01 0.000000 S0 0.1695188 0.000000 S2 0.5748320E-02 0.000000 S 0.7581767E-01 0.000000 A 0.5639761 0.000000 B 0.4407264 0.000000也就是说:M 的均值191458.10=m ,方差02873661.020=s ,标准差1695188.00=s ,对股票A ,回归系数5639761.01=a ,4407264.01=b ,误差的方差005748320.021=s ,误差的标准差07581767.01=s .同理,可以得到:对股票B ,回归系数239802.1,2635059.022=-=b a ,误差的方差01564263.022=s ,误差的标准差1250705.02=s .对股票C ,回归系数523798.1,5809590.033=-=b a ,误差的方差03025165.023=s ,误差的标准差1739300.03=s .于是,年投资收益为∑∑==++==3131)(i i i i ii i ie M b a xR xR收益的期望为∑∑==+=++=31031)()(i i i ii i i i im b a xe M b a E xER收益的方差为∑∑==+=++=3122202312])[()(i i i iii i i i is x s bx e M b a D xDR 进一步,令∑=iibx y ,则模型应该为⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧≥≥+==+=∑∑∑∑====015.1)(1 ..)(min 31031313122202ii i i i i ii ii i i i x m b a x x b x y t s s x s y z 3.模型求解利用LINGO 软件计算,输入 model: sets:stocks/1..3/:u,b,s2,x; endsets data:mean0=1.191458;s20=0.02873661;s2=0.005748320,0.01564263,0.03025165; u=0.5639761,-0.2635059,-0.5809590; b=0.4407264,1.239802,1.523798; enddatamin=s20*@sqr(y)+@sum(stocks(i):s2(i)*@sqr(x(i))); @sum(stocks(i):b(i)*x(i))=y; @sum(stocks(i):x(i))=1;@sum(stocks(i):(u(i)+b(i)*mean0)*x(i))>1.15; end运算这个LINGO 模型,输出结果如下Objective value: 0.2465621E-01 Y 0.8453449 0.000000 X( 1) 0.5266052 0.000000 X( 2) 0.3806461 0.000000 X( 3) 0.9274874E-01 0.000000根据运算结果可知:A 大约占初始时刻总资产的53%,B 占38%,C 占9%.四、最小费用最大流问题1.问题实例需要将某地s 的天然气通过管道输送到另一地t ,中间有4个中转站4321,,,v v v v .由于输气管道的长短粗细不一或地质等原因,使得每条管道上的运输量及费用不同.下图给出了这两地与中转站的连接以及管道的容量、费用:图中括号里第一个数字是管道容量,第二个数字是管道单位运费.考虑s 地到t 地如何输送天然气,使得费用最小流量最大. 2.模型建立设:V 为网络顶点集,A 为网络的弧集;ij f 为弧),(j i 上的流量;ij b 为弧),(j i 上的单位运费; ij c 为弧),(j i 上的容量;)(f v 为发点处的净流量.根据最大流的定义,我们有模型如下:⎪⎪⎪⎩⎪⎪⎪⎨⎧⎪⎪⎩⎪⎪⎨⎧∈≤≤⎪⎩⎪⎨⎧≠=-==-∑∑∑∈∈∈∈∈A j i c f t s i ti f v s i f v f f t s f v t s f bij ij A i j V j ji A j i V j ij Aj i ijij),(,0, 0 )( ),(..)(max ..min),(),(),( 3.模型求解先考虑最大流模型,LINGO 软件输入如下 model: sets:nodes/s,1,2,3,4,t/;arcs(nodes,nodes)/s,1 s,2 1,2 1,3 2,4 3,2 3,t 4,3 4,t/:c,f; endsets data:c=8 7 5 9 9 2 5 6 10; enddata max=flow;@for(nodes(i)|i#ne#1 #and# i#ne#@size(nodes):@sum(arcs(i,j):f(i,j))-@sum(arcs(j,i):f(j,i))=0);@sum(arcs(i,j)|i#eq#1:f(i,j))=flow; @for(arcs(i,j):@bnd(0,f(i,j),c(i,j))); end计算结果如下:Objective value: 14.00000Variable Value Reduced Cost FLOW 14.00000 0.000000F( S, 1) 7.000000 0.000000F( S, 2) 7.000000 0.000000F( 1, 3) 5.000000 0.000000F( 2, 4) 9.000000 -1.000000F( 3, 2) 0.000000 0.000000F( 3, T) 5.000000 -1.000000F( 4, 3) 0.000000 1.000000F( 4, T) 9.000000 0.000000 其次考虑最小费用最大流模型,LINGO软件输入如下model:sets:nodes/s,1,2,3,4,t/;arcs(nodes,nodes)/s,1 s,2 1,2 1,3 2,4 3,2 3,t 4,3 4,t/:b,c,f;endsetsdata:b=2 8 5 2 3 1 6 4 7;c=8 7 5 9 9 2 5 6 10;flow=14;enddatamin=@sum(arcs(i,j):b(i,j)*f(i,j));@for(nodes(i)|i#ne#1 #and# i#ne#@size(nodes):@sum(arcs(i,j):f(i,j))-@sum(arcs(j,i):f(j,i))=0);@sum(arcs(i,j)|i#eq#1:f(i,j))=flow;@for(arcs(i,j):@bnd(0,f(i,j),c(i,j)));end计算结果如下:Objective value: 205.0000Variable Value Reduced CostF( S, 1) 8.000000 -1.000000F( S, 2) 6.000000 0.000000F( 1, 2) 1.000000 0.000000F( 1, 3) 7.000000 0.000000F( 2, 4) 9.000000 0.000000F( 3, 2) 2.000000 -3.000000F( 3, T) 5.000000 -8.000000F( 4, 3) 0.000000 11.00000附录 LINGO出错信息在LINGO程序求解时,系统首先会对程序进行编译.系统在编译或执行其他命令时,会因程序中的错误或运行错误,弹出一个出错报告窗口,显示其错误代码,并简要指出错误的原因.这些错误报告信息能够提示用户发现程序中的错误,以便能尽快修改.下面我们给出出错信息的一个简要说明,仅供参考.LINGO错误编号及原因对照表习题1.用LINGO 软件求解线性规划问题并作灵敏度分析(1) ⎪⎩⎪⎨⎧≥≤++≤++-++-=0,,9010412203..1355max 321221321321x x x x x x x x x t s x x x(2)⎪⎩⎪⎨⎧≥≤≤+--≤+---+-=0,,,1035.0125.009825.0..65.02075.0max 3213432143214321x x x x x x x x x x x x t s x x x x z2.用LINGO 软件求解0-1规划问题⎪⎪⎩⎪⎪⎨⎧=≥+-+≥+++-≥+++-+++=10,,,11424204..4352min 43214321432143214321或x x x x x x x x x x x x x x x x t s x x x x 3.用LINGO 软件求解整数规划问题⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧≥≤≤≤≤=+=-+=-+=-++++++=且整数0,,,,,,20,45,40,3025352515..2.02.02.05.54.51.50.5min 3214321432134323212113214321y y y x x x x x x x x y x y y x y y x y x t s y y y x x x x4.用LINGO 软件求解非线性规划问题⎪⎪⎩⎪⎪⎨⎧=≤≤--=+-+=++-+-+-+-+-=5,4,3,2,1,55222223..)()()()()1(min 4232332215544433322211i x x x x x x x t s x x x x x x x x x z i5.用LINGO 软件求解⎪⎩⎪⎨⎧-∈≤+++≤-≤+≤-+=}1,1{,,,2311..21max 432143214321TTx x x x x x x x x x x x t s z Qxx x c其中T )2,4,8,6(-=c ,Q 是三对角线矩阵,主对角线上元素全为-1,两条次对角线上元素全为2.。
lingo常用指令
逻辑运算符LINGO具有9种逻辑运算符:#not# 否定该操作数的逻辑值,#not#是一个一元运算符#eq# 若两个运算数相等,则为true;否则为flase#ne# 若两个运算符不相等,则为true;否则为flase#gt# 若左边的运算符严格大于右边的运算符,则为true;否则为flase#ge# 若左边的运算符大于或等于右边的运算符,则为true;否则为flase#lt# 若左边的运算符严格小于右边的运算符,则为true;否则为flase#le# 若左边的运算符小于或等于右边的运算符,则为true;否则为flase#and# 仅当两个参数都为true 时,结果为true;否则为flase#or# 仅当两个参数都为false 时,结果为false;否则为true数学函数@abs(x) 返回x 的绝对值@sin(x) 返回x 的正弦值,x 采用弧度制@cos(x) 返回x 的余弦值@tan(x) 返回x 的正切值@exp(x) 返回常数e的x 次方@log(x) 返回x 的自然对数@lgm(x) 返回x的gamma 函数的自然对数@sign(x) 如果x<0返回-1;否则,返回1@floor(x) 返回x 的整数部分。
当x>=0 时,返回不超过x 的最大整数;当x<0 时,返回不低于x 的最大整数。
@smax(x1,x2,…,xn) 返回x1,x2,…,xn中的最大值@smin(x1,x2,…,xn) 返回x1,x2,…,xn中的最小值概率函数1.@pbn(p,n,x)二项分布的累积分布函数。
当n和(或)x 不是整数时,用线性插值法进行计算。
2.@pcx(n,x)自由度为n的χ2分布的累积分布函数。
3.@peb(a,x)当到达负荷为a,服务系统有x个服务器且允许无穷排队时的Erlang繁忙概率。
4.@pel(a,x)当到达负荷为a,服务系统有x个服务器且不允许排队时的Erlang 繁忙概率。
lingo基础用法
lingo基础用法Lingo是一种计算机编程语言,它的基础用法包括以下几个方面:1. 变量声明和赋值:可以使用Lingo语言声明变量,并给变量赋值。
例如:```global myVariable -- 声明一个全局变量put 5 into myVariable -- 将值5赋给变量myVariable```2. 条件语句:可以使用条件语句来根据条件执行不同的代码块。
例如:```if myVariable = 5 thenput "It's five!" into messageanswer messageend if```3. 循环语句:可以使用循环语句来反复执行特定的代码块。
例如:```repeat with i = 1 to 10put i into messageanswer messageend repeat```4. 函数和命令:Lingo提供了许多内置的函数和命令,可以执行特定的操作。
例如:```put the date into currentDate -- 获取当前日期get the long name of sprite 1 -- 获取精灵1的长名称```5. 脚本和行为:可以使用Lingo编写脚本和行为,控制多媒体项目的行为。
例如:```on mouseUpgo to the next frameend```上述是Lingo语言的基础用法,只是其中的一小部分。
Lingo 还提供了丰富的功能和特性,包括面向对象编程、多媒体处理等。
要更深入地学习和使用Lingo,建议参考Lingo的官方文档或相关教程。
LINDO LINGO使用简介
1 LINDO菜单命令和语句1.1菜单命令我们可以从类似于其它Windows程序的便捷菜单访问LINDO的命令。
主菜单包括屏幕顶部的6个子菜单,它们列出了各种命令。
当单击其中一个子菜单——File、Edit、Solve、Reports、Window或Help时,将出现了一个包含各种命令的下拉菜单。
你可以像在大多数windows程序中那样选择命令——或者用鼠标单击命令,或者在适当的子菜单亮显时,按命令名中带下划线的字母。
许多命令还有快捷键(F2、Ctrl+Z等)。
为了增加方便性,还可以利用位于屏幕顶部工具栏中的图标访问一些最常用的命令。
下面简要介绍各种菜单命令,并列出了可以应用的快捷键和图标。
1.File(文件)菜单File菜单命令能够以各种方法操纵LINDO数据文件。
可以使用这个命令打开、关闭、保存和打印文件,并且可以执行LINDO独有的各种任务。
下面将描述File命令。
命令说明New F2 创建用于输入数据的新窗口。
Open F3 打开已有的文件。
利用对话框可以选择各种文件类型和位置。
View F4 打开已有的文件,仅进行浏览。
不对文件进行修改。
Save F5 保存窗口。
可以保存输入数据(模型)、Reports窗口或命令窗口。
可以下列格式保存数据:*.LTX,可以利用字处理软件进行编辑的文本格式;*.LPK,以“填充”格式保存编译模型,但是不进行特殊的格式化或解释;*.MPS,与机器无关的工业标准格式,用于在LINDO和其它LP软件之间传递LP问题。
Save As F6 利用指定的文件名保存活动窗口。
这特别适合于重命名已修改的文件,同时能够保持原始文件不受影响。
Close F7 关闭活动窗口。
如果窗口包含新的输入数据,将询问你是否保存修改。
Print F8 把活动窗口发送到打印机。
Printer Setup…F9 选择打印机和打印格式的各种选项。
Log Output…F10 把通常发送到Reports窗口的所有后续屏幕活动发送到文本文件中。
LINGO的命令行命令
以下将按类型列出在LINGO命令行窗口中使用的命令,每条命令后都附有简要的描述说明。
在平台中,从的窗口菜单中选用“Command Window”命令或直接按Ctrl+1可以打开LINGO的命令行窗口,便可以在命令提示符“:”后输入以下命令。
如果需要以下命令的详细描述说明,可以查阅LINGO的帮助。
1.LINGO信息Cat 显示所有命令类型Com 按类型显示所用LINGO命令Help 显示所需命令的简要帮助信息Mem 显示内存变量的信息2.输入(Input)model 以命令行方式输入一个模型take 执行一个文件的命令正本或从磁盘中读取某个模型文件3.显示(Display)look 显示当前模型的内容genl 产生LINGO兼容的模型gen 生成并显示整个模型hide 为模型设置密码保护pause 暂停屏幕输出直至再次使用此命令4.文件输出(File Ouput)div 将模型结果输出到文件svrt 将模型结果输出到屏幕save 将当前模型保存到文件smps 将当前模型保存为MPS文件5.求解模型(Solution)go 求解当前模型solu 显示当前模型的求解结果6.编辑模型(Problem Editing)del 从当前模型中删除指定的某一行或某两行之间(包括这两行)的所有行ext 在当前模型中添加几行alt 用新字符串替换掉某一行中、或某两行之间的所有行中的旧字符串7.退出系统(Quit)quit 退出LINGO系统8.系统参数(System Parameters)page 以“行”为单位设置每页长度ter 以简略方式输出结果ver 以详细方式输出结果wid 以“字符”为单位设置显示和输出宽度set 重新设置默认参数freeze 保存当前参数设置,以备下一次重新启动LINGO系统时还是这样的设置time 显示本次系统的运行时间这里详细说明SET指令。
凡是用户能够控制的LINGO系统参数,SET命令都能够对它进行设置。
LINGO的使用方法说明大全
LINGO的使用简介LINGO软件是美国的LINGO系统公司开发的一套专门用于求解最优化问题的软件包.LINGO除了能够用于求解线性规划和二次规划外,还可以用于非线性规划求解、以及一些线性和非线性方程(组)的求解等.LINGO软件的最大特色在于它允许优化模型中的决策变量为整数,即可以求解整数规划,而且执行速度快.LINGO是用来求解线性和非线性优化问题的简易工具.LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果.在这里仅简单介绍LINGO的使用方法.LINGO(Linear INteractive and General Optimizer )的基本含义是交互式的线性和通过优化求解器.它是美国芝加哥大学的 Linus Schrage 教授于1980年开发了一套用于求解最优化问题的工具包,后来经过完善成何扩充,并成立了LINDO系统公司.这套软件主要产品有:LINDO,LINGO,LINDO API和What’sBest.它们在求解最优化问题上,与同类软件相比有着绝对的优势.软件有演示版和正式版.正式版包括:求解包(solver suite)、高级版(super)、超级版(hyper)、工业版(industrial)、扩展版(extended).不同版本的LINGO对求解问题的规模有限制,如附表3-1所示.附表3-1 不同版本LINGO对求解规模的限制版本类型总变量数整数变量数非线性变量数约束数演示版 300 30 30 150求解包 500 50 50 250高级版 2000 200 200 1000超级版 8000 800 800 4000工业版 32000 3200 32000 16000扩展版无限无限无限无限3.1 LINGO程序框架LINGO可以求解线性规划、二次规划、非线性规划、整数规划、图论及网络最优化问题和最大最小求解问题,以及排队论模型中最优化等问题.一个LINGO程序一般会包括以下几个部分:(1) 集合段:集部分是LINGO模型的一个可选部分.在LINGO模型中使用集之前,必须在集部分事先定义.集部分以关键字“sets:”开始,以“endsets”结束.一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分.一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须先定义.(2) 数据段:在处理模型的数据时,需要为集部分定义的某些元素在LINGO求解模型之前为其指定值.数据部分以关键字“data:”开始,以关键字“enddata”结束.(3) 目标和约束段:这部分用来定义目标函数和约束条件等.该部分没有开始和结束的标记.主要是要用到LINGO的内部函数,尤其是与集合有关的求和与循环函数等.(4)初始段:这个部分要以关键字“INIT:”开始,以关键字“ENDINIT”结束,它的作用是对集合的属性定义一个初值.在一般的迭代算法中,如果可以给一个接近最优解的初始值,会大大减少程序运行的时间.(5) 数据预处理段:这一部分是以关键字“CALC:”开始,以关键字“ENDCALC”结束.它的作用是把原始数据处理成程序模型需要的数据,它的处理是在数据段输入完以后、开始正式求解模型之前进行的,程序语句是按顺序执行的.3.2 LINGO中集合的概念在对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等.LINGO允许把这些相联系的对象聚合成集(sets).一旦把对象聚合成集,就可以利用集来最大限度地发挥LINGO建模语言的优势.现在将深入介绍如何创建集,并用数据初始化集的属性.3.2.1集的构成集是LINGO建模语言的基础,是程序设计最强有力的基本构件.借助于集能够用一个单一的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型.集是一群相联系的对象,这些对象也称为集的元素.一个集可能是一系列产品、卡车或雇员.每个集的元素可能有一个或多个与之有关联的特征,把这些特征称为属性.属性值可以预先给定,也可以是未知的,有待于LINGO求解的.LINGO有两种类型的集:原始集(primitive set)和派生集(derived set).一个原始集是由一些最基本的对象组成的.一个派生集是用一个或多个其它集来定义的,也就是说,它的元素来自于其它已存在的集.3.2.2模型的集部分集部分在程序中又称为集合段,它是LINGO模型的一个可选部分.在LINGO模型中使用集之前,必须在集部分事先定义.集部分以关键字“sets:”开始,以“endsets”结束.一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分.一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须先定义.(1)原始集的定义为了定义一个原始集,必须详细说明集的名字,而集的元素和相应的属性是可选的.定义一个原始集,用下面的语法:setname[/member_list/][:attribute_list];注意:用“[]”表示该部分内容是可选的(下同).Setname是用来标记集的名字,最好具有较强的可读性.集名字必须严格符合标准命名规则:以拉丁字母或下划线为首字符,其后由拉丁字母、下划线、阿拉伯数字组成的总长度不超过32个字符的字符串,且不区分大小写.注意:该命名规则同样适用于集元素名和属性名等的命名.Member_list是集元素的列表.如果集元素放在集定义中,那么对它们可采取显式和隐式罗列两种方式.如果集元素不放在集定义中,那么可以在随后的数据部分定义.①当显式罗列元素时,必须为每个元素输入一个不同的名字,中间用空格或逗号隔开,允许混合使用.例3.1 定义一个名为friends的原始集,它具有元素John,Jill,Rose和Mike,其属性有sex和age:sets:friends/John Jill, Rose Mike/: sex, age;endsets②当隐式罗列元素时,不必罗列出每个集元素.可采用如下语法:setname/member1..member N/[: attribute_list];这里的member1是集的第一个元素名,member N是集的最后一个元素名.LINGO将自动产生中间的所有元素名.LINGO也接受一些特定的首元素名和末元素名,用于创建一些特殊的集.③集元素不放在集定义中,而在随后的数据部分来定义.例3.2!集部分;sets:friends:sex,age;endsets!数据部分;data:friends,sex,age=John,1,16 Jill,0,14 Rose,0,17 Mike,1,13;enddata注意:开头用感叹号(!),末尾用分号(;)表示注释,可跨多行.在集部分只定义了一个集friends,并未指定元素.在数据部分罗列了集元素John,Jill,Rose和Mike,并对属性sex和age分别给出了值.集元素无论用何种字符标记,它的索引都是从1开始连续计数.在attribute_ list可以指定一个或多个集元素的属性,属性之间必须用逗号隔开.LINGO内置的建模语言是一种描述性语言,用它可以描述现实世界中的一些问题,然后再借助于LINGO 求解器求解.因此,集属性的值一旦在模型中被确定,就不可能再更改.只有在初始部分中给出的集属性值在以后的求解中可更改.这与前面并不矛盾,初始部分是LINGO求解器的需要,并不是描述问题所必须的.(2) 定义派生集为了定义一个派生集,必须详细说明集的名字和父集的名字,而集元素和属性是可选的.可用下面的语法定义一个派生集:setname(parent_set_list)[/member_list/][:attribute_list];setname是集的名字.parent_set_list是已定义的集的列表,多个时要用逗号隔开.如果没有指定成员列表,那么LINGO会自动创建父集元素的所有组合作为派生集的元素.派生集的父集既可以是原始集,也可以是其它的派生集.例3.3sets:product/A,B/;machine/M,N/;week/1..2/;allowed(product,machine,week):x;endsetsLINGO生成了三个父集的所有组合共八组作为allowed集的元素,列表如下:编号元素1 (A,M,1)2 (A,M,2)3 (A,N,1)4 (A,N,2)5 (B,M,1)6 (B,M,2)7 (B,N,1)8 (B,N,2)元素列表被忽略时,派生集成员由父集成员所有的组合构成,这样的派生集成为稠密集.如果限制派生集的成员,使它成为父集成员所有组合构成的集合的一个子集,这样的派生集成为稀疏集.同原始集一样,派生集元素的说明也可以放在数据部分.一个派生集的元素列表有两种方式生成:①显式罗列;②设置元素选择的过滤器.当采用方式①时,必须显式罗列出所有要包含在派生集中的元素,并且罗列的每个元素要属于稠密集.使用前面的例子,显式罗列派生集的元素,如:allowed(product,machine,week)/A M 1,A N 2,B N 1/;如果需要生成一个大的、稀疏的集,那么显式罗列就十分麻烦.但是许多稀疏集的元素都满足一些条件,可以把这些逻辑条件看作过滤器,在LINGO生成派生集的元素时把使逻辑条件为假的元素从稠密集中过滤掉.例3.4sets:!学生集:性别属性sex,1表示男性,0表示女性;年龄属性age;students/John,Jill,Rose,Mike/:sex,age;!男学生和女学生的联系集:友好程度属性friend![0,1]之间的数;linkmf(students,students)|sex(&1)#eq#1#and#sex(&2)#eq#0: friend;!男学生和女学生的友好程度大于0.5的集;linkmf2(linkmf) | friend(&1,&2) #ge# 0.5 : x;data:sex,age =1 16,0 14,0 17,0 13;friend =0.3,0.5,0.6;enddata用竖线(|)来标记一个元素过滤器的开始.#eq#是逻辑运算符,用来判断是否“相等”. &1可看作派生集的第1个原始父集的索引,它取遍该原始父集的所有元素;&2可看作派生集的第2 个原始父集的索引,它取遍该原始父集的所有元素;&3,&4,…,依此类推.注意如果派生集B的父集是另外的派生集A,那么上面所说的原始父集是集A向前回溯到最终的原始集,其顺序保持不变,并且派生集A的过滤器对派生集B仍然有效.因此,派生集的索引个数是最终原始父集的个数,索引的取值是从原始父集到当前派生集所作限制的总和.3.3 LINGO数据部分和初始部分在处理模型的数据时,需要为集指定一些元素并且在LINGO求解模型之前为集的某些属性指定数值.为此,LINGO为用户提供了两个可选部分:输入集元素数值的数据部分(Data Section)和为决策变量设置初始值的初始部分(Init Section).3.3.1数据部分(1) 数据部分入门数据部分以关键字“data:”开始,“enddata”结束.在这里,可以指定集元素和集的属性.其语法如下:object_list = value_list;对象列(object_list)包含要指定值的属性名、要设置集元素的集名,用逗号或空格隔开.一个对象列中只能有一个集名,而属性名可以有任意多个.如果对象列中有多个属性名,那么它们的类型必须一致.数值列(value_list)包含要分配给对象列中对象的值,用逗号或空格隔开.注意属性值的个数必须等于集元素的个数.例3.5sets:SET0/A,B,C/: X,Y;endsetsdata:X=1,2,3;Y=4,5,6;enddata在集SET0中定义了两个属性X和Y.X的三个值是1,2,3,Y的三个值是4,5,6.也可采用如下例子中的复合数据说明(data statement)实现同样的功能.sets:SET0/A,B,C/: X,Y;endsetsdata:X,Y=1 4 2,5 3 6;enddata如果对象列中有n个对象,LINGO在为对象指定值时,首先在n个对象的第1个索引处依次分配数值列中的前n个对象,然后在n个对象的第2个索引处依次分配数值列中紧接着的n个对象,…,依此类推.(2) 参数输入在数据部分也可以指定一些标量变量(scalar variables).当一个标量变量在数据部分确定时,称之为参数.例如,假设模型中用利率9%作为一个参数,就可以输入一个利率作为参数.例3.7data:interest_rate = .09;enddata实际中也可以同时指定多个参数.如:data:interest_rate,inflation_rate = .09, .025;enddata(3) 实时数据处理在某些情况下,模型中的某些数据并不是定值.譬如模型中有一个参数在2%至6%范围内,对不同的值求解模型,观察模型的结果对参数依赖的程度,那么把这种情况称为实时数据处理.处理方法是在该语句的数值后面输入一个问号(?).例3.8data:interest_rate,inflation_rate = .09 ?;enddata在每一次求解模型时,LINGO都会提示为参数inflation_rate输入一个值.在WINDOWS操作系统下,将会看到一个如下面的对话框:直接输入一个值再点击OK按钮,LINGO就会把输入的值指定赋给inflation_rate,然后继续求解模型.除了参数之外,也可以实时输入集的属性值,但不允许实时输入集元素名.(4) 指定属性为一个值可以在数据定义的右边输入一个值来把所有的元素的该属性指定为一个值.如下面的例子.sets:days /MO,TU,WE,TH,FR,SA,SU/:needs;endsetsdata:needs = 40;enddataLINGO将用40指定days集的所有元素的needs属性.对于多个属性的情形如下:sets:days /MO,TU,WE,TH,FR,SA,SU/:needs,cost;endsetsdata:needs cost = 40 90;enddata(5) 数据部分的未知数值表示法有时候只需为一个集的部分元素的某个属性指定数值,而让其余元素的该属性是未知的,以便让LINGO 去求出它们的最优值.在数据定义中输入两个相连的逗号表示该位置对应元素的属性值未知,两个逗号间可以有空格.例3.10sets:years/1..6/: capacity;endsetsdata:capacity = ,24,40,,,;enddata属性capacity的第2个和第3个值分别为24和40,其余的未知.3.3.2初始部分初始部分是LINGO提供的另一个可选内容.在初始部分中,与数据部分中的数据定义相同,可以输入初始定义(initialization statement).在对实际问题的建模时,初始部分并不起到描述模型的作用,初始部分输入的值仅被LINGO求解器当作初始值来使用,并且仅仅对非线性模型有用.这与数据部分指定变量的值不同,LINGO求解器可以自由改变初始部分初始化变量的数值.一个初始部分以关键字“init:”开始,以关键字“endinit”结束.初始部分的初始定义规则和数据部分的数据定义规则相同.也就是说,可以在定义的左边同时初始化多个集属性,即可以把集属性初始化为一个数值,也可以用问号定义为实时数据,还可以用逗号指定为未知数值.例3.11X,Y = 1,0;endinitY=@log(X);X^2+Y^2<=1;3.4 LINGO函数3.4.1运算符及其优先级LINGO 中的运算符可以分为三类:算数运算符、逻辑运算符和关系运算符.(1) 算数运算符算数运算符分为5种: (加法), (减法), (乘法), (除法), (求幂).(2) 逻辑运算符逻辑运算符分为两类:#AND#(与),#OR#(或),#NOT#(非):这3个运算符是参与逻辑值之间的运算,其结果还是逻辑值.运算符#EQ#(等于),#NE#(不等于),#GT#(大于),#GE#(大于等于),#LT#(小于),#LE#(小于等于)是用于“数与数之间”的比较,其结果是实逻辑值.(3) 关系运算符LINGO中有3种关系运算符:<(小于等于),>(大于等于),=(等于).注意LINGO中优化模型的约束一般没有严格大于、严格小于,要和逻辑运算符区分开.运算符的优先等级如附表3-2所示.附表3-2 运算符的优先级优先级运算符高级#NOT# ,-(负号)^* ,/+,-#EQ#,#NE#,#GT#,#GE#,#LT#,#LE#, #AND#,#OR#最低< ,+ ,>3.4.2 LINGO数学函数(1) 基本数学函数LINGO中有相当丰富的数学函数,这些函数的用法简单.下面列表对各个函数的用法做简单的介绍,具体情况如附表3-3所示.(2) 集合循环函数集合循环是指对集合上的元素(下标)进行循环操作的函数,它的一般用法如下:@function(setname[(set_index_list)[|condition]]:expression_list);其中function是集合函数名,是FOR,MAX,MIN,PROD,SUM五种之一.setname是集合名;set_index_list 是集合索引列表(可以省略);condition是实用逻辑表达式描述的过滤条件(通常含有索引,可以省略);expression_list是一个表达式(对@FOR可以是一组表达式).下面对具体的集合函数作如下解释:@FOR(集合元素的循环函数):对集合setname的每个元素独立生成表达式,表达式由expression_list 描述.@MAX(集合属性的最大值):返回集合setname上的表达式的最大值.@MIN(集合属性的最小值) :返回集合setname上的表达式的最小值.@PROD(集合元素的乘积函数):返回集合setname上的表达式的积.@SUM(集合元素的求和函数) :返回集合setname上的表达式的和.表附3-3 基本数学函数函数调用格式含义@ABS(X) 返回X的绝对值@COS(X) 返回X的余弦值(X单位是弧度)@SIN(X) 返回X的正弦值(X单位是弧度)@FLOOR(X) 返回X的整数部分@LGM(X) 返回X的伽马(Gamma)函数的自然对数值@LOG(X) 返回X的自然对数值@MOD(X,Y) 返回X对Y取模的结果@POW(X,Y) 返回X Y的值@SIGN(X) 返回X的符号值@EXP(X) 返回e X的值@SMAX(LIST) 返回一列数的最大值@SMIN(LIST) 返回一列数的最小值@SQR(X) 返回X的平方@SQRT(X) 返回X的正的平方根值@TAN(X) 返回X的正切值(3) 集合操作函数集合操作函数是对集合进行操作的函数,主要有4种,下面分别介绍它们的一般用法.1)@INDEX([set_name,]primitive_set_element)这个函数给出元素primitive_set_element在集合set_name中的索引值(即按定义集合时元素出现顺序的位置编号).如果省略编号set_name,LINGO按模型中定义的集合顺序找到第一个含有元素primitive_set_element的集合,并返回索引值.通过下面例子解释函数的使用方法.例如,假设定义一个女孩的姓名集合和一个男孩的姓名集合:SETS:GIRLS/DEBBLE,SUE,ALICE/;BOYS/BOB,JOE,SUE,FRED/;ENDSETS注意到女孩集和男孩集中都有一个为SUE的元素,如果要调用此函数@INDEX(SUE),则得到返回索引值是2.因为集合GIRLS在集合BOYS之前,则索引函数只对集合GIRLS检索.如果想查找男孩集中的SUE,则应该使用@INDEX(BOYS,SUE),则此时得到的索引值是3.2)@IN(set_name,primitive_index_1[,primitive_index_2 …])这个函数用于判断一个集合中是否含有某个索引值.它的返回值是1(逻辑值“真”),或是0(逻辑值“假”).例3.12全集为I,B是I的一个子集,C是B的补集.sets:I/x1..x4/;B(I)/x2/;C(I)|#not#@in(B,&1):;endsets3)@wrap(index,limit)该函数返回j=index-k*limit,其中k是一个整数,取适当值保证j落在区间[1,limit]内.该函数相当于index模limit再加1.该函数在循环、多阶段计划编制中特别有用.4)@size(set_name)该函数返回集set_name的元素个数.在LINGO模型中,如果没有明确给出集的大小,则使用该函数能够使模型中的数据变化和集的大小改变更加方便.(4) 变量定界函数变量界定函数能够实现对变量取值范围的附加限制,共4种:1)@bin(x)表示限制就是x为0或1;2)@bnd(L,x,U)表示限制变量x满足;3)@free(x)表示取消对变量x的默认下界为0的限制,即x可以取任意实数;4)@gin(x)表示限制变量x为整数.在默认情况下,LINGO规定变量是非负的,即下界值为0,上界为+∞.@free取消了默认的下界为0的限制,使变量也可以取负值.@bnd用于设定一个变量的上下界,它也可以取消默认下界为0的约束.(5) 概率论中相关函数1)@pbn(p,n,x)二项分布的分布函数,当n和(或)x不是整数时,用线性插值法进行计算.2)@pcx(n,x)自由度为n的χ2分布的分布函数在x点的取值.3)@peb(load,x)当到达负荷(平均服务强度)为load,服务系统有x个服务台,且系统容量无限时的Erlang繁忙概率,多用于解决排队问题.4)@pel(load,x)当到达负荷(平均服务强度)为load,服务系统有x个服务台,系统容量为有限时的Erlang繁忙概率,多用于解决排队问题.5)@pfd(n,d,x)自由度为n和d的F分布的分布函数在x点的取值.6)@pfs(load,x,c)当负荷上限为load,顾客数为c,平行服务台数量为x时,顾客源有限的Poisson服务系统的等待或有返回顾客数的期望值.load是顾客数乘以平均服务时间,再除以平均返回时间.当c和(或)x不是整数时,采用线性插值进行计算.7)@phg(pop,g,n,x)超几何(Hypergeometric)分布的分布函数.pop表示产品总数,g是正品数.从所有产品中任意取出n(n≤pop)件.pop,g,n和x都可以是非整数,这时采用线性插值进行计算.8)@ppl(a,x)Poisson分布的线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从均值为a的Poisson 分布.9)@pps(a,x)均值为a的Poisson分布的分布函数在x点的取值.当x不是整数时,采用线性插值进行计算.10)@psl(x)单位正态线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从标准正态分布.11)@psn(x)标准正态分布的分布函数在x点的取值.12)@ptd(n,x)自由度为n的t分布的分布函数在x点的取值.13)@qrand(seed)产生(0,1)区间的拟随机数.@qrand只允许在模型的数据部分使用,它将用拟随机数填满集属性.通常定义一个m×n的二维表,m表示运行实验的次数,n表示每次实验所需的随机数的个数.在行内,随机数是独立分布的;在行间,随机数是非均匀的.这些随机数是用“分层取样”的方法产生的.目前LINGO提供了两个金融函数.1)@fpa(I,n)返回如下情形的净现值:单位时段利率为I,连续n个时段支付,每个时段支付单位费用.若每个时段支付x单位的费用,则净现值可用x乘以@fpa(I,n)得到.@fpa的计算公式为.净现值就是在一定时期内为了获得一定收益,在该时期初所支付的实际费用.2)@fpl(I,n)返回如下情形的净现值:单位时段利率为I,第n个时段支付单位费用.@fpl(I,n)的计算公式为.这两个函数间的关系:.(7)输入和输出函数输入和输出函数可以把模型与外部数据(如文本文件、数据库和电子表格等)连接起来.1)@file函数该函数用于从外部数据文件中输入数据,它可以放在模型中任何地方.该函数的语法格式为@file(’filename’).这里filename是文件名,可以采用相对路径和绝对路径两种表示方式.记录结束标记(~)之间的数据文件部分称为记录.如果数据文件中没有记录结束标记,那么整个文件被看作单个记录.除了记录结束标记外,从模型外部调用的文本和数据同在模型里是一样的.下面介绍一下在数据文件中的记录结束标记连同模型中@file函数调用是如何工作的.当在模型中第一次调用@file函数时,LINGO打开数据文件,然后读取第一个记录;第二次调用@file 函数时,LINGO读取第二个记录等等.文件的最后一条记录可以没有记录结束标记,当遇到文件结束标记时,LINGO会读取最后一条记录,然后关闭文件.如果最后一条记录也有记录结束标记,那么直到LINGO 求解完成模型后关闭该文件.注意,如果有多个文件同时保持打开状态,可能就会导致一些问题,LINGO允许同时打开文件的上限数是16.在LINGO中不允许嵌套调用@file函数.2)@text函数该函数被用在数据部分,用来把求解结果输出至文本文件中.它可以输出集元素和集属性值.其语法为@text([’filename’])这里filename是文件名,可以采用相对路径和绝对路径两种表示方式.如果忽略filename,那么数据就被输出到标准输出设备(大多数情形都是屏幕).@text函数仅能出现在模型数据部分的一条语句的左边,右边是集名(用来输出该集的所有元素名)或集属性名(用来输出该集属性的值).用接口函数产生输出的数据定义称为输出操作.输出操作仅当求解器求解完模型后才执行,执行次序取决于其在模型中出现的先后.@OLE是从EXCEL中引入或输出数据的接口函数,它是基于传输的OLE技术.OLE传输直接在内存中传输数据,并不借助于中间文件.当使用@OLE时,LINGO先装载EXCEL,再通知EXCEL装载指定的电子数据表,最后从电子数据表中获得Ranges.为了使用@OLE函数,必须有EXCEL5及其以上版本.@OLE函数可在数据部分和初始部分引入数据.@OLE可以同时读集元素和集属性,集元素最好使用文本格式,集属性最好使用数值格式.原始集每个集元素需要一个单元(cell),而对于n元的派生集每个集元素需要n个单元,这里第一行的n个单元对应派生集的第一个集元素,第二行的n个单元对应派生集的第二个集元素,依此类推.4)@ranged(variable_or_row_name)为了保持最优基不变,变量的费用系数或约束行的右端项允许减少的量.5)@rangeu(variable_or_row_name)为了保持最优基不变,变量的费用系数或约束行的右端项允许增加的量.6)@status()返回LINGO求解模型后的结束状态:0 --- Global Optimum(全局最优);1 --- Infeasible(不可行);2 --- Unbounded(无界);3 --- Undetermined(不确定);4 --- Feasible(可行);5 --- Infeasible or Unbounded(通常需要关闭“预处理”选项后重新求解模型,以确定模型究竟是不可行还是无界)6 --- Local Optimum(局部最优);7 --- Locally Infeasible(局部不可行,尽管可行解可能存在,但是LINGO并没有找到一个);8 --- Cutoff(目标函数的截断值被达到);9 --- Numeric Error(求解器因在某约束中遇到无定义的算术运算而停止).通常,如果返回值不是0,4或6时,那么解将不可信,几乎不能用.该函数仅被用在模型的数据部分来输出数据.7)@dual(variable_or_row_name)返回变量的判别数(检验数)或约束行的对偶(影子)价格(dual prices).(8) 辅助函数1)@if(logical_condition,true_result,false_result)@if函数将评价一个逻辑表达式logical_condition是否为真,如果为真,返回true_ result,否则返回false_result.2)@warn(’text’,logical_condition)如果逻辑条件logical_condition为真,则产生一个内容为’text’的信息框.。
lingo入门教程
lingo入门教程Lingo是一种广泛应用于计算机编程和计算机科学领域的编程语言。
它是用于Adobe Director(一种多媒体应用程序)中的脚本语言,用于控制多媒体元素和动画。
Lingo的语法比较简单易懂,有助于创建交互式和多媒体项目。
下面是一些Lingo的基本概念和用法。
1. 变量(Variables): 在Lingo中,变量用于存储数据值。
变量可以是数字、文本或其他数据类型。
要创建变量,可以使用关键字`global`或`local`,后跟变量名和初始值(可选)。
例如:```global myVariable = 10local myText = "Hello World"```2. 条件语句(Conditional statements): 条件语句用于根据条件执行特定的代码块。
常用的条件语句有`if-then`和`if-then-else`。
例如:```if myVariable > 5 thenalert "Value is greater than 5"elsealert "Value is less than or equal to 5"end if```3. 循环(Loops): 循环用于重复执行一段代码块,直到满足指定条件为止。
Lingo提供了`repeat`和`repeat while`循环语句。
例如:```repeat with i = 1 to 5put iend repeat```4. 函数(Functions): 函数是一组预定义的代码,用于执行特定的任务。
Lingo提供了许多内置函数,如`alert`、`put`等。
您还可以创建自己的函数。
例如:```on multiplyNumbers(a, b)return a * bend multiplyNumbersput multiplyNumbers(2, 4) -- 输出8```这些只是Lingo的一些基本概念和用法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
常见Lingo指令介绍一、控制Sprite的常见指令1.指令名称:sprite member指令语法:the member of sprite指令说明:sprite所代表的cast member。
例:精灵替换set the member of sprite 1 to "yuan"可改为:Sprite(1).member=”yuan”点句表示法:ObjectName.[Property|function|Chunk that you want to specity]2.指令名称:sprite memberNum指令语法:the memberNum of sprite指令说明:sprite所代表的cast member所在的位置。
例:循环播放on exitFrame meif sprite (1). memberNum =10 thensprite (1). memberNum = 1elsesprite (1) .memberNum=sprite(1).memberNum+1end ifgo to the frameend3.旋转、倾斜、翻转精灵指令说明:这些变换可以应用于位图、文本、矢量图形、GIF及Flash,但不能用于域,以及工具面板上的椭圆和矩形。
(1)旋转:正值代表顺时针,负值代表逆时针sprite(1).rotation=30set the rotation of sprite 1 to 30例:指针调节sprite(1).rotation=sprite(1).rotation+5(2)倾斜:正值向右倾斜,负值向左倾斜,正常状态为0sprite(1).skew=10set the skew of sprite 1 to 10例:图形变形sprite(1).skew=sprite(1).skew+10(3)翻转:左右(水平)翻转flipH,上下(垂直)翻转flipV,设置值为TRUE或FALSE (1或0)sprite(1).flipH=TUREsprite(1).flipV=1例:翻转与恢复指令说明:相当于sprite在stage上的透明度,值可从0到100,数值越小透明度越高。
Sprite(1).blend=50Set the blend of sprite 1 to 50例:图像渐淡sprite(1).blend=505.指令名称:loc、locH、locV指令说明:the loc of sprite:sprite当前的位置,相当于point(the loch, the locV)the locH of sprite:水平位置the locV of sprite:垂直位置sprite(1).loc=point(320,240)------pointsprite(1).locH=320――数值sprite(1).locV=240――数值例:设置精灵位置sprite(1).loc=point(320,240)6.locZ指令说明:sprite目前在Z轴上的高度。
Channels之间存在高低与前后的关系,channel小的sprite位于下层,channel大的sprite位于上层。
例:点击相应图片移到最上层。
on startMovieglobal highestCardhighestCard=5endon mouseUpglobal highestCardhighestCard=highestCard+1sprite(the clickOn).locZ=highestCardend7.Top、bottom、Left、right指令说明:环绕sprite长方形的上下左右坐标。
on mouseUp meput sprite(1).topput sprite(1).bottomput sprite(1).leftput sprite(1).rightend用massage窗口查看。
例:文字上下或左右反复运动。
Put Sprite(1).rect例:匹配题intersects的应用指令说明:在stage上留下残影sprite(1).trails=true9.updatestage更新画面,常用于显示连续的动作例:拖尾移动on mouseUp mesprite(1).trails=truerepeat with x=1 to 100sprite(1).locH=sprite(1).locH+2updatestageend repeatend10.foreColor、backColor控制演员前景色、背景色的属性。
注意:这个属性主要用于用“tools palette”工具画出的Shape(向量)图形例:鼠标点击循环改变精灵的前景(背景)色on mouseUp mesprite(1).foreColor=sprite(1).foreColor-1end11.constraint指令说明:将某一可移动的sprite的中心点的活动范围限制在另一个sprite的四周边框内。
on startMoviesprite(1).constraint=2-- 2代表sprite(2)12.visible指令说明:sprite在stage上可见或隐藏。
一个隐藏的sprite仍具有位置、尺寸等各种属性,只是视觉上看不见而已。
Sprite(1).visible=false13.puppetSprite判断某一sprite是否处于puppet状态,是时,其属性与行为将由Lingo控制,否则依据score window中的设置。
例:将sprite 1设置为puppet状态。
On prepateMoviepuppetSprite 1, trueend14.quad控制sprite的四个顶点,用数组的方式来存放四个点的坐标值,依序分别为左上、右上、右下、左下,改变四个点的坐标,可以改变sprite的图框形状on mouseUp meput sprite(1).quadput sprite(1).quad[1]put sprite(1).quad[2]put sprite(1).quad[3]put sprite(1).quad[4]endsprite(1).quad=[point(9.0000,10.0000), point(309.0000, 10.0000), point(309.0000, 210.0000), point(9.0000, 210.0000)]sprite(1).quad[1]= point(9.0000,10.0000)数组在Lingo里就叫做列表,列表可以存储一系列连续的数据,如果数据具有相似性、规律性,需要放到一起就可以使用列表来表示。
二、鼠标(Mouse)控制的常见指令1.指令名称:clickOn指令语法:the clickOn指令说明:判断鼠标最近一次点选过的sprite。
返回最近一次单击精灵通道的通道号,如果在舞台上单击则返回值为0。
注意:只有附带程序(写在cast或sprite里面均可)的sprite才会被判断,即使这个程序毫无作用也无妨,例如:on mouseDown--end例:(1)beep次数控制on mouseUprepeat with x=1 to the clickOnbeepend repeatend(2)设置不带程序sprite(3)message窗口观察clickonon mouseDownput the clickonend2.指令名称:mouseH、mouseV指令语法:the mouseH、the mouseV指令说明:当前鼠标点(cursor)的水平位置(the mouseH)与垂直位置(the mouseV)。
例:判断鼠标接近spriteon exitFrame medH=the mouseH-sprite(1).locHdV=the mouseV-sprite(1).locVif dH*dH+dV*dV<7*7 thenbeepend ifend——鼠标判断在附近变为手的形状。
3.mouseLocpoint(the mouseH, the mouseV)例:鼠标设置sprite的位置综合练习:拖动四角变形图片。
on mousedowntemp=sprite(1).quadrepeat while the mousedownsprite(the clickon).loc=the mouseloctemp[the clickon-1]=the mouselocsprite(1).quad=tempupdatestageend repeatend4.rollOver指令语法:the rollover指令说明:rollOver(whichSprite)的作用是判别光标目前是否位于the sprite 的长方形区域内,是则rollOver(whichSprite)为1,否则为0。
The rollover所代表的是光标下的sprite channel。
这个指令通常用在frame script里面。
例:鼠标略过,发出不同的音乐。
on exitFrame mecase (the rollover) of1: puppetSound "piano"2: puppetsound"干杯吧朋友"3: puppetSound"我是一只小小鸟"end caseend5.mouseEnter、mouseLeave语法指令:on mouseEnter、on mouseLeave指令说明:mouseEnter:判断鼠标是否刚刚进入某个sprite区域;mouseLeave:判断鼠标是否离开这个区域。
如果这个sprite是bitmap图形,且其ink effect是matte,则他的区域为图形本身,否则为环绕其的长方形。
他们与rollover()的区别:(1)mouseEnter与mouseLeave通常在cast script or sprite script,而rollOver ()却用在frame script;(2)mouseEnter与mouseLeave只被执行一次,而rollOver()常常会连续被执行。
例一:将上例完善,鼠标放到相应文字上改变颜色和鼠标形状on mouseEntermember(1).forecolor=56cursor(280)end mouseEnteron mouseLeavemember(1).forecolor=255cursor(-1)end mouseLeave例二:鼠标超时警告on mouseEnterstarttimerendon mouseLeaveif the timer>2*60 thenalert "Too Slow!"end ifendtick6.mouseWithin指令语法:on mouseWithin指令说明:判断鼠标点是否位于某个sprite区域之内。