第一篇:专题:lingo优化
群主2(291269111)2010-9-5 19:15:32 大家好,我是数学中国的站长madio,应数学中国培训组的要求在这里和大家交流一下lingo的学习体会。
群主2(291269111)2010-9-5 19:15:35 LINGO是用来求解线性和非线性优化问题的简易工具。LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果。
群主2(291269111)2010-9-5 19:15:39 我们关注近几年全国赛赛题的同学们都会发现,优化问题始终是数学建模的热点,近几年整数规划、二次规划的问题多次出现。
群主2(291269111)2010-9-5 19:15:45 优化问题往往有建模简单,求解困难的特点,如何找到我们所需要的全局最优解或者局部最优解是非常重要的,Lingo是我们完成优化建模求解的有效工具,它的学习直接关系到了我们建模的最终成败。
群主2(291269111)2010-9-5 19:15:50 答疑专贴: http://www.xiexiebang.computations列表框中,选择Prices and Ranges选项。灵敏性分析耗费相当多的求解时间,因此当速度很关键时,就没有必要激活它。
群主2(291269111)21:07:31 好了,由于很多网友晚上要断电,所以我们的课先讲到这,大家可以在数学中国社区论坛上和我继续交流,谢谢大家了!
群主2(291269111)21:07:49 感谢数学中国站长的精彩讲课!如果大家对培训中的内容有什么疑问,可以在【第三期培训答疑贴】中跟帖: http://www.madio.net/thread-101158-1-1.html 培训老师会及时回答大家的问题的!
群主2(291269111)21:08:04 第三期培训的讲稿一会会在培训咨询帖中公布: http://www.madio.net/thread-100805-1-1.html 大家有需要的可以自行下载!
群主2(291269111)21:08:24 第四期培训专题通知:
培训专题:《比赛注意事项及论文写作》 培训人:数学中国CEO(huashi3483)培训时间:9月6号晚8点
第四期为数学中国在国赛前准备的最后一期培训专题,CEO会向大家介绍比赛中的相关注意事项及论文写作的相关事宜,敬请期待!
感谢各位对数学中国的支持!
第二篇:LINGO学习心得
朱旭生LINGO学习心得
LINGO的主要特点:一是数学化的语言,用的是数学模型比较直观;二是数据段与程序语句段分开,甚至可以利用不在lingo文件中的外界数据文件来给变量赋值.1.可以利用EXCEL与LINGO之间直接传递数据;从EXCEL到LINGO的语句为 “变量=@OLE(„EXCEL文件的详细名称(包括路径)‟)”;从LINGO到EXCEL的语句为
“@OLE(„EXCEL文件的详细名称(包括路径)‟)=变量”.放在LINGO数据区
注意:这里的电子表格EXCEL的数据段应该取名,方法是用鼠标左键锁定数据区后从菜单“插入”中选“名称”,再选“定义”,在弹出的表格中输入该数据段的名称(英文,本来在excel中是可以定义中文名称的,但是作为lingo变量则不能)。输出的EXCEL表格也是如此定义数据区。
输出的表格可以与输入的表格不在同一个文件里,在lingo程序运行前定义出输出区域的名称。
注意在用cut,paste功能时很容易多出一些标点符号,使得语句不符合语法规则!
2。在解大型问题时,可能会出现计算时LINGO内存不够,这时应该修改LINGO选择项“Option”中的相关选项。
3。象本例中,我们对EXCEL的表格中的数据进行处理(关于11或10补)时,也可以利用LINGO来完成。
4。条件语句:@IF(logical_condition, true_result, false_result),如下面程序:
MIN = COST;COST = XCOST + YCOST;XCOST = @IF(X #GT# 0, 100, 0)+ 2 * X;YCOST = @IF(Y #GT# 0, 60, 0)+ 3 * Y;X + Y >= 30;
其中生产产品X的成本为分段函数:x=0时,成本为0;x>0时,成本为 100+2x,即生产准备费为100.5.变量取名规则:以英文字母打头,后面可以跟英文字母,数字0-9,以及下划线_.变量中的字母大小写不区别,如:XAB与Xab,xab等价.6.SETS段: 定义一个同样属性的集合,如同学们,老师们,宿舍群等等,他们在建模过程中往往表示为同学1,同学2,„„,同学n,以下方式等价: 同学们/同学1,同学2,同学3,同学4,同学5,同学6,同学7,同学8,同学9,同学10/:分数;同学们/同学1..同学10/:分数; 同学们/1..10/:分数;注:最后一种表示方式必须是从数字1开始标,但是中间那个可以是/同学3..同学10/
7。循环语句:
@function(setname [(set_index_list)[ | conditional_qualifier]] : expression_list);有:@FOR,@SUM,@MAX, @MIN.8控制函数: @IN(set_name, primitive_index_1 [, primitive_index_2...])This returns TRUE if the set member referenced by the index tuple(primitive_index_1, primitive_index_2,...)is contained in the set_name set.As the following example shows, the @IN operator is useful for generating complements of subsets in set membership conditions.这个函数主要用于定义一个集合的子集合,或是用来判断某个元素是否在集合中,返回逻辑值0,1。但是下面的命令不能执行:
@for(S(i):y(i)=@sum(b(k)|(i,k)@in(link(i,k)):x(i,k)));事实上,象这种在稀疏集里求和与稠密集一样,可以这样来求: @for(S(i):y(i)=@sum(link(i,k):x(i,k)));
@INDEX([set_name,] primitive_set_element)
结果是该元素在集合中的位置,为一个自然数.@WRAP(INDEX, LIMIT)
以LIMIT为周期变量取值循环,如 MON..SUN ,LIMIT=7;值为8相应于1,即为MON.@SIZE(set_name)
返回该集合中的元素个数,即集合的规模.9.与取整有关的函数
在LINGO8.0中与取整有关的函数是 @floor(x),其意义是0,x之间最靠近x整数:如 @floor(1.2)=1,@floor(2)=2,@floor(-2.3)=-2.故x>0时 @floor就是取整函数;为了表示不小于x的最小整数,我们可以用下面的命令: f=@floor(x)+@if(@floor(x)#EQ#x,0,1);
10.如果结果报告中有大量的取零值的变量,结果往往显得很繁琐,此时可以选择仅仅输出非零变量及其值,则当窗口在源程序窗口时,从菜单lingo的下拉菜单solution的弹出窗口中:
但此时一般不会显示目标函数值,应该专门为其取一个变量名,并其其相应的最小或最大.在解答农场计划时:我们遇到了一些问题,主要是不能求解,说是没有可行解,但是,如果不求最大,则很容易找到可行解,其目标函数值也接近最优值.我们在分析最优解应当是最后一年里不养小母牛(在五年内不能产生效益),由此推导得第三年把所有生下来的小牛(无论公母)全部卖掉.这才可以求出局部最优解,进一步求得全局最优解.model: sets: nian/1..5/:u,v,f1,f2,g1,g2,r,rf1,rf2,rg1,rg2,w1,w2,h,rh,d,nainiu,xiaoniu;zhl/1..12/:;link1(nian,zhl):x,y;lt/1..4/:;link2(nian,lt):z,zhongl;endsets!max=lirun;
lirun=@sum(nian(i):r(i));@for(nian(i):f1(i)=0.6*0.99*@sum(link1(i,j)|j#gt#2:x(i,j)));@for(nian(i):g1(i)=0.7*0.99*@sum(link1(i,j)|j#gt#2:x(i,j)));@for(nian(i):f2(i)=1.1*z(i,1)+0.9*z(i,2)+0.8*z(i,3)+0.65*z(i,4));@for(nian(i):g2(i)=1.5*w2(i));
@for(link1(i,j)|i#eq#1:x(i,j)=10);@for(link1(i,j)|j#le#2:y=0.95*x);@for(link1(i,j)|j#gt#2:y=0.98*x);@for(link2(i,j)|j#lt#4:zhongl(i,j)>zhongl(i,j+1));@for(link2(i,j)|j#eq#1:z(i,j)<30*zhongl(i,j);z(i,j)>30*zhongl(i,j+1));@for(link2(i,j)|j#eq#2:z(i,j)<30*zhongl(i,j);z(i,j)>30*zhongl(i,j+1));@for(link2(i,j)|j#eq#3:z(i,j)<20*zhongl(i,j);z(i,j)>20*zhongl(i,j+1));@for(link2(i,j)|j#eq#4:z(i,j)<10*zhongl(i,j));@for(nian(i):w1(i)=@sum(link2(i,k):z(i,k)));@for(nian(i):nainiu=@sum(link1(i,j)|j#gt#2:x(i,j)));@for(nian(i):xiaoniu=@sum(link1(i,j)|j#le#2:x(i,j)));@for(nian(i):w1(i)+w2(i)+0.99*nainiu+0.6666667*0.975*xiaoniu=220);@for(nian(i):h=10*@sum(link1(i,j)|j#le#2:0.975*x(i,j))+42*@sum(link1(i,j)|j#gt#2:0.99*x(i,j))+4*w1(i)+14*w2(i));@for(nian(i):r(i)=270*0.99*nainiu(i)+120*y(i,12)+30*u(i)+40*v(i)-rh(i)+rf2(i)-rf1(i)+rg2(i)-rg1(i)-50*0.975*xiaoniu(i)-15*w1(i)-10*w2(i)-@sum(nian(k)|k#le#i:d(k)));@for(nian(i):rh=@if(h#le#5500,4000,4000+1.2*(h-5500)));@for(nian(i):rf1=@if(f1#gt#f2,90*(f1-f2),0));@for(nian(i):rf2=@if(f2#gt#f1,75*(f2-f1),0));@for(nian(i):rg1=@if(g1#gt#g2,70*(g1-g2),0));@for(nian(i):rg2=@if(g2#gt#g1,50*(g2-g1),0));@for(nian(i):d=@if(@sum(link1(i,j):x(i,j))#gt#130,39.8504*(@sum(link1(i,j):x(i,j))-130),0));@for(link1(i,j)|i#lt#5 #and# j#le#11:x(i+1,j+1)=y(i,j));@for(link1(i,j)|i#lt#5 #and# j#eq#1:x(i+1,j)=0.55*@sum(link1(i,k)|k#gt#2:y(i,k))-v(i));@for(nian(i):u(i)=0.55*@sum(link1(i,j)|j#gt#2:y(i,j)));@sum(link1(i,j)|i#eq#5 #and# j#ge#2 #and# j#le#11:y(i,j))<175;@sum(link1(i,j)|i#eq#5 #and# j#ge#2 #and# j#le#11:y(5,j))>50;@for(link2(i,j):@bin(zhongl));end
但是加进去了一些最优解满足的条件后可以求出全局最优解: model: sets: nian/1..5/:u,v,f1,f2,g1,g2,r,rf1,rf2,rg1,rg2,w1,w2,h,rh,d,nainiu,xiaoniu;zhl/1..12/:;link1(nian,zhl):x,y;lt/1..4/:;
link2(nian,lt):z,zhongl;endsets data: @ole(F:lingsjnongch.xls,'nianchniu','zhtian','xiaogn','xiaomn','maili','mailia','maiti','maitia','gongshi','gshgz', 'niansh','xiaoniu','nainiu')=x,z,u,v,f1,f2,g1,g2,h,rh,r,xiaoniu,nainiu;enddata max=lirun;lirun=@sum(nian(i):r(i));@for(nian(i):f1(i)=0.6*0.99*@sum(link1(i,j)|j#gt#2:x(i,j)));!每年的粮食需求量;
@for(nian(i):g1(i)=0.7*0.99*@sum(link1(i,j)|j#gt#2:x(i,j)));!每年的甜菜需求量;
@for(nian(i):f2(i)=1.1*z(i,1)+0.9*z(i,2)+0.8*z(i,3)+0.65*z(i,4));!每年的粮食生产量;
@for(nian(i):g2(i)=1.5*w2(i));!每年的甜菜生产量;
@for(link1(i,j)|i#eq#1:x(i,j)=10);!第一年年初的各类牛的数量,初值;@for(link1(i,j)|j#le#2:y=0.95*x);!各年年末的小牛的数量分布;@for(link1(i,j)|j#gt#2:y=0.98*x);!各年年末的产奶牛的数量分布;
@for(link2(i,j)|j#lt#4:zhongl(i,j)>zhongl(i,j+1));!最优解优先选择产粮量高的天种粮;
@for(link2(i,j)|j#eq#1:z(i,j)<30*zhongl(i,j);z(i,j)>30*zhongl(i,j+1));@for(link2(i,j)|j#eq#2:z(i,j)<30*zhongl(i,j);z(i,j)>30*zhongl(i,j+1));@for(link2(i,j)|j#eq#3:z(i,j)<20*zhongl(i,j);z(i,j)>20*zhongl(i,j+1));@for(link2(i,j)|j#eq#4:z(i,j)<10*zhongl(i,j));@for(nian(i):w1(i)=@sum(link2(i,k):z(i,k)));!每年的种粮田地数量;
@for(nian(i):nainiu=@sum(link1(i,j)|j#gt#2:x(i,j)));!每年的产奶牛的总数;@for(nian(i):xiaoniu=@sum(link1(i,j)|j#le#2:x(i,j)));!每年的小牛的总数;@for(nian(i):w1(i)+w2(i)+0.99*nainiu+0.6666667*0.975*xiaoniu=220);!土地约束;
@for(nian(i):h=10*@sum(link1(i,j)|j#le#2:0.975*x(i,j))+42*@sum(link1(i,j)|j#gt#2:0.99*x(i,j))+4*w1(i)+14*w2(i));!劳动时间;
@for(nian(i):r(i)=270*0.99*nainiu(i)+120*y(i,12)+30*u(i)+40*v(i)-rh(i)+rf2(i)-rf1(i)+rg2(i)-rg1(i)-50*0.975*xiaoniu(i)-15*w1(i)-10*w2(i)-@sum(nian(k)|k#le#i:d(k)));!每年的货币收入;
@for(nian(i):rh=@if(h#le#5500,4000,4000+1.2*(h-5500)));!劳动时间方面的支出;
@for(nian(i):rf1=@if(f1#gt#f2,90*(f1-f2),0));!购粮支出;@for(nian(i):rf2=@if(f2#gt#f1,75*(f2-f1),0));!卖粮收入;@for(nian(i):rg1=@if(g1#gt#g2,70*(g1-g2),0));!购甜菜支出;
@for(nian(i):rg2=@if(g2#gt#g1,50*(g2-g1),0));!卖甜菜收入;
@for(nian(i):d=@if(@sum(link1(i,j):x(i,j))#gt#130,39.8504*(@sum(link1(i,j):x(i,j))-130),0));!因当年的投资还贷数量;
@for(link1(i,j)|i#lt#5 #and# j#le#11:x(i+1,j+1)=y(i,j));!连接关系;@for(link1(i,j)|i#lt#5 #and# j#eq#1:x(i+1,j)=0.55*@sum(link1(i,k)|k#gt#2:y(i,k))-v(i));!留下来的小母牛;
@for(nian(i):u(i)=0.55*@sum(link1(i,j)|j#gt#2:y(i,j)));!小公牛数量;@for(nian(i)|i#ge#3:v(i)=u(i));!最优解必定在最后一年里没有小牛;
@sum(link1(i,j)|i#eq#5 #and# j#ge#2 #and# j#le#11:y(i,j))<175;!五年后约束条件;
@sum(link1(i,j)|i#eq#5 #and# j#ge#2 #and# j#le#11:y(5,j))>50;@for(link2(i,j):@bin(zhongl));end
model:!旅行商问题(TSP),从城市1出发,经过每个城市一次回到城市1;sets: city:u;link(city,city):c,x;endsets data: n=30;!输入城市数,n比较小时可用提示n=?,n比较大时不能这样作,死机;city,c=@ole(F:lingsjTSP2.xls,'city','feiyong');
enddata
min=@sum(link(i,j)|i#ne#j:c*x);@for(city(i):@sum(city(j)|i#ne#j:x(i,j))=1);@for(city(j):@sum(city(i)|i#ne#j:x(i,j))=1);@for(link(i,j)|i#gt#1 #and# j#gt#1 #and# i#ne#j:u(i)-u(j)+n*x(i,j) 注:由于通用程序中含有城市个数n,因此必须在数据段指定n的值;一个好的方法是即时输入法,用n=?即可.但是当n=30时,这样做会死lingo,说是指向内存.这时应用者应当注意阅读程序,注意修改数据段. 网上关于LINDO/LINGO的学习心得材料 1、LINDO 这个就是一开始的那个软件,主要求解线性规划、整数规划、二次规划问题。现在版本好像是6.1。 2、GINO 一开始的时候这也是一个求非线性规划的工具,甚至她还用来求解一些非线性的方程根。它的特点是:包含了丰富的数学函数,尤其是概率函数!但是随着像Mathematica/Matlab的迅速发展,他逐渐的消亡,并演化为现在的函数引擎LINDO API,呵呵,现在版本2.0。 3、LINGO/LINGO NL 大家现在看到的LINGO8.0在一开始也是两部分:LINGO and LINGO NL,他们分别用于求解线性、整数规划以及非线性、线性、整数规划问题。可见这很混乱,所以现在就统一成为了LINGO,它与LINDO的主要主要区别在于:她内建了建模语言,可以简约的得描述大规模的优化问题。现在版本是8.0。 4、What's the best 这是一个组件,主要处理由Excell/Access生成数据文件的规划问题,安装之后会在你的Office中添加一个名为What's the best的宏,启用后会在Excell中生成一个工具条,就像Adobe的pdf插件一样。现在版本是7.0。 注解:上面这些旨在说明这些软件名字是有各自的含义的,首先要明确他们各自的长处是什么,才能有的放矢!至于学习方法,很简单,阅读、运行程序自带实例。呵呵,打算每天一个例子吧:)一些他们的区别在具体例子中会比较说明! 说一下这里的lindo和lingo程序结构的差异: 1、基本程序架构(1)lindo是这样的: MAX 目标函数表达 ST 变量约束1 变量约束2 变量约束3 END(2)lingo是这样的: MAX=目标函数表达;变量约束1;变量约束2;变量约束3;注意:可见它们的基本frame不同,在lingo80中每个语句后面必须以分号结束,包括以开头的注释语句。 2、简单的示例 假设现在一个计算机厂商要生产两种型号的PC:标准型(standard)和增强型(turbo),由于生产线和劳动力工作时间的约束,使得标准型PC最多生产100台。增强型PC最多生产120台;一共耗时劳动力时间不能超过160小时。已知每台标准型PC可获利润$100,耗掉1小时劳动力工作时间;每台增强型PC可获利润$150,耗掉2小时劳动力工作时间。请问:该如何规划这两种计算机的生产量才能够使得最后获利最大? 这个问题是标准的线性规划,目标函数是100*standard+150*turbo最大!lindo/lingo的程序分别如下: (1)[lindo sourcecode]: max 100 standard+150 turbo st standard<=100 turbo<=120 standard+2 turbo<=160 end 运行结果如下: LP OPTIMUM FOUND AT STEP OBJECTIVE FUNCTION VALUE 1) 14500.VARIABLE VALUE REDUCED COST STANDARD 100.000000 0.000000 TURBO 30.000000 0.000000 ROW SLACK OR SURPLUS DUAL PRICES 2) 0.000000 25.000000 3) 90.000000 0.000000 4) 0.000000 75.000000 NO.ITERATIONS= 注解:第一行告知线性优化步数为2,下面是目标函数值=14500,在standard=100/turbo=30时取到;下面是对偶值。 (2)[lingo sourcecode]: max=100*standard+150*turbo;standard<=100;turbo<=120;standard+2*turbo<=160; 运行结果如下: Global optimal solution found at iteration: Objective value: 14500.00 Variable Value Reduced Cost STANDARD 100.0000 0.000000 TURBO 30.00000 0.000000 Row Slack or Surplus Dual Price 14500.00 1.000000 0.000000 25.00000 90.00000 0.000000 0.000000 75.00000 注意:同样的一个问题,lingo却用了3次迭代!实际上lingo的长处在于它的内建的建模语言,从而刻画大型的规划问题简单,小规模的规划问题好像lindo有更好的效率! 我实际上更喜欢用lingo,总觉得她和matlab更接近一点!特别是一些基本的数学运算符。非常不习惯lindo不用*表示乘,却用空格,sigh...从本部分介绍lingo的强大的数学优化建模语言。这是他专门为大规模优化建模提供的一套 规范语言,下面介绍简单的例子来说明他的基本组成。 一、原始问题(运输问题): 现在WW(Wireless Widgets)公司拥有6个仓库,向其8个销售商供应它的产品。要求每个 仓库供应不能超量,每个销售商的需求必须得到满足。WW公司需要决策具体的从每个仓库运输多少产品到每个销售商。以使得所花的运输费用最少? 二、问题的已知数据: 1、产品仓库数据: 仓库编号 产品库存量 1 2 3 4 5 6 2、销售商产品需求: 销售商编号 产品需求量 1 2 3 4 5 6 7 8 3、每件产品运输费用($): 销售商[右] V1 V2 V3 V4 V5 V6 V7 V8 仓库[下] Wh1 Wh2 Wh3 Wh4 Wh5 Wh6 三、目标函数描述: 线性优化建模的重要一步就是构造目标函数,正如上面提到的,在此问题中,WW 公司欲使总的运输费用最小。 现在令:变量VOLUME_I_J 表示从仓库I到销售商J运送的产品数目。这样我们就可以写出如下的目标函数: MIN = 6 * VOLUME_1_1 + 2 * VOLUME_1_2 + 6 * VOLUME_1_3 + 7 * VOLUME_1_4 +4 * VOLUME_1_5 +...8 * VOLUME_6_5 + VOLUME_6_6 + 4 * VOLUME_6_7 +3 * VOLUME_6_8; 当然上面是个简写形式。很明显的上面的目标函数如此的冗长,很容易导致输入错误。现实中的情况往往是销售商成千上万个,如果还是使用上述的方法就难以想象了。熟悉规划数学定义的人可以很轻易的用下面的方式表达上述的目标函数: Minimize SUM(ij)(COST_ij*VOLUME_ij)LINGO就是采用这种类似的方式来描述规划模型的,比如这个例子的等价的LINGO语句就是: MIN = @SUM(LINKS(I,J): COST(I,J)* VOLUME(I,J));总之:LINGO的规划语言很适合熟悉数学的人使用,很自然。上面的@SUM是系统函数,后面会介绍常见系统函数:P 四、变量约束: 这里有两种约束,第一种是供货约束,第二种是接货约束。例如:对于第一个销售商而言 VOLUME_1_1 + VOLUME_2_1 + VOLUME_3_1 + VOLUME_4_1 + VOLUME_5_1 + VOLUME_6_1 = 35; 如果使用原始的规划语句,要建如类似上面的语句8次呢:(有了建模语言就方便了: @FOR(VENDORS(J):@SUM(WAREHOUSES(I): VOLUME(I, J))= DEMAND(J));类似的: @FOR(WAREHOUSES(I): @SUM(VENDORS(J): VOLUME(I, J))<= CAPACITY(I));好了,到此为止我们的模型就建起来了: MODEL: MIN = @SUM(LINKS(I, J): COST(I, J)* VOLUME(I, J));@FOR(VENDORS(J): @SUM(WAREHOUSES(I): VOLUME(I, J))= DEMAND(J));@FOR(WAREHOUSES(I): @SUM(VENDORS(J): VOLUME(I, J))<= CAPACITY(I)); END 注释:从上面可以看出一个LINGO模型必须包含在MODEL/END中间,然后在中间依次给出目标函数,约束条件等。但是我们的数据该如何给出呢?也就是解决LINGO建模语言中的赋值问题,下面会接着介绍的,呵呵:) 五、定义变量集合: 我们要处理的实际建模问题中经常会遇到一类同样的问题:若干相关的对象集合。比如:工厂稽核、客户集合、车辆集合和雇员集合等等。通常我们希望:约束某个集合中的特定对象的条件也同样适用于同一集合内其他的对象。这恰好是LINGO建模语言的最基本的概念。LINGO允许在SETS段定义某些相关对象于同一个集合内。集合段以关键字SETS开始;以关键字ENDSETS结束。一旦你定义了集合,LINGO可以提供大量的集合循环函数(例如:@FOR), 通过简单的调用他们的语句就可以操作集合内的所有元素。 我们回到最初的例子:Wireless Widget 模型,定义如下的三个集合: 仓库集,销售商集,运输路线集。具体的定义如下: SETS: WAREHOUSES / WH1 WH2 WH3 WH4 WH5 WH6/: CAPACITY; VENDORS / V1 V2 V3 V4 V5 V6 V7 V8/ : DEMAND; LINKS(WAREHOUSES, VENDORS): COST, VOLUME; ENDSETS 注解:普通集合定义格式如下:集合名/成员列表/:成员共有属性。最后的LINKS集合,代表着48条运输路线。每条路线分别有两个属性COST和VOLUME。定义这种集合的语法和前面不同: LINKS(WAREHOUSES, VENDORS)上面前面两个集合称为“基本集合(Primarity Sets)”,第三个集合LINKS是“派生集合(Derived Sets)”;顾名思义他是由基本集合WAREHOUSES和VENDORS派生出来的。在这个例子中, LINGO生成每个可能的(warehouse, vendor)序对,这48个有序对组成了集合LINKS。下面从LINKS集合中调出的部分成员可以帮助我们认识这些序对的生成方式: 索引 运输线路 1 WH1-->V1 2 WH1-->V2 3 WH1-->V3......47 WH6-->V7 48 WH6-->V8 我们当然可以自己键入这些成员,但是LINGO在后台为我们节省了时间和劳动,我们只需搞明白他的工作原理就可。 六、集合变量赋值: LINGO允许用户在数据段中单独的给模型中变量赋值;比如下面是我们的这个例子的数据段: DATA: CAPACITY = 60 55 51 43 41 52; DEMAND = 35 37 22 32 41 32 43 38; COST = 6 2 6 7 4 2 5 9 9 5 3 8 5 8 2 2 1 9 7 4 3 3 6 7 3 9 2 7 1 3 9 5 7 2 6 5 5 2 2 8 1 4 3; ENDDATA 注解: [1]、数据段以关键字DATA开始;以关键字ENDDATA结尾。派生集合的赋值有个顺序问题,在这里它先初始化COST(WH1, V1), 接下来是从COST(WH1, V2)到COST(WH1, V8);然后是COST(WH2, V1), 依此类推。[2]、LINGO还支持从外部文件中导入数据,更一般化地,他甚至支持通过OLE连接到Excel, 或者创建到流行数据库的ODBC链接,这对于数据经常改变的模型非常重要的。 七、总结: 直到现在,我们使用LINGO建模语言建立的运输模型已经初具规模,全部模型是这样的: MODEL:!示例:6仓库/8销售商运输模型;SETS: WAREHOUSES/ WH1 WH2 WH3 WH4 WH5 WH6/: CAPACITY; VENDORS/ V1 V2 V3 V4 V5 V6 V7 V8/: DEMAND; LINKS(Warehouses, Vendors): COST, VOLUME;ENDSETS!目标函数;MIN = @SUM(LINKS(I, J): COST(I, J)* VOLUME(I, J));!需求约束;@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 5 9 5 3 8 5 8 2 2 1 9 7 4 3 3 6 7 3 9 2 7 1 3 9 5 7 2 6 5 5 2 2 8 1 4 3 ENDDATA END 注解:在LINGO中使用!和;构造注释语句。另外提醒大家:不要忘了这里的VOLUME(I,J)是要求的具体每条运输线路的运货量:P 上面将LINGO8.0分成三部分大致的介绍完了,这其实也是我的学习过程。我每天只能拿出半个小时左右看看LINGO,今天比较幸运,比较闲,就写些感受吧:) 一、上面三篇后的小尾巴: 上面讲了这么多,最后为啥嘎然而止?实际上,上面的最后已经给出了运输模型的完整的LINGO建模语言描述的程序,只需点击一下运行就可。 二、体会: 为什么LINGO这个软件到现在为止还越来越有活力了呢?现在像Matlab/Maple?MathCAD这样的软件功能强大的很!这几天的使用让我稍有体会了: 1、线性规划这一块的欠缺:在matlab的最初的发展中,线性规划这一块就没考虑多大,当然,如果你非常熟悉单纯形法或分支定界法这样的算法的话,完全可以使用C或者matlab来解决一个具体的规划问题。但是LINDO公司有着独特的眼光,发现了将这些成熟的算法批量机械化的好处,形成了现在的LINDO系列优化软件。 2、线性规划的巨大使用价值:现实的金融/经济/社会等等方面非常多的出现线性规划问题,只要看一下现在的MBA/MPA的教材就知道这是多么基本的一项技术!正如此,LINDO系列软件的使用领域现在主要在这些社会领域,当然教育上也有相当的应用。 3、LINGO建模语言的统一性:熟悉数学优化的人就是知道LINDO公司实际上没做什么,只是将相应数学理论概念对应到面向对象编程中而已,但是这是具有创造性地!Matlab没做这些,尤其是线性/整数规划!当然对于非线性优化,Matlab的优化工具箱绝对是超级工具。 4、统一性:使用LINDO的语言,特别是建模语言,你能够比较清醒地认识你现在所处理的问题到底是哪一类规划问题?有助于更深刻地认识你所面临的问题。 三、下面的安排: 前面的这部分算是个入门吧!以后要慢慢的接触LINGO的强大的系统内置函数系统,先开个头吧,下面是LINGO系统中的所有函数的分类: 1、标准运算符 2、数学函数 3、金融函数 4、概率函数 5、变量范围限制函数 6、集合控制函数 7、集合循环函数 8、导入导出函数 9、杂项函数 呵呵!今天就写这些:P 实际应用科研中创新、管用的方法、思路往往是最Naive的!可能俺的水平太低?咋老是感觉这样呢,何时才能update呀。 运筹学的应用简介及实例(lindo,lingo,ahp) 一.运筹学可以用于物流中心选址: 配送中心合理选址的目的是为了提高物流企业的服务质量,最大限度地增加物流企业的经济效益。科学合理的选址不仅能够减少货物运输费用,大幅度地降低运营成本,而且能为客户带来方便快捷的服务。二.运筹学可以用于路线选择: 利用运筹学中的图论和线性规划方法,对已有的空运、水运、公路运输、管道运输、铁路运输组成的交通网,根据不同的决策目标制定不同的调运方案,可以是最短时间的运输路线、最少费用的运输路线或是最大运输量最低运费的运输线路等,从而达到降低物流成本的目的。三.运筹学中排队论在物流中应用: 排队论主要研究具有随机性的拥挤现象,在物流中有许多问题涉及,诸如机场跑道设计和机场设施数量问题, 如何才能既保证飞机起降的使用要求, 又不浪费机场资源又如码头的泊位设计和装卸设备的购置问题, 如何达到既能满足船舶到港的装卸要求, 而又不浪费港口资源等等。四.运筹学中库存论在物流中应用: 库存论主要是研究物资库存策略的理论, 即确定物资库存量、补货频率和一次补货量。合理的库存是生产和生活顺利进行的必要保障, 可以减少资金的占用, 减少费用支出和不必要的周转环节, 缩短物资流通周期, 加速再生产的过程等。在物流领域中的各节点如工厂、港口、配送中心、物流中心、仓库、零售店等都或多或少地保有库存。 五.运筹学中对策论在物流中应用: 对策论研究有利害冲突的双方在竞争性的活动中是否存在自己制胜对方的最优策略, 以及如何找出这些策略等问题。在这些问题中, 把双方的损耗用数量来描述, 并找出双方最优策略。对策论的发展, 考虑有多方参加的竞争活动, 在这些活动中, 竞争策略要通过参加者多次的决策才能确定。参考文献: [1] 左元斌.运筹学在物流配送中心的应用研究[J].商场现代化,2006(458):125-127.[2] 李宇鸣.浅谈运筹学在物流管理中应用与发展[J].吉林工商学报,2007(4):55-56.[3] 田进波.运筹学在管理物流管理中的应用[J].石油工程建设,2010(36):153-155.LINDO求解目标规划: 题目:一个小型的无线电广播台考虑如何最好地来安排音乐、新闻和商业节目时间。依据规定,该台每天允许广播12小时,其中商业节目用以赢利,每小时可收入250美元,新闻节目每小时需支出40美元,音乐节目每播一小时费用为17.50美元。规定中,正常情况下商业节目只能占广播时间的20%,每小时至少安排5分钟新闻节目。问每天的广播节目该如何安排? 优先级如下:P1:满足规定要求;P2:每天的纯收入最大。试建立该问题的目标规划模型。 建立目标规划: 设安排商业节目x1小时,新闻x2小时,音乐x3小时,模型为: minzP1d1d2d3P2d4s..tx1x2x3d112x1d22.4x2d1250x140x217.5x3d4d46003 x1,x2,x3,d1,d2,d3,d4,d40LINDO求解: 第一步: 程序: 计算结果: 求解得:d1_+d2_+d3=0 第二步: 程序: 计算结果: 计算结果: 得到一个满意解: *x12.4*x21.0*x38.6d10.0d20.0d30.0d4190.5 LINGO求解目标规划: 题目: minzp1d1p2(d2d2)p3d32x1x211x1x2dd011s..tx12x2d2d2108x110x2dd5633x1,x2,di0程序: 计算结果: 得到一个满意解: x1*3.3*x23.3d10.0d10.0d0.0d20.0d30.0d34.02 层次分析法: 模型: 判断矩阵: 计算结果: xx远整理 质量、环境、职业健康安全管理体系整合的基本方法及步骤 随着ISO9000质量管理标准认证工作的深入开展,也随着国家对环保及职业健康安全的重视,企业逐步意识到环境管理和职业健康安全管理的重要性,建立实施质量、环境、职业健康安全三体系或获得三体系认证的企业也越来越多。就广西水泥企业来说获得三体系认证的组织由2003年的1家(广西东泥股份有限公司)上升为2010年的11家。企业认为开展三体系认证,将会极大提高企业的管理水平。而三个体系的分别建立与认证,必定给企业带来资源的浪费、管理的复杂化等问题,因此许多企业就考虑到了将质量管理体系、环境管理体系和安全健康管理体系结合起来,建立一体化的整合型管理体系,以有利于策划、资源配置、资源共享、减少企业的管理成本,提高管理体系的运行效率。同时向认证机构提出实施一体化审核的要求,即通过一个审核组的一次现场审核,同时获得或保持ISO9001、ISO14001、OHSAS18001认证证书。企业如何建立一个既有效同时满足三个标准的要求,又减少工作数量和运行层次,将质量管理体系、环境管理体系、职业安全健康管理体系整合成一个综合的管理体系呢? 一、必须理解和把握三个标准的兼容性。国际标准化组织在制定ISO9000和ISO14000标准时,在指导思想上已经注意了两个标准的协调。如最早94版9001标准中的“记录控制”、“内部审核”条款前面都加有“质量”两个字,即“质量记录 控制”、“内部质量审核”等。到2000版9001标准改版时,考虑要与ISO14000标准兼容,把“质量记录控制”、“内部质量审核”中“质量”取消了,改为“记录控制”、“内部审核”,一直延用至今。OHSAS18001:2001标准与ISO14001基本上存在一一对应关系。标准条款及标题内容基本一样。采取了同样管理体系的思想与方法。因而三个标准相互趋近,具有较强的兼容性。组织在建立、实施质量、环境、职业健康安全整合管理体系,编制体系文件时,有许多文件可以整合,从而避免文件重复,减少文件数量,降低成本,提高管理效能。 二、识别三个标准的共同点。三个标准制定遵循相同的原理、思想和方法,管理性要求相似,对三体系的整合有良好的基础。三个标准体现相同的管理原则。如: “领导作用”、“全员参与”、“过程方法”、“管理的系统方法”、“持续改进”、“基于事实的决策方法”、“互利的供方关系”等管理原则。三个标准的管理性要求有很多相似的部分。如“文件控制”、“记录控制”、“方针目标”、“组织结构和职责”、“培训、意识和能力”、“资源管理”(如设备管理)、“法律法规要求”、“交流与沟通”、“监视和测量装置的控制”、“纠正措施”、“预防措施”、“内部审核”、“管理评审”等方面。三个标准要求的管理手段和方法一致。都采取系统的方法,建立一个完整的、有效的、文件化的管理体系;都按PDCA循环的思想,通过识别影响质量、环境、职业安全健康的因素,有针对性地制定计划和管理方案,实施运行控制,并采取必要的监视和测量,发现问题,实施改进,实现管理体系的持续有效运行;都要求组织配备适当的资源;都要求通过日常管理的监视和测量、内审、管理评审等管理手段来评价体系的运行状况。 三、作为一个企业整合三个体系必须具有以下基本条件: 1、企业的产品涉及质量、环境、职业安全健康三个方面的要求,企业有愿望实施综合控制。 2、有满足体系整合所需的人力资源和其他资源。 3、组织的资源能实现充分的共享。 4、组织需进行相关标准的宣贯培训。 四、管理体系整合的基本原则: 1、对管理对象相同、管理特性要求基本一致的内容应进行整合。管理对象相同、管理性要求基本一致的内容,如文件控制,控制的对象都是文件,三管理体系标准对文件管理性要求基本一致,都要求文件易于查找,要定期评审,有关岗位都要得到有效版本,要及时从使用场所撤回失效文件,留存的作废文件有标识等,可以整合为一个文件。又如:内部审核控制对象都是内审活动,都要确定审核方案,制定审核程序,审核过程、方法、对审核人员的要求,审核达成的目的都基本一致,也可整合为一个文件。按原则一可整合的通用性体系文件有“文件控制”、“记录控制”、“方针目标”、“组织结构和职责”、“培训、意识和能力”、“资源管理”(如设备管理)、“法律法规要求”、“交流与沟通”、“监视和测量装置的控制”、“纠正措施”、“预防措施”、“内部审核”、“管理评审”等内容。 2、整合后的管理性要求应覆盖三个标准的内容,就高不就低,以三个标准中最高要求为准。只有三个标准的全部要求都满足,才能说明组织建立的整合性管理体系能够确保三体系的管理符合规定的要求。如:ISO14001、OHSAS18001标准对管理体系文件没有明确要求编制管理手册。而ISO9001标准则明确要求组织编制质量手册。如果整合编制管理手册则要编制满足三个标准要求的综合管理手册。管理手册的内容应说明包括ISO9001和ISO14001、OHSAS18001标准的全部过程或要素,包括ISO9001标准中是否删减的情况及外包的情况等。又如,ISO14001标准对“法律法规及其他要求”专门列出一个条款,且要求制定程序文件。而ISO9001标准尽管在一些条款中提出了法律法规要求,但没有设置单独条款,如果进行文件整合时,就要按ISO14001标准的要求编制程序文件,描述组织有关法律法规及其他要求的获取、识别、更新的规定。三体系整合时,文件有三体系通用的,也有两体系通用的,如:ISO14001、OHSAS18001标准都存在化学药品控制、放射源控制、应急准备与响应控制情况,故可以将此类文件整合在一起。由于三个标准的关注点不同,体系中有些内容是不能整合的。ISO9001标准的关注的是控制产品质量包括服务质量,确保顾客满意。“与顾客有关的过程”、“顾客满意度测量”、“生产和服务提供”等是质量管理体系所特有的要求,应编制专用文件。ISO14001标准关注的是控制生产销售过程中所产生的环境因素,确保满足众多相关方的要求,满足社会对环境保护的要求,尤其是必须满足环境方面的法律法规要求及一些强制性标准。“环境因素的识别评价”、“环境因素运行控制”、等是环境管理体系所特有的要求,也应编制专用文件。OHSAS18001标准关注的是控制生产销售区域内所有危险源,确保区域内相关方的健康安全。危险源识别与风险评估控制、作业场所噪声、粉尘危害控制、个人防护用品控制、危险作业许可控制等是职业健康安全管理体系所特有的要求,也应编制专用文件。 3、整合后的管理体系文件应具有可操作性,保持文件之间的协调性和针对性。整合后的管理体系程序并不是越多越好,减少文件数量是体系整合的优点。置于多少合适这与组织的规模、人员的素质等有关,编制文件时,首先要满足标准要求编制的要编制,其余的根据实际情况而定。 五、企业进行体系整合的步骤: 1、组织领导层统一思想并做出决策; 2、成立管理体系整合的领导班子和工作班子; 3、分层次进行教育培训,重点是对相关标准及文件编写进行培训; 4、根据法律法规和顾客、相关方、社会、员工的要求、组织的宗旨和管理现状制定组织整合型管理方针; 5、识别质量管理体系所需的过程,识别并评价环境因素和安全风险因素; 6、根据管理方针,制定管理目标和指标; 7、进行整合管理体系的职能分配,明确相应的职责和权限; 8、根据目标指定产品实现、环境和职业安全健康的质量计划或管理方案; 9、编制整合型管理体系文件; 10、发布并宣贯整合型管理体系文件; 11、配备和落实整合型管理体系所要求的人力、基础设施和其他资源; 12、试运行3-6个月; 13、培训并聘任满足整合型管理体系要求的内审员; 14、进行至少一次依据三个标准、覆盖全部管理部门和要求的内部审核; 15、跟踪评审不符合项纠正措施; 16、召开管理评审会、评价整合型管理体系的适宜性、充分性和有效性,并提出持续改进方向。 17、实施改进,保持管理体系的有效运行。质量、环境、职业健康安全管理体系职责分配与实施体会 任何一个组织在建立管理体系前,都会设立有自己的组织机构并制定职责权限,也都在正常运行。但增加了质量、环境、职业健康安全三体系后职责又该如何划分呢,我个人认为,选一个部门(可以是化验室、办公室或生产科等由组织根据实际情况定)除了负责原来的 职能外,增加主控三个管理体系的职责(主要职责附后),主控部门主要负责整体管理,各相关专业部门如环保部、生产安全部则负责专业的管理如制订专业的文件、日常的检查等。主控部门三个管理体系的主要职责及实施: a组织公司文件(包括各部门的分目标及目标管理方案、)的编写、日常管理、控制发放,记录表格的控制。b通过各种渠道定期收集最适用的、新版本的法律法规,根据法规的内容发至相关的部门。c组织识别公司环境因素、危险源,评价重要环境因素、中高度风险危险源。d负责公司各部门目标及目标管理方案完成情况的检查,并保存检查记录。(检查结果作为下一次管理评审的输入。)e定期组织文件、重要环境因素、中高度风险危险源、法律法规合规性的评审,并保存评审记录。(评审结果作为下一次管理评审的输入。)f协助管代组织“内部审核”、“管理评审”并跟踪不符合项及纠正措施实施情况,并保存审核、评审记录。(审核、评审结果作为下一次管理评审的输入。)g定期向管代汇报三体系运行情况,取得领导对体系工作的支持。第三篇:Lingo,Lindo学习心得
第四篇:运筹学的应用简介及实例(lindo,lingo,ahp)
第五篇:优化管理体系