matlab函数输出两个量,选择一个输出(matlab输出两个值)

matlab函数输出两个量,选择一个输出(matlab输出两个值)作为一种重要的数学软件 LINGO 在计算数学在线性规划 非线性优化 整数规划 二次规划等优化问题有许多的应 同时 LINGO 也是解决优化问题的最佳选择 作为优化问题的专业计算软件包 LINGO 软件在大型的线性规划 非线性规划 整数规划等优化问题的求解方面具有明显优势 LINGO 内置了一种建立最优化模型的语言 可以简便地表达大规模问题 利用 LINGO 高效的求解器可快速求解并分析结果 能使人们从繁重的编程工作中解放出来 1 1 简介 LINGO 全称为 Linear Interactive and



作为一种重要的数学软件,LINGO在计算数学在线性规划、非线性优化、整数规划、二次规划等优化问题有许多的应,同时LINGO也是解决优化问题的最佳选择,作为优化问题的专业计算软件包,LINGO软件在大型的线性规划、非线性规划、整数规划等优化问题的求解方面具有明显优势,LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果,能使人们从繁重的编程工作中解放出来.

1.1简介

LINGO,全称为Linear Interactive and General Oplimizer(线性交互式通用优化器),是美国芝加哥(Chicago)大学学者Linus Scharge在1980年研制开发的优化计算软件,后来他成立了LINDO系统公司(LINDOSystem Inc.),其网址为该公司主要开发优化软件包,包括LINDO、LINGO、What's Best等,其中LINDO(全称为Linear Interactive and Discrete Optimizer)在6.1版后即不再更新,并全部纳入LINGO.

LINGO版本众多:Demo(演示版,变量数不超过300)、Solver Suit(正式版,变量数不超过500)、Super(高级版,变量数不超过2000)、Hyper(超级版,变量数不超过8000)、Industrail(工业版,变量数不超过32000)、Extended(扩展版,变量数无限制)等,目前最新版本为17.0.全球500强企业中有一半以上使用LINGO.

LINGO适用于线性规划、非线性优化、整数规划、二次规划等优化问题的求解.

LINGO的主要功能与特色:

(1)既能求解线性规划问题,也具有较强的求解非线性规划问题的能力;

(2)程序输入直观简洁;

(3)运行速度快,计算能力强;

(4)内置建模语言,提供数十个内部函数,便于大规模优化建模;

(5)将“集合”的概念引入编程语言,易于建立实际问题的模型;

(6)能方便地与外部文件之间进行数据交换.

LINGO的基本语法:

(1)以model开始,以end结束(可省略);

(2)约束条件符号“s.L.”不出现;

(3)变量名称不区分大小写,以字母开头,可含数字和下划线;

(4)所有变量都假定是非负的,不必再另外输入变量约束条件;

(5)变量可放在约束条件右端,数字也可以放在约束条件左边;

(6)每一语句必须以分号“;”结尾;

(7)注释语句以感叹号“!”开始,以分号“;”结束;

(8)“>”代替“>=”,“<”代替“<=”;

(9)目标函数直接记作“max=”、“min=”;

(10)每行可有多个语句,语句可以断行.

LINGO中的集

对实际问题建模的时候,经常会遇到一群或多群相联系的对象,比如生产的各种产品、

消费者群体、交通工具和运送的货物等.LINGO允许把这些相联系的对象聚合成集(sets).一旦把对象聚合成集,就可以利用集来最大限度地发挥LINGO建模语言的优势.

集是一群相联系的对象,这些对象也称为集的成员.一个集可能是一系列产品、卡车或雇员.每个集成员可能有一个或多个与之有关联的特征,我们把这些特征称为属性.属性值可以预先给定,也可以是未知的,有待于LINGO求解.例如,产品集中的每个产品可以有一个价格属性;卡车集中的每辆卡车可以有一个牵引力属性;雇员集中的每位雇员可以有一个薪水属性,也可以有一个生日属性等.

LINGO有两种类型的集:原始集(primitive set)和派生集(derived set).

一个原始集是由一些最基本的对象组成的,可以理解为一维数组.

一个派生集是用一个或多个其他集来定义的,也就是说,它的成员来自于其他已存在的集.派生集也就是叉集,可以理解为二维以上的数组.

