LINGO在图论讲义中的应用
@for(roads(i,j): P(i,j)=@if(FL(i) #eq# W(i,j)+FL(j),1,0));
end
部分计算结果: FL(A) 6 FL(B) 4 FL(C) 3 FL(D) 1 FL(E) 3 FL(F) 4 FL(G) 0 最短路线为 A B D G 以上计算程序是通用程序,对其它图,只需在 此程序基础上对数据作一些修改即可。
N是终点,1是起点, j是与i相联,上一步考察过, 且与终点相通、f(j)为已知的点。
编写LINGO程序如下: model: sets: cities/A,B,C,D,E,F,G/: FL; !定义7个城市; roads(cities,cities)/
A,B A,C B,D B,E B,F C,D C,E C,F D,G E,G F,G/: W, P; !定义哪些城市之间有路相联,W为里程,P用 来存放最短路的路径; endsets
2.0-1规划法
用0-1规划法也能求解最短路问题,其思路如 下.
设起点为1,终点为n.引入0-1型决策变量Xij, 如果弧(i , j)在最短路上,则Xij=1,否则Xij=0.
对于除了起点1和终点n以外的任意一个顶点i,
如果,
说明从i出发的所有弧中必然有一条弧
n
在最短路X 上ij 1,也就是说最短路经过该顶点,此时
可以用动态规划的方法来求最短路问题,下面 举例说明其算法原理。
2.算法原理
举例:
3
D
1
2
B
3ห้องสมุดไป่ตู้
A
1
E
G
2
3
4
C3
4
1
F
图中A,B,...,G表示7个城市,连线表示城市之间 有道路相通,连线旁的数字表示道路的长度Wij, 现要从城市A到G找出一条最短路线。
该问题有三个阶段,第一阶段从A到B或C,第 二阶段到D,E或F,第三阶段到终点G,我们从终 点向前倒过来找。
精品
LINGO在图论中的应用
图是一种直观形象地描述已知信息的方 式,它使事物之间的关系简洁明了,是分 析问题的有用工具,很多实际问题可以用 图来描述。
一、图的基本概念
图论是以图为研究对象的数学分支,在图论 中,图由一些点和点之间的连线所组成.
称图中的点为顶点(节点),称连接顶点的 没有方向的线段为边,称有方向的线段为弧.所 有线段都没有方向的图称为无向图,所有线段都 有方向的图称为有向图,既有边也有弧的图称为 混合图.
j1
所有从其它顶点到达该顶点的弧中必然也有一条
弧在最短路上,因而必有:
n
X ji 1
无圈的连通图称为树,如果一棵树T包含了图G 的所有顶点,称T为G的生成树.
如果图G的每条边e都对应一个实数C(e),称C(e) 为该边e的权,称图G为赋权图.通常称赋权的有 向图为网络.
二、最短路问题
1.动态规划法
(1)问题的描述
给定N个点Pi(i=1,2,...,n)组成集合{Pi},集合中任 一点Pi到另一点Pj的距离用Wij表示,如果Pi到Pj没 有 弧 联 结 ( 无 通 路 ) , 则 规 定 Wij=+∞ , 又 规 定 , Wii=0 (i=1,2,...,n),指定一个终点PN,要求从Pi点出 发到PN的最短路线。
第 三 阶 段 , 从 D,E,F 到 G 的 最 短 路 分 别 为 1,3,4 , 记 为 f(D)=1,f(E)=3,f(F)=4;
第二阶段,与D,E,F有连线的出发点为B和C,从B出发 分别经过D,E,F,至终点G的里程分别为:
WBD+ f(D)=3+1=4
WBE+ f(E)=3+3=6
WBF+ f(F)=1+4=5 故B到G的最短路是上述三者的最小值(4),可以写成
data: W=2 4 3 3 1 2 3 1 1 3 4;
enddata N=@SIZE(CITIES); FL(N)=0; !终点的F值为0; @for(cities(i) | i #lt# N: FL(i)=@min(roads(i,j):W(i,j)+FL(j)));
!递推计算各城市F值; !显然,如果P(i,j)=1,则点i到点n的最短路径的第
WAB+ f(B)=2+4=6 WAC+ f(C)=4+3=7 故A到G的最短路是上述两者的最小值6,可以 写成f(A)=min{WAj+f(j)}=6,j是上一步考察过的两 个点B,C,现在已经到了起点,结束运算,从A到 G的最短路为6。 上述算法可以简写成
f(i)m j {W iinjf(j),}iN1, ,2,1 f(N )0
点与边相连接称为关联,与边e关联的顶点称 为该边的端点,与同一条边关联的两个顶点称为 相邻顶点,与同一个顶点关联的边称为相邻边.
具有相同顶点的边称为平行边,两个端点重合 的边称为环.在无向图中,没有环和平行边的图 称为简单图,任意一对顶点都有一条边相连的简 单图称为完全图.任意两个顶点之间有且只有一 条弧相连的有向图称为竞赛图.
程序中的语句roads(cities,cities)/ A,B A,C B,D B,E B,F C,D C,E C,F D,G E,G F,G/: W, P; 定义 的集合称为稀疏集合,本例中cities有7个成员,但 是并非每个城市到其它6个城市都有路相通,只有 部分城市之间有路,故定义衍生集合roads时用列 举法列出有路相通的每对城市 。
在图中,两个顶点u和v之间由顶点和边构成的 交错序列(使u和v相通)称为链(通道),没有 重复边的通道称为迹,起点与终点重合的通道称 为闭通道,不重合的称为开通道,没有重复顶点 (必然边也不重复)的开通道称为路,起点与终 点重合的路称为圈(回路).如果顶点u和v之间 存在通道,称u和v是连通的,任意两个顶点都连 通的图称为连通图.
f(B)=min{WBj+f(j)}=4,j是上一步考察过的三个点D,E,F; 同理f(C)=min{WCj+f(j)},而
WCD+ f(D)=2+1=3
WCE+ f(E)=3+3=6
故F(C)=3;
WCF+ f(F)=1+4=5
第一阶段,出发点只有一个A,从A出发分别经 过B,C,至终点G的里程分别为:
LINGO在数学建模中的应用
一、LINGO简介LINGO[1]是美国LINDO系统公司开发的求解数学规划系列软件中你的一个,它的主要功能是求解大型线性、非线性和整数规划问题,LINGO的不同版本对模型的变量总数、非线性变量数目、整型变量数目和约束条件的数量做出不同的限制.LINGO的主要功能特色为:(1)既能求解线性规划问题,也有较强的求解非线性规划问题的能力;(2)输入模型简练直观;(3)运行速度快、计算能力强.(4)内置建模语言,提供几十个内部函数,从而能以较少语句,较直观的方式描述较大规模的优化模型;(5)将集合的概念引入编程语言,很容易将实际问题转换为LINGO模型;(6)能方便地与EXCEL、数据库等其他软件交换数据.LINGO像其他软件一样,对他的语法有规定,LINGO的语法规定如下:(1)求目标函数的最大值或最小值分别用MAX=…或MIN=…来表示;(2) 每个语句必须以字母开头,由字母、数字和下划线所组成,昌都不超过32个字符,不区分大小写;(3)每个语句必须以分号“;”结束,每行可以有多个语句,语句可以跨行;(4)如果对变量的取值范围没有特殊说明,则默认所有决策变量都非负;(5)LINGO模型以语句“MODEL”开头,以语句“END”结束,对于比较简单的模型,这这两个语句可以省略.LINGO提供了五十几个内部函数,使用这些函数可以大大减少编程工作量,这些函数都是以字符@开头,下面简单介绍其中的集合操作函数和变量定界函数及用法.集合是LINGO建模语言中最重要的概念,使用集合操作函数能够实现强大的功能,LINGO提供的常用集合操作函数有@FOR(s:e)、@SUM(s:e)、@MAX(s:e)、@MIN(s:e)等.@FOR(s:e)常用在约束条件中,表示对集合s中的每个成员都生成一个约束条件表达式,表达式的具体形式由参数e描述;@SUM(s:e) 表示对集合s中的每个成员,分别得到表达式e的值,然后返回所有这些值的和;@MAX(s:e) 表示对集合s中的每个成员,分别得到表达式e的值,然后返回所有这些值中的最大值;@MIN(s:e) 表示对集合s中的每个成员,分别得到表达式e的值,然后返回所有这些值中的最小值.LINGO默认变量的取值可以从零到正无穷大,变量定界函数可以改变默认状态,如对整数规划,限定变量取整数,对0-1规划,限定变量取0 1或.LINGO提供的变量定界函数有:@BIN(X)、@BND(L,X,U)、@GIN(X)、@FREE(X).@BIN(X)限定X为0或1,在0-1规划中特别有用;@GIN(X)限定X为整数,在整数规划中特别有用;@BND(L,X,U)限定L<X<U,可用作约束条件;@FREE(X)取消对X的限定,即X可以取任意实数.二、LINGO 在线性规划中的应用具有下列三个特征的问题称为线性规划问题(Linear program)[2]简称LP 问题,其数学模型称为线性规划(LP)模型.线性规划问题数学模型的一般形式为:求一组变量(1,2,,)j x j n =的值,使其满足1122max(min),n n z c x c x c x =+++2111122111211222221122***.0,1,2,,,,..n j n n n n nn nn n n x j na x a x a xb a x a x a x b s t a x a x a x b ⎧⎪⎪⎪⎨⎪⎪≥=⎪⎩+++++++++ 式中“*”代表“≥”、“ ≥”或“=”.上述模型可简写为1max(min),nj j j z c x ==∑1*0,1,2,,,1,2,,..nij j j ji a x x j n b i ms t =⎧⎪⎨⎪≥=⎩=∑其中,变量j x 称为决策变量,函数1nj jj z c x==∑称为目标函数,条件1*nj jij c x b =∑称为约束条件,0j x ≥ 称为非负约束.在经济问题中,又称j c 为价值系数,i b 为资源限量. 线性规划在科学决策与经营管理中实效明显[3],但是对于规模较大的线性模型,其求解过程非常繁琐,不易得出结果.而 LINGO 中的内部集合函数有@FOR(s:e)、@SUM(s:e)、@MAX(s:e)、@MIN(s:e)等,可以用这些集合函数使程序编程简单可行,下面举例说明.例1 某工厂有两条生产线,分别用来生产M 和P 两种型号的产品,利润分别为200元每个和300元每个,生产线的最大生产能力分别为每日100和120,生产线没生产一个M 产品需要1个劳动日(1个工人工作8小时称为1个劳动日)进行调试、检测等工作,而每个P 产品需要2个劳动日,该工厂每天共计能提供160个劳动日,假如原材料等其他条件不受限制,问应如何安排生产计划,才能使获得的利润最大?解 设两种产品的生产量分别为1x 和2x ,则该问题的数学模型为:目标函数 12max 200300z x x =+约束条件1212100,120,160,0,1,2.i x x x x x i ≤⎧⎪≤⎪⎨+≤⎪⎪≥=⎩ 编写LINGO 程序如下: MODEL : SETS :SHC/1,2 /:A,B,C,X; YF/1,2,3 /:J; ENDSETS DATA :A=1,2 ; B=100,120; C=200,300; ENDDATAMAX=@SUM(SHC:C*X);@FOR(SHC(I):X(I)<B(I)); @SUM(SHC(I):A(I)*X(I))<=160; END程序运行结果如下Global optimal solution found.Objective value: 29000.00 Total solver iterations: 0 Variable Value Reduced CostA( 1) 1.000000 0.000000A( 2) 2.000000 0.000000B( 1) 100.0000 0.000000B( 2) 120.0000 0.000000C( 1) 200.0000 0.000000C( 2) 300.0000 0.000000X( 1) 100.0000 0.000000X( 2) 30.00000 0.000000J( 1) 0.000000 0.000000J( 2) 0.000000 0.000000J( 3) 0.000000 0.000000Row Slack or Surplus Dual Price 1 29000.00 1.000000 2 0.000000 50.00000 3 90.00000 0.000000 4 0.000000 150.0000最优解为12100,30,x x ==最优值为29000.00z =.即每天生产100个M 产品30个P 产品,可获得29000元利润.三、LINGO 在整数规划和0-1规划中的应用1 求解整数规划整数规划[4]分为整数规划和混合整数规划,要求全部变量都为非负整数的数学规划称为纯整数规划,只要求部分变量为非负整数的数学规划称为混合整数规划.下面只讨论约束条件和目标函数均为线性的整数规划问题,即整数线性规划问题(以下简称整数规划,记为ILP),其数学模型的一般形式是()1max min nj j j z c x ==∑,()()11,2,,..01,2,,ni j j i j j j a x b i n s t x j n x =⎧≤=⎪⎪⎪≥=⎨⎪⎪⎪⎩∑全为整数或部分为整数。
LIN讲义GO在图论中的应用
具有相同顶点的边称为平行边,两个端点重合 的边称为环.在无向图中,没有环和平行边的图 称为简单图,任意一对顶点都有一条边相连的简 单图称为完全图.任意两个顶点之间有且只有一 条弧相连的有向图称为竞赛图.
在图中,两个顶点u和v之间由顶点和边构成的 交错序列(使u和v相通)称为链(通道),没有 重复边的通道称为迹,起点与终点重合的通道称 为闭通道,不重合的称为开通道,没有重复顶点 (必然边也不重复)的开通道称为路,起点与终 点重合的路称为圈(回路).如果顶点u和v之间 存在通道,称u和v是连通的,任意两个顶点都连 通的图称为连通图.
一步是i --> j,否则就不是。由此,我们就可方便的确 定出最短路径;
@for(roads(i,j): P(i,j)=@if(FL(i) #eq# W(i,j)+FL(j),1,0));
end
部分计算结果: FL(A) 6 FL(B) 4 FL(C) 3 FL(D) 1 FL(E) 3 FL(F) 4 FL(G) 0 最短路线为 A B D G 以上计算程序是通用程序,对其它图,只需在 此程序基础上对数据作一些修改即可。
j1
所有从其它顶点到达该顶点的弧中必然也有一条
弧在最短路上,因而必有:
n
X ji 1
2.0-1规划法
用0-1规划法也能求解最短路问题,其思路如 下.
设起点为1,终点为n.引入0-1型决策变量Xij, 如果弧(i , j)在最短路上,则Xij=1,否则Xij=0.
对于除了起点1和终点n以外的任意一个顶点i,
如果,
说明从i出发的所有弧中必然有一条弧
数学建模必备知识——lingo处理实例(多目标问题)
一个简单的LINGO程序
LINGO的基本用法的几点注意事项
•LINGO中不区分大小写字母;变量和行名可以超过8个字符,但 不能超过32个字符,且必须以字母开头。 •用LINGO解优化模型时已假定所有变量非负(除非用限定变量取 值范围的函数@free或@BND另行说明)。 •变量可以放在约束条件的右端(同时数字也可放在约束条件的左 端)。但为了提高LINGO求解时的效率,应尽可能采用线性表达 式定义目标和约束(如果可能的话)。 •语句是组成LINGO模型的基本单位,每个语句都以分号结尾,编 写程序时应注意模型的可读性。例如:一行只写一个语句,按照 语句之间的嵌套关系对语句安排适当的缩进,增强层次感。 •以感叹号开始的是说明语句(说明语句也需要以分号结束))。
LINGO中定义集合及其属性
LP模型在LINGO中的一个典型输入方式
以“MODEL:”开 始
集合定义部分从 (“SETS:”到 “ENDSETS” ): 定义集合及其属性 给出优化目标 和约束 集合定义部分从 (“DATA:”到 “ENDDATA” )
以“END”结 束
目标函数的定义方式 @SUM(集合(下标):关于集合的属性的表达式) 对语句中冒号“:”后面的表达式,按照“:”前 面的集合指定的下标(元素)进行求和。 本例中目标函数也可以等价地写成
LINGO软件的基本使用方法
内容提要
1. LINGO入门 2.在LINGO中使用集合
3. 运算符和函数
4. LINGO的主要菜单命令 5. LINGO命令窗口
6.习题
1. LINGO入门 2.在LINGO中使用集合
3. 运算符和函数
1. LINGO入门 4. LINGO的主要菜单命令 5. LINGO命令窗口
运筹学的应用简介及实例(lindo,lingo,ahp)[大全五篇]
运筹学的应用简介及实例(lindo,lingo,ahp)[大全五篇]第一篇:运筹学的应用简介及实例(lindo,lingo,ahp)运筹学的应用简介及实例(lindo,lingo,ahp)一.运筹学可以用于物流中心选址:配送中心合理选址的目的是为了提高物流企业的服务质量,最大限度地增加物流企业的经济效益。
科学合理的选址不仅能够减少货物运输费用,大幅度地降低运营成本,而且能为客户带来方便快捷的服务。
二.运筹学可以用于路线选择:利用运筹学中的图论和线性规划方法,对已有的空运、水运、公路运输、管道运输、铁路运输组成的交通网,根据不同的决策目标制定不同的调运方案,可以是最短时间的运输路线、最少费用的运输路线或是最大运输量最低运费的运输线路等,从而达到降低物流成本的目的。
三.运筹学中排队论在物流中应用:排队论主要研究具有随机性的拥挤现象,在物流中有许多问题涉及,诸如机场跑道设计和机场设施数量问题, 如何才能既保证飞机起降的使用要求, 又不浪费机场资源又如码头的泊位设计和装卸设备的购置问题, 如何达到既能满足船舶到港的装卸要求, 而又不浪费港口资源等等。
四.运筹学中库存论在物流中应用:库存论主要是研究物资库存策略的理论, 即确定物资库存量、补货频率和一次补货量。
合理的库存是生产和生活顺利进行的必要保障, 可以减少资金的占用, 减少费用支出和不必要的周转环节, 缩短物资流通周期, 加速再生产的过程等。
在物流领域中的各节点如工厂、港口、配送中心、物流中心、仓库、零售店等都或多或少地保有库存。
五.运筹学中对策论在物流中应用:对策论研究有利害冲突的双方在竞争性的活动中是否存在自己制胜对方的最优策略, 以及如何找出这些策略等问题。
在这些问题中, 把双方的损耗用数量来描述, 并找出双方最优策略。
对策论的发展, 考虑有多方参加的竞争活动, 在这些活动中, 竞争策略要通过参加者多次的决策才能确定。
参考文献:[1] 左元斌.运筹学在物流配送中心的应用研究[J].商场现代化,2006(458):125-127.[2] 李宇鸣.浅谈运筹学在物流管理中应用与发展[J].吉林工商学报,2007(4):55-56.[3] 田进波.运筹学在管理物流管理中的应用[J].石油工程建设,2010(36):153-155.LINDO求解目标规划:题目:一个小型的无线电广播台考虑如何最好地来安排音乐、新闻和商业节目时间。
lingo-TSP问题
LINGO 课程试验专题——TSP前言:TSP 问题,即巡回旅行商问题,也称为货担郎问题,早期是1759年Euler 提出的骑士旅行问题。
1948年,有美国兰德公司推动,成为近代组合优化问题中的一个典型难题,它被证明为是NP 难题。
图论描述就是给定一个有向或者是无向的图,并给定他们各边的权值,找一个Hamilton 圈使得总权最小。
例:设有一个销售员从10个城市中的某一个城市出发,去其他的9个城市推销产品。
10个城市相互距离如下表所示。
要求每个城市到达且仅到达一次,回到方法一:设城市之间的距离用矩阵d 来表示,其中d 为下三角矩阵,ij d 表示城市i 与城市j 之间的距离。
设0-1矩阵x 用来表示经过的各城市之间的路线。
设01ij i j x i j⎧=⎨⎩若城市不到城市若城市到城市则建立该TSP 问题的模型如下:()121121min ..22,3,4,...,01n i ij iji j j j ik ji k ij i ijz x d x s t x x i n x -===><>=⎧⎪⎪+==⎨⎪⎪=⎩∑∑∑∑∑或 它的主要思想就是与第一个城市相连的有两个城市,与第i 个城市相连的有两个城市,每个城市都有相连的两个城市,这个自然就够成一个Hamilton 圈,但是不保证有多个圈的情况。
LINGO 具体程序如下:model:sets:city/1..10/;link(city,city)|&1#GT#&2:d,x;endsetsdata:d=74 35 10 58 9 9 146 14 10 9 712 5 21 10 8 1313 14 8 9 7 5 2311 17 27 23 20 25 21 1818 17 12 16 19 13 18 12 16;enddatamin=@sum(link:d*x);@sum(city(j)|j#GT#1:x(j,1))=2;@for(city(i)|i#GT#1:@sum(city(j)|j#GT#i:x(j,i))+@sum(city(k)|k#LT#i:x(i,k))=2);@for(link:@bin(x));得到的结果:Global optimal solution found.Objective value: 77.00000Objective bound: 77.00000Infeasibilities: 0.000000 Extended solver steps: 0Total solver iterations: 12结果分析:从这个结果我们可以看出,该TSP 问题的最短距离是77km ,其最短路线为:143275681091→→→→→→→→→→。
利用LinGo求解几种有向图最短路问题
(Fujian Communication Technology College Basic Courses Department, Fuzhou Fujian 350007)
Abstract: In this paper, there are several shortest paths to the weighted graph using Lingo software path length and the solution, and analyzed with a simple solution Lingo place and how to empower a directed graph of the negative rights. Provides a good way to solve this kind of this problem.
CAI Ze- huan,LI Xiang- fu
(Xiangfan Vocational and Technical College, Xiangfan Hubei 441050, China)
Abstract: This paper presents methods to achieve training standards for the effective connection with the needs of employers from five aspects, which is on the basis of vocational education in the training standards and the employer needs the existence of dislocation.
路的优点在于,程序书写简单易懂,容易掌握,答案 直观明了,比传统解题节约不少时间。Lingo不仅仅 在线性规划解题方面有其独特的优越性,在图论解 题中也有其可取之处,简便易懂的程序取得意想不 到的效果。
4.3 图论中最优树问题的Lingo求解
图论中最优树问题的Lingo求解树连通且不含圈的无向图称为树.常用T表示。
树中的边称为树枝,树中度为1的顶点称为树叶图1 树的示例在许多实际问题中,如在许多城市间建立公路网、输电网或通信网络,都可以归结为赋权图的最优树问题。
如在一个城市中,对若干个居民点要供应自来水,已经预算出连接各点间管道的造价,要求给出一个总造价最小的铺设方案。
图论中最优树的的求解通常有两种算法:Kruskal算法(或避圈法)和Prim算法(破圈法). 这里我们给出利用LINGO求解最优树的方法。
总线性规划模型为:问题1 某有10个城镇见下图,它们之间的距离见表1。
城镇1处有一条河流,现需要从各城镇之间铺设管道,使城镇1处的水可以输送到各城镇,求铺设管道最少的设计方式。
表1 10个地区之间的距离(单位:公里)地区12345678910 10859121412161722 28091516811181422 359079117121217 4915703171071515 5121693081061515 6148111780914816 7121171010908611 81618127614801111 917141225158611010 102222171515161111100该问题实际上是求从点1出发的最优树问题。
Lingo实现程序为:! 最优树的Lingo程序; model:sets:point/1..10/:u;link(point,point):d,x; endsetsdata:d=0,8,5,9,12,14,12,16,17,22, 8,0,9,15,16,8,11,18,14,22, 5,9,0,7,9,11,7,12,12,17, 9,15,7,0,3,17,10,7,15,15,12,16,9,3,0,8,10,6,15,15,14,8,11,17,8,0,9,14,8,16,12,11,7,10,10,9,0,8,6,11,16,18,12,7,6,14,8,0,11,11,17,14,12,25,15,8,6,11,0,10,22,22,17,15,15,16,11,11,10,0; @text()=@writefor(link(i,j)|x(i,j) #GT#0:'x(',i,',',j,')=',x(i,j),' ');enddatamin=@sum(link(i,j)|i#ne#j:d(i,j)*x(i,j));n=@size(point);@sum(point(j)|j#gt#1:x(1,j))>=1;@for(point(i)|i#ne#1:@sum(point(j)|j#ne#i:x(j,i))=1); @for(link(i,j):@bin(x(i,j)));@for(link(i,j)|i#ne#j:u(i)-u(j)+n*x(i,j)<=n-1); !不构成圈;end结果为minZ=60x(1,2)=1 x(1,3)=1 x(3,4)=1 x(4,5)=1x(9,6)=1 x(3,7)=1 x(7,9)=1 x(5,8)=1x(9,10)=1故最优树(最佳铺设管道方式)见图.谢谢!。
Lingo的典型应用举例
假设预先准备的箱子总数为n个,即使每件物品单 独装一个箱子也够用,用决策变量yi=1或0表示第j个箱 子是用还是不用,用变量xij=1或0表示第i件物品是否放 入第j个箱子中,建立0-1规划模型如下:
n
min
z y j,
j1
n
w i x ij Cy
j , j 1,2 ,...,
n,
i1
s
表2.1 当前可供蔬菜养分含量(mg)和价格
养分
蔬菜
铁
A1 青 豆 0.45
A2 胡萝卜 0.45
A3 花 菜 0.65
A4 卷心菜 0.4
A5 芹 菜 0.5
A6 土 豆 0.5
每周最低需求 6
每份蔬菜所含养分数量
每份价格
磷 维生素A 维生素C 烟酸 (元)
20
415
22
0.3
2.1
28
4065
例2.1 某疗养院营养师要为某类病人拟定本周蔬菜类菜单, 当前可供选择的蔬菜品种、价格和营养成分含量,以及病 人所需养分的最低数量见表2.1所示。病人每周需14份蔬 菜,为了口味的原因,规定一周内的卷心菜不多于2份, 胡萝卜不多于3份,其他蔬菜不多于4份且至少一份。在满 足要求的前提下,制订费用最少的一周菜单方案。
.t
.
n
x ij 1 , i 1 , 2 ,...,
n,
j1
yj x ij
0或 0或
1, j 1, i,
j
1,2 ,..., n , 1,2 ,..., n .
例5.1 已知30个物品,其中6个长0.51m,6个长 0.27m,6个长0.26m,余下的12个长0.23m,箱子长为 1m。问最少需要多少个箱子才能把30个物品全部装进箱 子。
第2章 LINGO软件使用简介与技巧
第2章 LINGO 软件使用简介与技巧LINGO 是一种专门用于求解数学规划问题的软件包.由于LINGO 执行速度快,易于方便地输入、求解和分析数学规划问题,因此在教学、科研和工业界得到广泛应用. LINGO 主要用于求解线性规划、非线性规划、二次规划和整数规划等问题,也可以用于求解一些线性和非线性方程组及代数方程求根等.本章介绍的LINGO 可在LINGO5.0,LINGO8.0,LINGO9.0中使用.一.LINGO 使用介绍1.1 LINGO 编写格式LINGO 模型以MODEL 开始,以END 结束.中间为语句,分为四大部分(SECTION ): (1) 集合部分(SETS ):这部分以“SETS :”开始,以“ENDSETS ”结束.这部分的作用在于定义必要的变量,便于后面进行编程进行大规模计算,就象C 语言在在程序的第一部分定义变量和数组一样.在LINGO 中称为集合(SET )及其元素(MEMBER 或ELEMENT ,类似于数组的下标)和属性(A TTRIBUTE ,类似于数组).LINGO 中的集合有两类:一类是原始集合(PRIMITIVE SETS ),其定义的格式为:SETNAME/member list(or 1..n)/:attribute,attribute,etc. 另一类是导出集合(DERIVED SETS ),即引用其它集合定义的集合,其定义的格式为:SETNAME (set1,set2,etc.):attribute ,attribute ,etc.如果要在程序中使用数组,就必须在该部分进行定义,否则可不需要该部分.(2) 目标与约束:这部分定义了目标函数、约束条件等.一般要用到LINGO 的内部函数,可在后面的具体应用中体会其功能与用法.求解优化问题时,该部分是必须的. (3) 数据部分(DA TA ):这部分以“DA TA :”开始,以“END DA TA ”结束.其作用在于对集合的属性(数组)输入必要的数值.格式为:attribut=value_list.该部分主要是方便数据的输入. (4) 初始化部分(INIT ):这部分以“INIT :”开始,以“END INIT ”结束.作用在于对集合的属性(数组)定义初值.格式为:attribute=value_list.由于非线性规划求解时,通常得到的是局部最优解,而局部最优解受输入的初值影响.通常可改变初值来得到不同的解,从而发现更好的解.编写LINGO 程序要注意的几点:(1) 所有的语句除SETS 、ENDSETS 、DA TA 、ENDDA TA 、INIT 、ENDINIT 和MODEL ,END 之外必须以一个分号“;”结尾.(2) LINGO 求解非线性规划时已约定各变量非负.1.2 LINGO 内部函数使用详解.LINGO 建立优化模型时可以引用大量的内部函数,这些函数以“@”符号打头. (1)常用数学函数@ABS(X) 返回变量X 的绝对数值. @COS( X)返回X 的余弦值,X 的单位为弧度 @EXP( X)返回e x 的值,其中e 为自然对数的底,即 71828.2 @FLOOR( X)向0靠近返回X的整数部分.如@FLOOR(3.7),则返回3;@FLOOR(-3.7),则返回-3.@LGM( X)返回Γ函数的自然对数值.@LOG( X)返回变量X的自然对数值.@SIGN( X)返回变量X的符号值,当X<0时为-1;当X>0时为1.@SIN( X)返回X的正弦值,X的单位为弧度@SMAX( X1, X2,..., XN)返回一列值X1, X2,..., XN的最大值.@SMIN( X1, X2,..., XN)返回一列值X1, X2,..., XN的最小值.@TAN( X)返回X的正切值,X的单位为弧度(2)集合函数集合函数的用法如下:set_operator (set_name|condition:expression)其中set_operator部分是集合函数名(见下),set_name是数据集合名,expression部分是表达式,|condition部分是条件,用逻辑表达式描述(无条件时可省略).逻辑表达式中可以三种逻辑算符(#AND#(与),#OR#(或),#NOT#(非))和六种关系算符(#EQ#(等于),#NE#(不等于),#GT#(大于),#GE#(大于等于),#LT#(小于),#LE#(小于等于)).常见的集合函数如下:@FOR (set_name:constraint_expressions)对集合(set_name)的每个元素独立地生成约束,约束由约束表达式(constraint_expressions)描述.@MAX(set_name:expression)返回集合上的表达式(expression)的最大值.@MIN(set_name:expression)返回集合上的表达式(expression)的最小值.@SUM(set_name:expression)返回集合上的表达式(expression)的和.@SIZE(set_name)返回数据集set_name中包含元素的个数.@IN(set_name,set_element)如果数据集set_name中包含元素set_element则返回1,否则返回0.(3)变量界定函数变量函数对变量的取值范围附加限制,共有四种.@BND(L,X,U)限制L≤X≤U@BIN(X)限制X为0或1.@FREE(X)取消对X的符号限制(即可取任意实数值).@GIN(X)限制X为整数值.二、LINGO 求解优化模型实验1.某昼夜服务的公交路线每天各时间区段内需司机和乘务人员如下:设司机和乘务人员分别在各时间区段一开始上班,并连续工作八小时,问该公交线路至少配备多少名司机和乘务人员?从第一班开始排,试建立线性模型.分析与求解:注意在每一时间段里上班的司机和乘务人员中,既包括在该时间段内开始时报到的人员,还包括在上一时间段工作的人员.因为每一时间段只有四个小时,而每个司乘人员却要连续工作八个小时.因此每班的人员应理解为该班次相应时间段开始时报到的人员.设i x 为第i 班应报到的人员(i =1,2,…,6),则应配备人员总数为:∑==61i ixZ按所需人数最少的要求,可得到线性模型如下:==61min i i x Z161223344556112660706050..203060,,,0x x x x x x x x s t x x x x x x x x +≥⎧⎪+≥⎪⎪+≥⎪+≥⎪⎨+≥⎪⎪+≥⎪≥⎪⎪≥⎩ LINGO 程序如下:MODEL:min=x1+x2+x3+x4+x5+x6; x1+x6>=60; x1+x2>=70; x2+x3>=60; x3+x4>=50; x4+x5>=20;x5+x6>=30;END得到的解为:x1=60,x2=10,x3=50,x4=0,x5=30,x6=0; 配备的司机和乘务人员最少为150人.2. 公司在各地有4项业务,选定了4位业务员去处理.由于业务能力、经验和其它情况不同,4业务员去处理4项业务的费用(单位:元)各不相同,见下表:表3.2 业务的费用表解:这是一个最优指派问题.引入如下变量: ⎩⎨⎧=项业务个人做第若不分派第项业务个人做第若分派第j i j i x ij 01设矩阵44A ⨯为指派矩阵,其中(,)a i j 为第i 个业务员做第j 项业务的业务费. 则可以建立如下模型:∑∑===4141min i j ij ijx aZ⎪⎪⎪⎩⎪⎪⎪⎨⎧======∑∑==4,3,2,1,104,3,2,114,3,2,11..4141j i x i x j x t s ij j ij i ij 或 LINGO 程序如下: MODEL:SETS:person/1..4/; task/1..4/;assign(person,task):a,x; ENDSETS DATA:a=1100,800,1000,700,600,500,300,800,400,800,1000,900,1100,1000,500,700;ENDDATAmin=@sum(assign:a*x);@for(person(i):@sum(task(j):x(i,j))=1);@for(task(j):@sum(person(i):x(i,j))=1);@for(assign(i,j):@bin(x(i,j)));END得到的结果如下:x(1,1)=0,x(1,2)=0,x(1,3)=0,x(1,4)=1;x(2,1)=0,x(2,2)=1,x(2,3)=0,x(2,4)=0;x(3,1)=1,x(3,2)=0,x(3,3)=0,x(3,4)=0;x(4,1)=0,x(4,2)=0,x(4,3)=1,x(4,4)=0;最小费用为2100元.即第1个业余员做第4项业务,第2个业余员做第2项业务,即第3个业余员做第1项业务,第4业余员做第3项业务.总费用达到最小,为2100元.LINGO程序中输入的数据也可以从文本文件中读入,特别是数据比较多时,将程序与数据分开,显得更方便.如上面程序也可以这样写:MODEL:SETS:person/1..4/;task/1..4/;assign(person,task):a,x;ENDSETSDATA:a=@file(data.txt);ENDDATAmin=@sum(assign:a*x);@for(person(i):@sum(task(j):x(i,j))=1);@for(task(j):@sum(person(i):x(i,j))=1);@for(assign(i,j):@bin(x(i,j)));END同时在LINGO目录下建立文本文件data.txt,数据如下:1100,800,1000,700600,500,300,800400,800,1000,9001100,1000,500,700其计算结果同上面相同.3有四种资源被用于生产三种产品,资源量、产品单件可变费用、单件售价、资源单耗量及组织三种商品生产的固定费用见下表.现要求制定一个生产计划,使总收益最大.表3.3 数据详细表解:总收益等于销售收入减去生产产品的固定费用与可变费用之和.问题的困难之处在于事先不知道某种产品是否生产,因而不能确定是否有相应的固定费用.可引入用0-1变量来解决是否需要固定费用问题.设j x 是第j 种产品的产量,1,2,3j =;再设⎪⎩⎪⎨⎧=>=)0(0)0(1jjjx j x j y种产品若不生产第种产品若生产第 3,2,1=j第I 种产品销售一件可收入7-4=3元,第II 种产品销售一件可收入10-6=4元,第III种产品销售一件可收入20-12=8元.则问题的整数规划模型为:321321200150100843m ax y y y x x x Z ---++=⎪⎪⎪⎪⎪⎪⎩⎪⎪⎪⎪⎪⎪⎨⎧===≥≤≤≤≤++≤++≤++≤++3,2,1,103,2,1,070075310032300432500842..333222111321321321321j y j x y M x y M x y M x x x x x x x x x x x x x t s j j 或且为整数 其中j M 为j x 的某个上界.如根据第2个约束条件,可取100,15021==M M ,753=M .也可统一取其最大值150=M .如果生产第j 种产品,则起产量0>j x .由约束条件j j j y M x ≤知1=j y ,此时相应的生产第j 种产品的固定费用在目标函数被考虑.如果不生产第j 种产品,则起产量0=j x .由约束条件j j j y M x ≤知j y 可为0也可为1.但显然只有0=j y 有利于目标函数最大,从而相应的生产第j 种产品的固定费用在目标函数将不被考虑.因此引入j y 是合理的.下面是LINGO 程序.MODEL: DATA: M=150; ENDDATAmax=3*x1+4*x2+8*x3-100*y1-150*y2-200*y3;!目标函数; 2*x1+4*x2+8*x3<=500; 2*x1+3*x2+4*x3<=300; x1+2*x2+3*x3<=100; 3*x1+5*x2+7*x3<=700; x1<=M*y1; x2<=M*y2;x3<=M*y3;@GIN(x1);@GIN(x2);@GIN(x3); !指定产品件数为整数; @BIN(y1);@BIN(y2);@BIN(y3); !指定0-1变量;end得到的解为x1=100,x2=0,x3=0,y1=1,y2=0,y3=0.最大值为Z=200元.3 TSP 问题及LINGO 求解技巧巡回旅行商问题(Traveling Salesman Problem ,TSP),也称为货郎担问题。
全国数学建模lingo实例讲解
全国数学建模lingo 实例讲解LINGO 是用来求解线性和非线性优化问题的简易工具。
LINGO 内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO 高效的求解器可快速求解并分析结果。
§1 LINGO 快速入门当你在windows 下开始运行LINGO 系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO 的默认模型窗口,建立的模型都都要在该窗口内编码实现。
下面举两个例子。
例1.1 如何在LINGO 中求解如下的LP 问题:,6002100350..32min 212112121≥≤+≥≥++x x x x x x x t s x x在模型窗口中输入如下代码: min =2*x1+3*x2; x1+x2>=350; x1>=100;2*x1+x2<=600;然后点击工具条上的按钮 即可。
例1.2 使用LINGO 软件计算6个发点8个收点的最小费用运输问题。
产销单位运价如下表。
单位 销地 运 价 产地B 1 B 2 B 3 B 4 B 5 B 6 B 7 B 8 产量 A 1 6 2 6 7 4 2 5 9 60 A 24953858255A3 5 2 1 9 7 4 3 3 51A4 7 6 7 3 9 2 7 1 43A5 2 3 9 5 7 2 6 5 41A6 5 5 2 2 8 1 4 3 52销量35 37 22 32 41 32 43 38使用LINGO软件,编制程序如下:model:!6发点8收点运输问题;sets:warehouses/wh1..wh6/: capacity;vendors/v1..v8/: demand;links(warehouses,vendors): cost, volume;endsets!目标函数;min=@sum(links: cost*volume);!需求约束;@for(vendors(J):@sum(warehouses(I): volume(I,J))=demand(J));!产量约束;@for(warehouses(I):@sum(vendors(J): volume(I,J))<=capacity(I));!这里是数据;data:capacity=60 55 51 43 41 52;demand=35 37 22 32 41 32 43 38;cost=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;enddataend然后点击工具条上的按钮即可。
