LINGO大规模规划求解

合集下载

Lingo求解多目标规划新

Lingo求解多目标规划新

Lingo求解多目标规划新例:某工厂生产Ⅰ、Ⅱ两种产品,需要用到A ,B ,C 三种设备,已知有关数据见下表。

企业的经营目标不仅仅是利润,还需要考虑多个方面:(1)力求使利润不低于1500元;(2)考虑到市场需求,Ⅰ、Ⅱ两种产品的产量比应尽量保持1:2;(3)设备A 为贵重设备,严格禁止超时使用;(4)设备C 可以适当加班,但要控制;设备B 即要求充分利用,又尽可能不加班。

在重要性上,设备C 是设备B 的3倍。

ⅠⅡ设备的生产能力/hA (h/件) 2 2 12B (h/件) 4 0 16C (h/件) 0 5 15 利润元/件200300解:此题中只有设备A 是刚性约束,其余都是柔性约束。

首先,最重要的指标是企业的利润,将它的优先级列为第一级;其次是Ⅰ、Ⅱ两种产品的产量保持1:2的比例,列为第二级;再次,设备B 、C 的工作时间要有所控制,列为第三级。

在第三级中,设备B 的重要性是设备C 的3倍,因此它们的权重不一样,设备B 的系数是设备C 的3倍。