集部分是LINGO模型的一个可选部分.在LINGO模型中使用集之前,必须在集部分事先定义.集部分以关键字“sets:”开始,以“endsets”结束.一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分.一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须先定义.

定义一个原始集,用下面的语法:

setname[/member_list/][:attribute_list];

注意:用“[ ]”表示该部分内容可选.

Setname是用来标记集的名字,最好具有较强的可读性.集名字必须严格符合标准命名规则:以拉丁字母或下划线()为首字符,其后由拉丁字母(A~Z)、下划线、阿拉伯数字(0,1,,9)组成的总长度不超过32个字符的字符串,且不区分大小写.

Member_list是集成员列表.如果集成员放在集定义中,那么对它们可采取显式罗列和隐式罗列两种方式.如果集成员不放在集定义中,那么可以在随后的数据部分定义它们.①当显式罗列成员时,必须为每个成员输入一个不同的名字,中间用空格或逗号隔开,允许混合使用.

②当隐式罗列成员时,不必罗列出每个集成员.可采用如下语法:

setname/member1..memberN/[:attribute_list];这里的member1是集的第一个成员名,memberN是集的最末一个成员名.LINGO将自动产生中间的所有成员名.LINGO也接受一些特定的首成员名和末成员名,用于创建一些特殊的集.

③集成员不放在集定义中,而在随后的数据部分来定义.

可用下面的语法定义一个派生集:

setname(parent set_list)[/member_list/][:attribute_list];

setname是集的名字.parent set list是已定义的集的列表,多个时必须用逗号隔开.如果没有指定成员列表,那么LINGO会自动创建父集成员的所有组合作为派生集的成员.派生集的父集既可以是原始集,也可以是其他的派生集.

数据部分和初始部分

在处理模型的数据时,需要为集指派一些成员并且在LINGO求解模型之前为集的某些

属性指定值.为此,LINGO为用户提供了两个可选部分:输入集成员和数据的数据部分(data section)和为决策变量设置初始值的初始部分(init section).

数据部分提供了模型相对静止部分与数据分离的可能性.显然,这对模型的维护和维数的缩放非常有利.

数据部分以关键字“data:”开始,以关键字“enddata”结束.在这里,可以指定集成员、集的属性.其语法如下:

;object list=value_list;对象列(object list)包含要指定值的属性名、要设置集成员的集名,用逗号或空格隔开.

一个对象列中至多有一个集名,而属性名可以有任意多.如果对象列中有多个属性名,那么它们的类型必须一致.如果对象列中有一个集名,那么对象列中所有的属性的类型就是这个集.

数值列(value list)包含要分配给对象列中的对象的值,用逗号或空格隔开.注意属性值的个数必须等于集成员的个数.

初始部分是LINGO提供的另一个可选部分.在初始部分中,可以输入初始声明(initialization statement),和数据部分中的数据声明相同。对实际问题建模时,初始部分并不起到描述模型的作用,在初始部分输入的值仅被LINGO求解器当作初始点来用,并且仅仅对非线性模型有用.和数据部分指定变量的值不同,LINGO求解器可以自由改变初始部分初始化的变量的值.

一个初始部分以“init:”开始,以“endinit”结束.初始部分的初始声明规则和数据部分的数据声明规则相同.也就是说,我们可以在声明的左边同时初始化多个集属性,可以把集属性初始化为一个值,可以用问号实现实时数据处理,还可以用逗号指定未知数值.好的初始点会减少模型的求解时间.

LINGO函数:

基本运算符:算术运算符、逻辑运算符和关系运算符;数学函数:三角函数和常规的数学函数;金融函数:两种金融函数;概率函数:大量与概率相关的函数;变量限制函数:用来定义变量的取值范围;集合操作函数:对集合的操作提供帮助;集合循环函数:遍历集合的元素,执行一定的操作;数据输入输出函数:允许模型和外部数据源相联系,进行数据的输入输出;辅助函数:各种杂类函数.

算术运算符:

+加

-减

*乘

/除

^乘方

关系运算符

在LINGO中,关系运算符主要是被用在模型中,来指定一个表达式的左边是否等于、小于等于、或者大于等于右边,形成模型的一个约束条件.关系运算符与逻辑运算符#eq#,

#e#,#ge#截然不同,前者是模型中该关系运算符所指定关系的为真描述,而后者仅仅判断一个该关系是否被满足:满足为真,不满足为假.

LINGO有三种关系运算符:“=”,“<=”和“>=”.LINGO中还能用“<”表示小于等于关系,“>”表示大于等于关系.LINGO并不支持严格小于和严格大于关系运算符.

逻辑运算符:

#not#一元运算符,否定该操作数的逻辑值;

#eq#若两个运算数相等,则为true,否则为false;

#ne#若两个运算符不相等,则为true,否则为false;

#gt#若左边的运算符严格大于右边的运算符,则为true,否则为false;

#ge#若左边的运算符大于或等于右边的运算符,则为true,否则为false;

#lt#若左边的运算符严格小于右边的运算符,则为true,否则为false;

#le#若左边的运算符小于或等于右边的运算符,则为true,否则为false;

#and#若两个参数都为true,则为true,否则为false;#or#若两个参数都为false,则为false,否则为true.

#or#仅当两个参数都为false时,结果为false;否则为true.

变量界定函数:

变量界定函数实现对变量取值范围的附加限制,共4种:

@bin(x)限制x为0或1

@bnd(L,x,U)限制L≤x≤U

@free(x)取消对变量x的默认下界为0的限制,自由变量,即x可以取任意实数(在默认情况下,LINGO规定变量是非负的,也就是说下界为0,上界为+∞.

@free取消了默认的下界为0的限制,使变量也可以取负值,要另外定义).

@gin(x)限制x为整数, 一般整数变量

@bnd用于设定一个变量的上下界,它也可以取消默认下界为0的约束.

数学函数

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函数的自然对数

@sqrt(x)x的算术平方根

@sign(x)x<0时,返回-1;否则,返回1.

@floor(x)x的整数部分

@smax(x1,x2)x1,x2中的最大值

@smin(xl,x2)x1,x2中的最小值

@mod(xl,x2)x1/x2的余数集合操作函数:

@for(s:e)对集合s中的每一元素都生成一个由表达式e描述的约束条件;

@sum(s:e)对集合s中的每一元素都生成表达式e的值,再返回所有这些值的和;

@prod(s:e)对集合s中的每一元素都生成表达式e的值,再返回所有这些值的积;

@max(s:e)对集合s中的每一元素都生成表达式e的值,再返回所有这些值的最大值;

@min(s:e)对集合s中的每一元素都生成表达式e的值,再返回所有这些值的最小值;

@size(s)返回集合s中的元素的个数

概率函数

@pbn(p,n,x)

二项分布的累积分布函数.当n或x不是整数时,用线性插值法进行计算.

@pcx(n,x)

自由度为n的x2分布的累积分布函数.

@peb(a,x)

当到达负荷为a,服务系统有x个服务器且允许无穷排队时的Erlang繁忙概率。

@pel(a,x)

当到达负荷为a,服务系统有x个服务器且不允许排队时的Erlang繁忙概率.

@pfd(n,d,x)

自由度为n和d的F分布的累积分布函数.

@pfs(a,x,c)

当负荷上限为a,顾客数为c,平行服务器数量为x时,有限源的Poisson服务系统的等待或返修顾客数的期望值.a是顾客数乘以平均服务时间,再除以平均返修时间.当c和(或)

x不是整数时,采用线性插值进行计算.

@phg(pop,g,n,x)

超几何(hypergeometric)分布的累积分布函数.pop表示产品总数,g是正品数.从所有产品中任意取出n(nspop)件.pop.g,n和x都可以是非整数,这时采用线性插值进行计算.

@ppl(a,x)

Poisson分布的线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从均值为a的Poisson分布。

@pps(a,x)

均值为a的Poisson分布的累积分布函数.当x不是整数时,采用线性插值进行计算.

@psl(x)

单位正态线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从标准正态分布。

@psn(x)

标准正态分布的累积分布函数。

@ptd(n,x)

自由度为n的t分布的累积分布函数.

@qrand(seed)

产生服从(0,1)区间的拟随机数.@qrand只允许在模型的数据部分使用,它将用拟随机数填满集属性.通常,声明一个mxn的二维表,m表示运行实验的次数,n表示每次实验所需的随机数的个数.在行内,随机数是独立分布的;在行间,随机数是非常均匀的.这些随机数是用“分层取样”的方法产生的.