该计划问题可用数学模型表示为:目标函数min)33()(433322211++-+--+++++=d d d p d d p d p z满足约束条件2122x x + 12≤15003002001121=-+++-d d x x022221=-+-+-d d x x 14x 1633=-++-d d155442=-++-d d x3,2,1,0,,,21=≥+-i d d x x i i LINGO 程序为:求第一级目标。

LINGO 程序如下: model: sets:variable/1..2/:x;S_Con_Num/1..4/:g,dplus,dminus;S_con(S_Con_Num,Variable):c; endsets data:g=1500 0 16 15; c=200 300 2 -1 4 0 0 5; enddata min=dminus(1); 2*x(1)+2*x(2)<12;@for(S_Con_Num(i):@sum(Variable(j):c(i,j)*x(j))+dminus(i)-dplus(i )=g(i)); end求得dminus(1)=0,即目标函数的最优值为0,第一级偏差为0。

实验1 利用Lingo求解线性规划

实验1 利用Lingo求解线性规划

实验一:利用Lingo 软件求解线性规划问题实验一 利用Lingo 软件求解线性规划问题1、 实验目的和任务1.1. 进一步掌握Lingo 编程操作;1.2通过实验进一步掌握运筹学线性规划问题的建模以及求解过程,提高学生分析问题和解决问题能力。

2、 实验仪器、设备及材料计算机、Lingo3、 实验内容料场选址问题P10某公司有6个建筑工地要开工,每个工地的位置(用平面坐标a,b 表示,距离单位:km )及水泥日用量d(单位:t)由下表给出,目前有两个临时料场位于P (5,1),Q (2,7),日储量各有20t.请回答以下问题: 假设从料场到工地之间有直线道路相连,试制定每天的供应计划,即从P,Q 两料场分别向各工地运送多少吨水泥,使总的吨公量数最小。

工地的位置(a,b )及水泥日用量d建模 设工地的位置为(,)i i a b ,水泥日用量为i d ,i=1,2,…,6;料场位置为(,)j j x y ,日储量为j e ,j=1,2; 从料场j 向工地i 的运送量为ij c 。

决策变量:在问题(1)中,决策变量就是料场j 向工地i 的运送量为ij c ;在问题(2)中,决策变量除了料场j 向工地i 的运送量为ij c 外,新建料场位置(,)j j x y 也是决策变量。

目标函数:这个优化问题的目标函数f 是总砘公量数(运量乘以运输距离),所以优化目标可表为2611min j i f c ===∑∑约束条件:各工地的日用量必须满足,所以21,1,2, (6)ij ijc d i ===∑各料场的运送量不能超过日储量,所以61,1,2. ij jic e j =≤=∑求解过程编写模型程序:(介绍集合的定义及应用)model:sets:!确定变量a(1),a(2),a(3),a(4),a(5),a(6);demand/1..6/:a,b,d;supply/1..2/:x,y,e;link(demand,supply):c;endsetsdata:!分割数据的空格与逗号或回车的作用是等价的;a=1.25 8.75 0.5 5.75 3 7.25;b=1.25,0.75,4.75,5,6.5,7.75;d=3,5,4,7,6,11;e=20,20;!a=enddatainit:!lingo对数据是按列赋值的,而不是按行;x,y=5,1,2,7;endinit[OBJ] min=@sum(link(i,j):c(i,j)*((x(j)-a(i))^2+(y(j)-b(i))^2)^(1/2));@for(demand(i):[demand_con] @sum(supply(j):c(i,j))=d(i););@for(supply(i):[supply_con] @sum(demand(j):c(j,i))<=e(i););@for(supply(i):@bnd(0.5,x(i),8.75);@bnd(0.75,y(i),7.75););End计算结果:(如果你使用的是试用版软件,则可能不能用全局求解器求解本例,因为问题规模太大了,激活全局最优求解程序的方法,是用“lingo|Options”菜单命令打开选项对话框,在“Global Solver”选项卡上选择“Use Global Solver”)Local optimal solution found.Objective value: 85.26604Total solver iterations: 61Variable Value Reduced CostA( 1) 1.250000 0.000000A( 2) 8.750000 0.000000A( 3) 0.5000000 0.000000A( 4) 5.750000 0.000000A( 5) 3.000000 0.000000A( 6) 7.250000 0.000000B( 1) 1.250000 0.000000B( 2) 0.7500000 0.000000B( 3) 4.750000 0.000000B( 4) 5.000000 0.000000B( 5) 6.500000 0.000000B( 6) 7.750000 0.000000D( 1) 3.000000 0.000000D( 2) 5.000000 0.000000D( 3) 4.000000 0.000000D( 4) 7.000000 0.000000D( 5) 6.000000 0.000000D( 6) 11.00000 0.000000X( 1) 3.254883 0.000000X( 2) 7.250000 0.6335133E-06 Y( 1) 5.652332 0.000000Y( 2) 7.750000 0.5438639E-06 E( 1) 20.00000 0.000000E( 2) 20.00000 0.000000C( 1, 1) 3.000000 0.000000C( 1, 2) 0.000000 4.008540C( 2, 1) 0.000000 0.2051358C( 2, 2) 5.000000 0.000000C( 3, 1) 4.000000 0.000000C( 3, 2) 0.000000 4.487750C( 4, 1) 7.000000 0.000000C( 4, 2) 0.000000 0.5535090C( 5, 1) 6.000000 0.000000C( 5, 2) 0.000000 3.544853C( 6, 1) 0.000000 4.512336C( 6, 2) 11.00000 0.000000Row Slack or Surplus Dual PriceOBJ 85.26604 -1.000000DEMAND_CON( 1) 0.000000 -4.837363DEMAND_CON( 2) 0.000000 -7.158911DEMAND_CON( 3) 0.000000 -2.898893DEMAND_CON( 4) 0.000000 -2.578982DEMAND_CON( 5) 0.000000 -0.8851584DEMAND_CON( 6) 0.000000 0.000000SUPPLY_CON( 1) 0.000000 0.000000SUPPLY_CON( 2) 4.000000 0.000000如果把料厂P,Q的位置看成是已知并且固定的,这时是LP模型,只需把上面的程序中初始段的语句移到数据段就可以了。

lingo解决线性规划问题的程序(经典)

lingo解决线性规划问题的程序(经典)

Lingo ‎12软件培‎训教案Lingo ‎主要用于求‎解线性规划‎,整数规划,非线性规划‎,V 10以上‎版本可编程‎。

例1 一个简单的‎线性规划问‎题0 , 600 2 100 350 st. 3 2max >=<=+=<<=++=y x y x x y x y x z!exam_‎1.lg4 源程序 max = 2*x+3*y; [st_1] x+y<350; [st_2] x<100;2*x+y<600; !决策变量黙‎认为非负; <相当于<=; 大小写不区‎分当规划问题‎的规模很大‎时,需要定义数‎组(或称为矩阵‎),以及下标集‎(set) 下面定义下‎标集和对应‎数组的三种‎方法,效果相同::r1 = r2 = r3, a = b = c. sets :r1/1..3/:a; r2 : b;r3 : c;link2‎(r1,r2): x; link3‎(r1,r2,r3): y; endse ‎t s data :ALPHA ‎ = 0.7; a=11 12 13 ; r2 = 1..3; b = 11 12 13;c = 11 12 13; endda ‎t a例2 运输问题解: 设决策变量‎ij x = 第i 个发点‎到第j 个售‎点的运货量‎,i =1,2,…m; j =1,2,…n; 记为ij c =第i 个发点‎到第j 个售‎点的运输单‎价,i =1,2,…m; j =1,2,…n 记i s =第i 个发点‎的产量, i =1,2,…m; 记j d=第j 个售点‎的需求量, j =1,2,…n.其中,m = 6; n = 8. 设目标函数‎为总成本,约束条件为‎(1)产量约束;(2)需求约束。

于是形成如‎下规划问题‎:nj m i x nj d x m i s x x c ij j ni ij i mj ij mi nj ij ij ,...,2,1,,...,2,1,0,...,2,1,,...,2,1, st.z min 1111==>=<==<==∑∑∑∑====把上述程序‎翻译成LI ‎N GO 语言‎,编制程序如‎下:!exam_‎2.lg4 源程序model‎:!6发点8收‎点运输问题‎;sets:rows/1..6/: s; !发点的产量‎限制;cols/1..8/: d; !售点的需求‎限制;links‎(rows,cols): c, x; !运输单价,决策运输量‎;endse‎t s!-------------------------------------;data:s = 60,55,51,43,41,52;d = 35 37 22 32 41 32 43 38;c = 6 2 6 7 4 2 9 54 95 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;endda‎t a!------------------------------------;min = @sum(links‎: c*x); !目标函数=运输总成本‎;@for(rows(i):@sum(cols(j): x(i,j))<=s(i) ); ! 产量约束;@for(cols(j):@sum(rows(i): x(i,j))=d(j) ); !需求约束;end例3把上述程序‎进行改进,引进运行子‎模块和打印‎运算结果的‎语句:!exam_‎3.lg4 源程序model‎:!6发点8收‎点运输问题‎;sets:rows/1..6/: s; !发点的产量‎限制;cols/1..8/: d; !售点的需求‎限制;links‎(rows,cols): c, x; !运输单价,决策运输量‎;endse‎t s!==================================;data:s = 60,55,51,43,41,52;d = 35 37 22 32 41 32 43 38;c = 6 2 6 7 4 2 9 54 95 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;endda‎t a!==================================;submo‎d el trans‎f er:min = cost; ! 目标函数极‎小化;cost = @sum(links‎: c*x); !目标函数:运输总成本‎;@for(rows(i):@sum(cols(j): x(i,j)) < s(i) ); ! 产量约束;@for(cols(j):@sum(rows(i): x(i,j)) > d(j) ); !需求约束;endsu‎b mode‎l!==================================;calc:@solve‎(trans‎f er); !运行子模块‎(解线性规划‎);@diver‎t('trans‎f er_o‎u t.txt');!向.txt文件‎按自定格式‎输出数据;@write‎('最小运输成‎本=',cost,@newli‎n e(1),'最优运输方‎案x=');@for(rows(i):@write‎(@newli‎n e(1));@write‎f or(cols(j): ' ',@forma‎t(x(i,j),'3.0f') ) );@diver‎t(); !关闭输出文‎件;endca‎l cend打开tra‎nsfer‎_out.txt文件‎,内容为:最小运输成‎本=664最优运输方‎案x=0 19 0 0 41 0 0 01 0 0 32 0 0 0 00 11 0 0 0 0 40 00 0 0 0 0 5 0 3834 7 0 0 0 0 0 00 0 22 0 0 27 3 0例4data段‎的编写技巧‎(1):从txt文‎件中读取原‎始数据!exam_‎3.lg4 源程序中的‎d a ta也‎可以写为:data:s = @file('trans‎f er_d‎a ta.txt');d = @file('trans‎f er_d‎a ta.txt');c = @file('trans‎f er_d‎a ta.txt');endda‎t a其中,trans‎f er_d‎a ta.txt的内‎容为:!trans‎f er.lg4程序‎的数据;!产量约束s‎= ;60,55,51,43,41,52 ~!需求约束d‎= ;35 37 22 32 41 32 43 38 ~!运输单价c‎= ;6 2 67 4 2 9 54 95 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3 ~!注:字符~是数据分割‎符,若无此符,视所有数据‎为一个数据‎块,只赋给一个‎变量;例5lingo‎程序的的3‎种输入和3‎种输出方法‎;!exam_‎5.lg4的源‎程序;sets:rows/1..3/: ;cols/1..4/: ;link(rows,cols): a, b, mat1, mat2;endse‎t sdata:b = 1,2,3,45,6,7,89,10,11,12; !程序内输入‎;a = @file('a.txt'); !外部txt‎文件输入;mat1 = @ole('d:\lingo‎12\data.xls',mat1); !EXcel‎文件输入;endda‎t acalc:@text('a_out‎.txt') = a; !列向量形式‎输出数据;@for(link: mat2 = 2*mat1);@ole('d:\lingo‎12\data.xls') = mat2 ;!把mat2‎输出到xl‎s文件中的‎同名数据块‎;!向.txt文件‎按自定格式‎输出数据(参照前例);Endca‎l c例6程序段中的‎循环和选择‎结构举例!exam_‎6.lg4的源‎程序;sets:rows/1..5/:;cols/1..3/:;links‎(rows,cols):d;endse‎t sdata:d=0 2 34 3 21 3 24 7 22 1 6;endda‎t acalc:i=1;@while‎(i#le#5:a = d(i,1);b = d(i,2);c = d(i,3);@ifc(a#eq#0:@write‎('infea‎s ible‎!',@newli‎n e(1));@elsedelta‎= b^2-4*a*c;sqrt = @sqrt(@if(delta‎#ge#0, delta‎,-delta‎));@ifc(delta‎#ge#0:@write‎('x1=',(-b+sqrt)/2/a,'x2=',(-b-sqrt)/2/a,@newli‎n e(1));@else@write‎('x1=',-b/2/a,'+',sqrt/2/a,'i','x2=',-b/2/a,'-',sqrt/2/a,'i',@newli‎n e(1));););i=i+1;);endca‎l c本程序中的‎循环结构也‎可以用@for(rows(i): 程序体);进行计算。

LINGO在多目标规划及最大最小化模型中的应用

LINGO在多目标规划及最大最小化模型中的应用

LINGO 在多目标规划和最大最小化模型中的应用在许多实际问题中,决策者所期望的目标往往不止一个,如电力网络管理部门在制定发电计划时即希望安全系数要大,也希望发电成本要小,这一类问题称为多目标最优化问题或多目标规划问题。

一、多目标规划的常用解法多目标规划的解法通常是根据问题的实际背景和特征,设法将多目标规划转化为单目标规划,从而获得满意解,常用的解法有:1.主要目标法确定一个主要目标,把次要目标作为约束条件并设定适当的界限值。

2.线性加权求和法对每个目标按其重要程度赋适当权重0≥i ω,且1=∑i i ω,然后把)(x f i ii ∑ω作为新的目标函数(其中p i x f i ,,2,1),( =是原来的p 个目标)。

3.指数加权乘积法设p i x f i ,,2,1),( =是原来的p 个目标,令∏==p i a i ix f Z 1)]([其中i a 为指数权重,把Z 作为新的目标函数。

4.理想点法先分别求出p 个单目标规划的最优解*i f ,令∑-=2*))(()(i i f x f x h然后把它作为新的目标函数。

5.分层序列法将所有p 个目标按其重要程度排序,先求出第一个最重要的目标的最优解,然后在保证前一个目标最优解的前提条件下依次求下一个目标的最优解,一直求到最后一个目标为止。

这些方法各有其优点和适用的场合,但并非总是有效,有些方法存在一些不足之处。

例如,线性加权求和法确定权重系数时有一定主观性,权重系数取值不同,结果也就不一样。

线性加权求和法、指数加权乘积法和理想点法通常只能用于两个目标的单位(量纲)相同的情况,如果两个目标是不同的物理量,它们的量纲不相同,数量级相差很大,则将它们相加或比较是不合适的。

二、最大最小化模型在一些实际问题中,决策者所期望的目标是使若干目标函数中最大的一个达到最小(或多个目标函数中最小的一个达到最大)。

例如,城市规划中需确定急救中心的位置,希望该中心到服务区域内所有居民点的距离中的最大值达到最小,称为最大最小化模型,这种确定目标函数的准则称为最大最小化原则,在控制论,逼近论和决策论中也有使用。

利用LINGO软件解决数学建模问题

利用LINGO软件解决数学建模问题

LINGO 7.0 运行结果如下:
Global optimal solution found at step: Objective value:
Variable X1 Value 264937.9
8
933400.0
Reduced Cost 0.0000000 Row 1 2 3 4 5 6 Slack or Surplus 933400.0 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 Dual Price
表1
标准汽油 1 2 3 4 辛烷数 107.5 93.0 87.0 108.0 蒸 汽
(1 g/cm^2=98Pa)
压 力 库存量 (g/cm^2) 7.11*10^(-2) 11.38*10^(-2) 5.69*10^(-2) 28.45*10^(-2)

380000 262200 408100 130100
表2
飞机汽油 1 2 辛烷数 >=91 >=100 蒸汽压力(g/cm^2) <=9.96*10^(-2) <=9.96*10^(-2) 产量需求(L) 越多越好 >=250000
建模过程略(详见《运筹学基础》P54—55) 目标函数:max z=x1+x2+x3+x4 约束条件:x5+x6+x7+x8>=250000 x1+x5<=380000 x2+x6<=265200 x3+x7<=408100 x4+x8<=130100 2.85x1-1.42x2+4.27x3-18.49x4>=0 2.85x5-1.42x6+4.27x7-18.49x8>=0 16.5x1+2.0x2-4.0x3+17x4>=0 7.5x5-7.0x6-13.0x7+8.0x8>=0 xj>=0(j=1,2...,8)

运用Lingo进行线性规划求解(实例)

运用Lingo进行线性规划求解(实例)
要点一
LINGO
支持多种线性规划算法,包括单纯形法、网络算法等。
要点二
Gurobi
主要采用高级优化算法,如分支定界法、动态规划等。
LINGO与Gurobi的比较
LINGO
支持各种类型的约束条件,包括整数约束、非线性约束 等。
Gurobi
特别擅长处理大规模、非线性问题,但对线性问题的处 理能力稍弱。
LINGO
界面简洁,建模语言直观,易于学习和掌握。
Excel
需要结合多个函数和工具进行建模,对于复杂问题操作相对繁琐。
LINGO与Excel的比较
LINGO
针对优化问题进行了优化,求解速度 较快,精度较高。
Excel
求解速度较慢,对于大规模问题可能 无法得到满意的结果。
LINGO与Gurobi的比较
LINGO软件特点
高效求解
LINGO采用先进的求解算法,能够快速求解大规 模线性规划问题。
灵活建模
LINGO支持多种建模语言,用户可以根据需要选 择合适的语言进行建模。
图形界面
LINGO提供直观的图形界面,方便用户进行模型 设计和结果查看。
LINGO软件应用领域
生产计划
LINGO可用于制定生产计划,优化资源配置, 提高生产效率。
金融投资
LINGO可以用于金融投资组合优化,帮助投 资者实现风险和收益的平衡。
物流优化
LINGO可以帮助企业优化物流配送路线,降 低运输成本。
资源分配
LINGO可用于资源分配问题,如人员、设备、 资金的分配,以达到最优效果。
2023
PART 02
线性规划基本概念
REPORTING
线性规划定义
线性规划是数学优化技术的一种,它通过将问 题抽象为数学模型,利用数学方法来寻找最优 解。

用lingo求解规划问题实例

用lingo求解规划问题实例

用lingo求解规划问题实例用Lingo求解规划问题实例问题一:某公司打算向它的3个营业区增设6个销售店,每个营业区至少增设一个。

从各区赚取的利润与增设的销售店个数有关,其数据如下表所示。

试求各区应分配几个增设的销售店,才能使总利润最大。

销售点增加数 0 1 2 3 4A区利润/万元 100 200 280 330 340B区利润/万元 200 210 220 225 230C区利润/万元 150 160 170 180 200分析:要设置集合zone/A,B,C/,表示三个地区。

因为获得的利润与地区和各地的销售点增加数均相关,所以可以仿照运输模型,用number/1..4/表示每个地区可选的销售点增加数,1,在i地区新增j个销售点,然后用一个派生集links(zone,number):c,profit,定义 c,,ij0,其他,profit(i,j)为在i地区新增j个销售点能获得的利润。

可写出约束条件为:4, c,1i,1,2,3,ijj,1c,0或1 ij34cj,6 ,,ijij,,11所求函数为max=@sum(links:c*profit);Lingo程序如下:model:sets:zone/A,B,C/; !A,B,C三个地区;number/1..4/; !各地区可选择新建的销售点数目,可选1~4中的一个数,通过links把zone和number联系起来;links(zone,number):c,profit; !若在i地区新建j个销售点,则c(i,j)=1,否则c(i,j)=0.profit(i,j)表示在i地区新建j个销售点的利润; endsets data:profit=200 280 330 340210 220 225 230160 170 180 200;enddatamax=@sum(links:c*profit);@for(zone(I):@sum(number(J):c(I,J))=1); !对于每一个地区,新建销售点的数目是一定的,c的和为1;@sum(zone(I):@sum(number(J):c(I,J)*J))=6; !三个地区新建的销售点总数为6;@for(links(i,j):@bin(c(i,j))); !每一个c(i,j)只能取0或1;end用Lingo求解,结果如下:Global optimal solution found.Objective value: 710.0000Extended solver steps: 0Total solver iterations: 0Variable Value Reduced CostC( A, 1) 0.000000 -200.0000C( A, 2) 0.000000 -280.0000C( A, 3) 1.000000 -330.0000C( A, 4) 0.000000 -340.0000C( B, 1) 1.000000 -210.0000C( B, 2) 0.000000 -220.0000C( B, 3) 0.000000 -225.0000C( B, 4) 0.000000 -230.0000C( C, 1) 0.000000 -160.0000C( C, 2) 1.000000 -170.0000C( C, 3) 0.000000 -180.0000C( C, 4) 0.000000 -200.0000 则在A,B,C区域应分别新增3,1,2个销售点,可获得的最大利润为710万元。

LINGO模型实例及求解

LINGO模型实例及求解

j 1
6
cij e j , j 1,2
i 1
决策变量: ci j,(xj,yj)~16维
非线性规划模型
LINGO模型的构成:4个段
集合段(SETS ENDSETS)
数据段(DATA ENDDATA)
LP:移到数据段
初始段(INIT ENDINIT) 目标与 约束段
局部最优:89.8835(吨公里 )
0.000000
R32 1.000000
0.000000
R33 0.000000
0.000000
R41 0.000000
0.000000
R42 0.000000
0.000000
R43 2.000000
0.000000
模式1:每根原料钢管切割成3 根4米和1根6米钢管,共10根;
模式2:每根原料钢管切割成2 根4米、1根5米和1根6米钢管, 共10根;
模式3:每根原料钢管切割成2 根8米钢管,共8根。 原料钢管总根数为28根。
背包问题
某人打算外出旅游并登山,路程比较远,途中要 坐火车和飞机,考虑要带许多必要的旅游和生活用 品,例如照相机、摄像机、食品、衣服、雨具、书 籍等等,共n件物品,重量分别为ai,而受航空行 李重量限制,以及个人体力所限,能带的行李总重 量为b,n件物品的总重量超过了b,需要裁减,该 旅行者为了决策带哪些物品,对这些物品的重要性 进行了量化,用ci表示,试建立该问题的数学模 型.这个问题称为背包问题(Knapsack Problem).
钢管下料
切割模式
按照客户需要在一根原料钢管上安排切割的一种组合。
4米1根 6米1根
8米1根
余料1米
4米1根 6米1根
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

lingo 大规模规划求解首先,让我们先看看一个非常简单的规划例子在LINGO软件中实现过程:目标函数:约束条件:求解上面目标函数的最小值,我们在lingo中可编写如下代码:model:MIN=2*X1+X2-3*X3+5;X1+X2-3*X3<=10;X1-2*X2>=5@GIN(X1);!整数约束;@GIN(X2);@GIN(X3);END可以看出,LINGO语言和数学专业语言很接近,很容易表示约束条件和目标函数。

可是对于规模很大的约束条件,难道我们也必须这样一条一条的输入吗,显然这样做是一件非常困难和繁琐的事,lingo语言又是如何表示约束条件规模巨大的规划问题呢,带着这样的疑问,让我们一步一步得看下面的内容:一、集合域在数学中集合的定义如下:集合:具有某种相同属性的对象放在一起,就形成了一个集合,集合中的每一个对象称作该集合的元素。

在大规模的优化问题中,集合是必然存在的,比如在平板车建模中,各种规格集装箱就可以看成一个集合,在货物配送问题中154个城市可以看成一个集合。

在lingo语言中,将某些对象看成一个集合便可以很方便地对集合中的每一个元素进行统一处理。

集合域必须在模型的约束引用集合之前定义。

集合域用关键字“sets”开始,“endsets”结束。

集合分类:基本集合定义统一语法格式:setname[/member-list/][:attribute-list];集合名/对象名1 对象名2 … 对象名n/:对象属性;集合定义的几种方法:setsrow/1..20/:d1,d2,…dn; !集合名/对象名/:对象属性;end sets派生集合定义方法:setsrow/1..20/;col/1..100/;page/1..50/;link(row.col):k1,k2…kn;trd/(row.col.page):t1,t2,…tn;end setsK1可以表示某个省的某个城市的人口。

t1可以表示某个省的某个城市某个人的收入。

二、数据域:数据域是优化问题中已知得对象的属性值,例如:人的身高,体重;车辆的载重,行驶速度。

数据域以关键字“data”开头,“enddata”结束。

数据域可以出现在模型中的任何地方。

data:d1=…;k1=…;t1=…;enddata数据域的未知数值有时只想为一个集的部分成员的某个属性指定值,而让其余成员的该属性保持未知,以便让LINGO去求出它们的最优值。

在数据声明中输入两个相连的逗号表示该位置对应的集成员的属性值未知。

两个逗号间可以有空格。

例3.8sets:years/1..5/: capacity;endsetsdata:capacity = ,34,20,,;enddata属性capacity的第2个和第3个值分别为34和20,其余的未知。

实时数据处理在某些情况,对于模型中的某些数据并不是定值。

譬如模型中有一个通货膨胀率的参数,我们想在2%至6%范围内,对不同的值求解模型,来观察模型的结果对通货膨胀的依赖有多么敏感。

我们把这种情况称为实时数据处理(what if analysis)。

LINGO有一个特征可方便地做到这件事。

在本该放数的地方输入一个问号(?)。

data:interest_rate,inflation_rate = .085 ?;enddata每一次求解模型时,LINGO都会提示为参数inflation_rate输入一个值。

在WINDOWS操作系统下,将会接收到一个类似下面的对话框:直接输入一个值再点击OK按钮,LINGO就会把输入的值指定给inflation_rate,然后继续求解模型。

除了参数之外,也可以实时输入集的属性值,但不允许实时输入集成员名。

三、初始域初始域是专门为初始化决策变量而定义的一块区域。

初始部分是LINGO提供的另一个可选部分。

在初始部分中,可以输入初始声明(initialization statement),和数据部分中的数据声明相同。

对实际问题的建模时,初始部分并不起到描述模型的作用,在初始部分输入的值仅被LINGO求解器当作初始点来用,并且仅仅对非线性模型有用。

和数据部分指定变量的值不同,LINGO求解器可以自由改变初始部分初始化的变量的值。

一个初始部分以“init:”开始,以“endinit”结束。

初始部分的初始声明规则和数据部分的数据声明规则相同。

也就是说,我们可以在声明的左边同时初始化多个集属性,可以把集属性初始化为一个值,可以用问号实现实时数据处理,还可以用逗号指定未知数值。

init:X, Y = 0, .1;endinitY=@log(X);X^2+Y^2<=1;好的初始点会减少模型的求解时间。

四、集合循环函数统一语法格式:@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上的表达式的和。

对应数学表达式与LINGO命令:数学表达式lingo命令(一维数组和)@sum(row(i):x(i));(二维维数组和)@sum(links(i,j):x(i,j));(矩阵点乘和)@sum(links(i,j):x(i,j)*Y(i,j)); (求数组的积)@prod(row(i):x(i));(比较m个一维数组的和)@for(col(j):@sum(row(i):x(i))<=@sum(row(i):y(i)));五、变量定界函数变量定界函数对变量的取值范围附加限制,共有以下四种函数:@BND(L,X,U):限制L〈=X〈=U。

注意LINGO中命令SLB,SUB类似函数@SLB和@SUM.@BIN(X):即限制X为0或1。

注意LINGO中这个函数的名字却不是@INT(X). @FREE(X):取消对X的符号限制(即可取负数、0后正数)。

@GIN(X):限制X为整数。

数学表达式LINGO命令@for(row(i):@bnd(0,x(i),20));@for(row(i):@BIN(x(i)));@for(row(i):@FREE(x(i)));@for(row(i):@gin(x(i)));六、条件控制器用于集合循环函数中,循环变量的范围控制。

有两类控制方法:1是直接控制集合中对象的范围,2是通过控制对象属性值的范围来间接控制对象的范围。

数学表达式lingo命令(i=1,2,…,n-3)@sum(row(i)|i#LE#n-3:x(i));(j>=5)@sum(links(i,j)|j#GE#5:x(i,j));(@sum(links(i,j)|x(i,j)#NE#0:x(i,j)*Y(i,j));@prod(row(i)|x(i)#NE#0:x(i));七、基本的数学函数在LINGO中建立优化模型时引用大量的内部函数这些函数以"@"、。

号打头.LINGO中包括相当丰富的数学函数,这些函数的用法非常简单,我们直接在下一一列出@ABS(X);绝对值函数,返回X的绝对值@COS(X);余弦函数,返回X 的余弦值(X 的单位是弧度)@EXP(X)指数函数,返回x e的值(其中 e为自然对数值的底,即2.718281…) @FLOOR(X);取整函数,返回X的整数部分(向最靠近0的方向取整).@LGM(X):返回X的伽马(Gamma)函数的自然对数值(当X为整数时LGM(X)=LOG(X-1)!;当X不为整数时,采用线性插值得到结果)@LOG(X):自然对数函数,返回自然对数值@MOD(X,Y): 模函数,返回X对Y 的取模的结果,即X 除以Y的余数,这里X余Y 应是整数@POW(X,Y):指数函数,返回yX的值.@SIGN(X):符号函数,返回X 的符号值(X<0是返回-1,X>=0时返回+1)@SIN(X):正弦函数,返回X 的正弦值(X 的单位是弧度) 95@SMAX(list)::最大值函数,返回一列数(list)的:最大值@SMIN.(list)::最小值函数,返回一列数(list)的:最小值@SQR(X) :平方函数,返回X 的平方即(X*X)的值@SQRT(X):平方根函数,返回X 的平方根的值@TAN(X);正切函数,返回X的正切值(X的单位是弧度)。

八、lingo中其他常用命令@WRAP(I,N)当I为于区间[I,N]内时直接返回I;一般地,返回J=I-K*N,其中J位于区间[1,N],K为函数。

可见这个函数相当于数学上用I 对N取模函数的值+1,即@WRAP(I,N)=@MOD(I,N)+1.此函数对N〈1无定义。

@SIZE(set_name)返回数据集set_name中包含元素的个数。

@IF (logical _condition, true _result, false _result)当逻辑表达式logical _condition的结果为真时,返回true _result,否则返回false _result。

例如@if(x # LT # 100,20,15)语句,当X〈100时,返回20,否则返回15。

@WARN (…text‟, logical _condition)如果逻辑表达式“logical _condition”的结果为真,显示 'text'信息.@USER (user _determined _arguments)该函数是允许用户自己编写的函数( dl或0bj文件),该用户函数可能当用C或FORTRAN等其他语言编写并编译,返回值为用户函数计算的结果.从编程角度来看,@USER 函数包含两个参数:第一个用于指定参数个数,第二个用于指定参数向量:而在LINGO中调用·USER时则直接指定对应的参数“user _determined_”(类似于C语言中的main ( argc , argv ) 的编程和运行方式).更多细节请参考LINGO使用手册.九、文件读写1. 复制和粘贴功能对于数据量不是很大的集合而言,复制粘贴是最快捷最简单的方法,和其他软件操作一样,LINGO软件,支持从网页,文本文档,电子表格中复制数据。

相关文档
最新文档