集循环函数

集循环函数遍历整个集进行操作。其语法为

@function(setname[(set index_list)[|conditional_qualifier]]:expression list);

@function相应于下面罗列的4个集循环函数之一;setname是要遍历的集;set index list是集索引列表;conditional qualifier是用来限制集循环函数的范围,当集循环函数遍历集的每个成员时,LINGO都要对conditional qualifier进行评价,若结果为真,则对该成员执行

@function 操作,否则跳过,继续执行下一次循环.expression_list是被应用到每个集成员的表达式列表,当用的是@for函数时,expression list可以包含多个表达式,其间用逗号隔开.这些表达式将被作为约束加到模型中.当使用其余的三个集循环函数时,expression list只能有一个表达式.如果省略set_index_list,那么在expression_list中引用的所有属性的类型都是setname集.

(1)@for该函数用来产生对集成员的约束.基于建模语言的标量需要显式输入每个约束,而@for函数允许只输入一个约束,然后LINGO自动产生每个集成员的约束.

例1产生序列{1,4,9,16,25}

model:

sets:

number/1..5/:x;

endsets

@for(number(I):x(I)=I^2);

end

(2)@sum该函数返回遍历指定的集成员的一个表达式的和.

例2求数组(5,1,3,4,6,10)中前5个数的和.

model:

data:

N=6;

enddata

sets:

number/1..N/:x;

endsets

data:

x=5 1 3 4 6 10;

enddata

s=@sum(number(I) | I #le# 5:x);

end

运行结果:

(3)@min 和@max返回指定的集成员的一个表达式的最小值或最大值.

例3求数组(5,1,3,4,6,10)中前5个数的最小值,后3个数的最大值.

model:

data:

N=6;

enddata

sets:

number/1..N/:x;

endsets

data:

x=5 1 3 4 6 10;

enddata

minv=@min(number(I) | I #le# 5:x);

maxv=@max(number(I) | I #ge# N-2:x);

end

运行结果:

8.输入和输出函数

输入和输出函数可以把模型和外部数据(比如文本文件、数据库和电子表格等)连接起来.

(1)@file函数

该函数用于从外部文件中输入数据,可以放在模型中的任何地方.该函数的语法格式为

@file(‘filename').这里filename是文件名,可以采用相对路径和绝对路径两种表示方式.@file函数对同一文件的两种表示方式的处理和对两个不同的文件处理是一样的,这一点必须注意.

(2)@text函数

该函数被用在数据部分用来把解输出至文本文件中.它可以输出集成员和集属性值.其语法为

@text(['filename'])i这里filename是文件名,可以采用相对路径和绝对路径两种表示方式.如果忽略filename,那么数据就被输出到标准输出设备(大多数情形都是屏幕).@text函数仅能出现在模型数据部分的一条语句的左边,右边是集名(用来输出该集的所有成员名)或集属性名(用来输出该集属性的值).

我们把用接口函数产生输出的数据声明称为输出操作。输出操作仅当求解器求解完模型后才执行,执行次序取决于其在模型中出现的先后.

(3)@ole函数

@ole是从Excel中引入或输出数据的接口函数,它是基于传输的ole技术.ole传输直接在内存中传输数据,并不借助于中间文件。当使用@ole时,LINGO先装载Excel,再通知Excel装载指定的电子数据表,最后从电子数据表中获得Ranges.为了使用ole函数,必须有Excel5及其以上版本.ole函数可在数据部分和初始部分引入数据.

@ole可以同时读集成员和集属性,集成员最好用文本格式,集属性最好用数值格式.原始集每个集成员需要一个单元(cell),而对于n元的派生集每个集成员需要n个单元,这里第一行的n个单元对应派生集的第一个集成员,第二行的n个单元对应派生集的第二个集成员,以此类推.

@ole只能读一维或二维的Ranges[在单个的Excel工作表(sheet)中],但不能读间断的或三维的Ranges.Ranges是自左而右、自上而下来读的。

9.辅助函数

@if(logical_condition,true_result,false_result);

@if 函数将评价一个逻辑表达式logicalcondition,如果为真,返回对应真的结果 true result,否则返回对应假的结果false_result.

LINGO的安装可在Windows操作系统下较为简便地完成,运行后会得到下面一个窗口(见图1-1):

图1-1 LINGO软件窗口及商业版注册信息

外层是主框架窗口,包含了所有菜单命令和工具条,其他所有窗口都包含在主窗口之下.主窗口的标题为LINGO Model-LINGO1,是LINGO的默认模型窗口,建立的模型都要在该窗口内编码实现.

1.2引例

例如,为求解线性规划问题(此线性方程可以用AxMath数学软件编辑,也可以用Latex软件编辑,见我TEX教程)(见图1-2 ,图1-3)

图1-2 用AxMath软件编辑的线性方程

图1-3 AxMath数学公式编辑软件

可在模型窗口中输入如下程序:

max=2*x1+3*x2;

x1+2*x2<=8;

4*x1<=16;

4*x2<=12;

如下图(见图1-4)所示:

图1-4

这段程序可以存储为LINGO软件默认的1g4格式的文件,以便进行存档、打开、编辑等操作.点击工具栏中的按钮Solve (或使用快捷键Ctrl+U),即返回如下结果:

(1)求解状态(LINGO Solver Status)(见图1-5).

图1-5 LinGo 求解状态说明

(2)解的报告(Solution Report).

图1-6 求解状态

报告表明:

Global optimal solution found:LINGO求出全局最优解.

Objective value:最优值为14.

Total solver iterations:总迭代次数为1.

Variable、Value:最优解为x1=4,x2=2.

Reduced Cost:缩减成本系数(最优解中变量的Reduced Cost的值自动取为0).

Row:模型中的行号.

Slack or Surplus:松弛或剩余,即约束条件两边的差.对于“≤”型不等式,右减左的差称为Slack(松弛);对于“≥”型不等式,左减右的差称为Surplus(剩余).当左右相等时,松弛或剩余的值为0.当约束条件无法成立时(无可行解),松弛或剩余的值为负值.

Dual Price:影子价格.

表1-1

表1-1

意义:原料1的影子价格为1.5,意指其供应量已被用尽,若将其供应量增加1,则最大利润将增加1.5;原料2的影子价格为0.125,意指其供应量已被用尽,若将其供应量增加1,则最大利润将增加0.125;原料3的影子价格为0,意指其供应量还剩余4,即使再增加其供应量,也不会使最大利润增大.

(3)Range Report(敏感性分析).(注:我的LinGo软件为已注册的商业版本)

首先设置菜单LINGO、Options、General Solver、Dual Computations:

Prices&Ranges,Save、OK;然后在LINGO Model窗口下浏览菜单LINGO、Range,返回如下结果:

图1-7 设置Range Report(敏感性分析)

图1-8 设置Range Report过程

图1-9 计算结果

表1-2

表1-2

意义:当目标函数中变量x1的系数在(2-0.5,2+INFINITY)=(1.5,+∞)范围内变化时,最优解不变;当目标函数中变量x2的系数在(3-3,3+1)=(0,4)范围内变化时,最优解不变.

Righthand Side Ranges:(在Reduced Cost和Dual Price都不改变时)

约束条件的右侧常数的变化范围.

Current RHS:右侧常数的当前值.

Allowable Increase:允许上调的幅度.

Allowable Decrease:允许下调的幅度.

表1-3

表1-3

意义:当约束条件1的右侧常数b1,在(8-4,8+2)=(4,10)范围内变化时,最优解不变;当约束条件2的右侧常数b2。在(16-8,16+16)=(8,32)范围内变化时,最优解不变;当约束条件3的右侧常数b3在(12-4,12+INFINITY)=(8,+∞)范围内变化时,最优解不变.在实际问题建模的时候,总会遇到一群或多群相联系的对象,如工厂、消费者群体、交通工具和雇工等,LINGO允许把这些相联系的对象聚合成集合(set).集合是LINGO建模语言的基础,是程序设计最强有力的基本构件.借助于集合,能够用一个单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型,最大限度地发挥LINGO建模语言的优势.

例如,对上述线性规划问题,可利用“集合”编写如下通用的LIN-GO程序:

model:

sets:

constraint/1..3/:b;

variable/1..2/:c,x;

matrix(constraint, variable):A;

endsets

max=@ sum(variable:c*x);

@ for(constraint(i):

@ sum(variable(j):A(i,j)*x(j))<=b(i));

data:

c=2,3;

b=8,16,12;

A=1,2,

4,0,

0,4;

enddata

end

显然,利用“集合”编写程序的好处是当模型变化时,易于修改,延展性强.

图1-10 求解状态

图1-11 计算结果

1.3应用举例

下面通过若干例子来说明LINGO在求解优化问题上的重要应用.

1.线性规划问题

例1

图1-12 线性规划方程

程序:

min=4*x1+x2+x3; !目标函数;

2*x1+x2+2*x3=4; !约束条件;

3*x1+3*x2+x3=3; !约束条件;

图 1-12 LinGo源程序及计算结果

或:

model:

sets:

constraint/1..2/:b;

variable/1..3/:c,x;

matrix(constraint, variable):A;

endsets

min=@sum(variable:c*x);

@for(constraint(i):

@sum(variable(j):A(i,j)*x(j))=b(i));

data:

c=4,1,1;

b=4,3;

A=2,1,2,

3,3,1;

enddata

end

运行结果:

图1-13

据此知,最优解为x1=0,x2=0.4,x3=1.8,最优值为2.2.

例2运输问题

三个发点、四个收点;供应量为15、25、5,需求量为5、15、15、10;单位运费矩阵为

图1-15

程序:

min=10*x11+6*x12+20*x13+11*x14

+12*x21+7*x22+9*x23+20*x24

+6*x31+14*x32+16*x33+18*x34;

x11+x12+x13+x14=15; !发点的约束条件;

x21+x22+x23+x24=25;

x31+x32+x33+x34=5;

x11+x21+x31=5; !收点的约束条件;

x12+x22+x32=15;

x13+x23+x33=15;

x14+x24+x34=10;

或:

model:

sets:

source/sr1..sr3/:supply;

sink/sk1..sk4/:demand;

links(source,sink):c,x;

endsets

data:

supply=15,25,5;

demand=5,15,15,10;

c=10,6,20,11

12,7,9,20

6,14,16,18;

enddata

min=@sum(links(i,j):c(i,j)*x(i,j));

@for(source(i):@sum(sink(j):x(i,j))=supply(i));

@for(sink(j):@sum(source(i):x(i,j))=demand(j));

End

运行结果:

图1-16 运行结果

据此知,最优解为x12=5,x4=10,x22=10,x2=10,x3=15,x1=5,最优值为375.

2.纯整数规划问题

例3

图1-17

程序1:

max=20*x1+10*x2;

5*x1+4*x2<24;

2*x1+5*x2<13;

@gin(x1); !整数变量;

@gin(x2); !整数变量;

或程序2:

model:

sets: constraint/1..2/:b;

variable/1..2/:c,x;

matrix(constraint, variable):A;

endsets

max=@sum(variable:c*x);

@for(constraint(i):

@sum(variable(j):A(i,j)*x(j))<=b(i));

@for(variable:@gin(x));

data:

c=20,10;

b=24,13;

A=5,4,

2,5;

enddata

end

程序1运行结果:

图1-18 程序1运行结果

程序2运行结果:

图1-19 程序2运行结果

据此知,最优解为x1=4,x2=1,最优值为90.

3. 0-1规划问题(所有求解结果为0或1两个数中其中任一一个)

例4背包问题

图1-20 背包问题

程序:

max=7*x1+5*x2+9*x3+6*x4+3*x5;

56*x1+20*x2+54*x3+42*x4+15*x5<=100;

@bin(x1);@bin(x2);@bin(x3);@bin(x4);@bin(x5);

或:

model:

sets:

WP/WP1.. WP5/:A,C,x;

endsets

data:

A=56 20 54 42 15;

c=7 5 9 6 3;

enddata

max=@ sum(WP:c*x);

@ sum(WP:A*x)<=100;

@for(WP:@ bin(x));

end

结果:仅列出主要部分:

图1-21

据此知,最优解为x1=0,x2=1,x3=1,x4=0,x5=1,最优值为17.

例5指派问题n=5,单位费用矩阵为

图1-22 单位费用矩阵

图1-23 AxMath编辑单位费用矩阵

程序:

model:

sets:

Worker/W1..W5/;

Job/J1..J5/;

links(Worker, Job):c,x;

endsets

data:

c=4,8,7,15,12,

7,9,17,14,10,

6,9,12,8,7,

6,7,14,6,10,

6,9,12,10,6;

enddata

min=@ sum(links:c*x);

@for(Worker(i):@sum(Job(j):x(i,j))=1);

@for(Job(j):@sum(Worker(i):x(i,j))=1);

@for(links:@bin(x));

end

运行结果:

图 1-25 计算结果

据此知,最优解为x13=x22=x31=X44=X55=1,最优值为34.

4.混合整数规划问题

例6旅行售货员问题4个城市,距离矩阵为

图1-26 距离矩阵

程序:

model:

sets: city/1..4/:u;

link(city, city):dist,x;

endsets

data:

dist= 0 8 5 6

6 0 8 5

7 9 0 5

9 7 8 0;

enddata

n=@size(city);

min=@sum(link: dist*x);

@for(city(k):@sum(city(i)|i #ne#k:x(i,k))=1;

@sum(city(j)|j#ne#k:x(k,j))=1;);

@for(city(i):@for(city(j)|j#gt#1#and#i #ne#j:u(i)-

u(j)+n*x(i,j)<=n-1););

@for(city(i):u(i)<=n-1);

@for(link:@bin(x));

end

程序结果:

图1-27 计算结果

据此知,最优解为x13=0,x4=1,x2=1,x21=0,最优值为23.即最优路线为1-3-4-2-1,最短路程为23.

5.非线性规划问题

例7

图1-28 非线性规划方程组

程序:

min=x1^2+x2^2;

x1+x2>=1;

x1<=1;

x2<=1;

运行结果:

图1-29 LinGo程序及运行结果

据此知,最优解为x1=0.5,x2=0.5,最优值为0.5.

6.多目标规划问题

例8

图1-30 目标规划方程组

程序:

min=(2100*x1+4800*x2)/(3600*x1+6500*x2);

x1<=5;

x2<=8;

x1+x2>=9;

结果:仅列出主要部分:

图1-31 运行结果

据此知,最优解为x1=5,x2=4.

例9

图1-32

程序:

max=@smin(-2100*x1-4800*x2,3600*x1+6500*x2);

x1<=5;

x2<=8;

x1+x2>=9;

结果:仅列出主要部分:

图1-33 运行结果

据此知,最优解为x1=5,x2=4.

7.目标规划

例10

图1-34 目标规划方程组

程序:

min=999999*d12+999*d22+d31;

4*x1+x2+d11-d12=25;

3*x1+2*x2+d21-d22=45;

5*x1+3*x2+d31-d32=60;

部分结果:

图1-36 运行结果

据此,有效解为:x1=2.142857,x2=16.42857.

二次规划问题

例11

图1-36 二次规划问题方程组

程序:

min=0.5*x1^2+x2^2-x1*x2-2*x1-6*x2;

x1+x2<=2;

-x1+2*x2<=2;

2*x1+x2<=3;

运行结果:

图1-37 LinGo程序及运行结果

据此,局部最优解为:x1=0.6666668,x2=1.333333,最终优值为: -8.222222

9.图与网络优化问题

例12最短路问题无向图,边权矩阵见表1-4:

表1-4 边权矩阵表

求从顶点1到顶点6的最短路线:

程序:

model:

sets: nodes/1..6/;

arcs(nodes, nodes)|&1#lt#&2:c,x;

endsets

data:

c=7 12 21 31 44

7 12 21 31

7 12 21

7 12

7;

enddata

n=@ size(nodes);

min=@ sum(arcs:c*x);

@for(nodes(i) |i #ne#1#and#i #ne#n:

@sum(arcs(i,j):x(i,j))=@sum(arcs(j,i):x(j, i)));

@sum(arcs(i,j) |i #eq#1:x(i,j))=1;

end

部分运行结果:

图1-38 运行结果

据此知,最短路为1→2→4→6,长度为31.

例13最小树问题(见图1-39)

图1-39 最小树及相应边权

程序:

model:

sets: node/1..7/:u;

link(node, node):w,x;

endsets

data:

w=0 3 2 7 100 100 100

3 0 7 100 100 4 100

2 7 0 100 1 100 100

7 100 100 0 2 100 4

100 100 1 2 0 2 4

100 4 100 100 2 0 5

100 100 100 4 4 5 0;

enddata

min=@sum(link:w*x);

@sum(node(j)|j #gt#1:x(1,j))>=1;

@for(node(j)|j#gt#1:@sum(node(i)|i #ne#j:x(i,j))=1;);

n=@size(node);

@for(link(i,j)|i #ne#j:u(i)-u(j)+n*x(i,j)<=n-1);

@for(link:@bin(x));

end

注:程序中用较大的数100表示相应的两个顶点之间不存在边.

结果:仅列出主要部分:

图1-41 运行结果

据此知,最小树为(见图1-42)

图1-42 最小树

例14最大流问题(见图1-43)

图1-43 最大流问题权树

程序:

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

n=@size(nodes);

max=flow;

@for(nodes(i)|i #ne# 1 #and# i #ne# n:

@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:@bnd(0,f,c));

end

或:稀疏矩阵方式

model:

sets:

nodes/s,1,2,3,4,t/;

arcs(nodes,nodes):c,f;

endsets

data:

c=0;

enddata

calc:

c(1,2)=8;c(1,4)=7;

c(2,3)=9;c(2,4)=5;

c(3,4)=2;c(3,6)=5;

c(4,5)=9;c(5,3)=6;c(5,6)=10;

endcalc

n=@size(nodes);

max=flow;

@for(nodes(i)|i #ne#1 #and# i #ne# n:

@sum(nodes(j):f(i,j))=@sum(nodes(j):f(j,i)));

@sum(nodes(i):f(1,i))=flow;

@sum(nodes(i):f(i,n))=flow;

@for(arcs:@bnd(0,f,c));

end

部分结果:

图1-44 运行结果

据此知,最大流为(见图1-45)。

图1-46 最大流树

除优化计算外,LINGO还具有数据拟合、解方程组等其他功能.

例15利用以下数据(表1-5)拟合录像带转过的时间t与计数器的读数n之间的关系

图1-47 录像带转过的时间t与计数器的读数n之间的关系1

图1-48 录像带转过的时间t与计数器的读数n之间的关系2

程序:

model:

sets:recorder/r1..r19/:n,t;

endsets

data:

n=0,617,1141,1601,2019,2403,2760,3096,3413,3715,

4004,4280,4545,4803,5051,5291,5525,5752,6061;

t=0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,

150,160,170,184;

enddata

min=@sum(recorder:(a*(n^2)+b*n-t)^2);

end

运行结果:

图1-49 运行结果

据此知,t=0.000002611393n^2+0.01452963.

例16解线性方程组

图1-50 线性方程组

程序1:

6*x1+4*x2+7*x3+3*x4=19;

2*x1+9*x2+4*x3+x4=26;

x1+9*x2+3*x3+8*x4=17;

8*x1+6*x2+4*X3+2*x4=40;

@free(x1);@free(x2);@free(x3);@free(x4);

或程序2:

model:

sets: RC/1..4/:x,b;

matrix(RC, RC):A;

endsets

@for(RC(i):

@sum(RC(j):A(i,j)*x(j))=b(i);@free(x));

data:

b=19,26,17,40;

A=6,4,7,3,

2,9,4,1,1,9,3,8,8,6,4,2;

enddata

结果:

图1-51 程序1运行结果

图1-51 程序2运行结果2

总结:以上是本人在学习工作当中,将LINGO软件应用在线性规划、非线性优化、整数规划、二次规划的优化,数学建模,信息技术,大数据分析,博弈论,计算数学,运筹学的一些具体简单实例,对于数学建模中涉及到的(MATLAB,LINGO,1STOPT数学软件知识)均在自编教材中涉及,对于本文中源程序不懂的地方,希望大家在多多参考LinGo语法资料,在实践中学习体会,在学习中成长,转载请注明版权!如果需要本教程中数学建模教程及加密电子版PDF教程文件以及LinGo正版软件,请与我联系.谢谢!

编程小号
上一篇 2026-02-03 17:01
下一篇 2026-02-03 17:06

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/39695.html