1、[例1]某化工集团公司有6 个化工厂,每个化工厂的位置(用平面坐标a, b 表示,距离单位为km)及化工原料日用量m t 由表给出. 目前有两个炼油厂位于A(5, 1),B(2, 7),日产化工原料量各有20t. 假设从炼油厂到化工厂之间均有直线道路相连.试制订每天的供应计划,即从A, B 两个炼油厂分别向各化工厂运送多少吨化工原料,使总的运力(吨千米数)最小.表1 化工厂位置及日用量
2、问题分析 每天两个炼油厂给6 个化工厂各提供多少原料,共需12 个决策变量. 需要满足两方面的约束,一方面要满足各化工厂的需求,另一方面受到炼油厂产量限制. 目标是总运力最小. 计算总运力用到直线距离,所以目标函数不是线性函数,应该建立非线性规划模型.模型建立设化工厂的位置为(ai ,bi ),水泥日用量为mi,i 为1,2,......6;炼油厂位置为(xj , y j ) ,日储量为nj,j =1,2;从炼油厂j向化工厂i的运送量为Xij .目标函数为:
3、在盟敢势袂lingo17编辑器中输入程序源代码:model:sets:CP:gx,gy,m;Refinery:n,x,y;c(伊怕锱鳏Refinery,CP):share;endsetsmin=@sum(Refinery(i):@sum(CP(j):((x(i)-gx(j))^2+(y(i)-gy(j))^2)^0.5*share(i,j)));@for(CP(j):@sum(Refinery(i):share(i,j))=m(j));@for(Refinery(i):@sum(CP(j):share(i,j))<n(i));data:gx,gy,m,x,y,n=@ole('d:\data.xls','gx','gy','m','x','y','n');@ole('d:\data.xls','share')=share;enddataend如图所示:
4、本例可建立Excel 工作表,文件位置为:d:\data.xls, 打开Excel 2016,在A1:J6,输入数据,请自行根据题意,体会如此输入数据的含义,如图所示:
5、点击"公式"菜单,选择"定义名称"选项,定义好相应数据域,请自行体会根据程序中以及图表中的变量名白镢梧螂称含义与相应数据域名称相关联,将程序变量名称定义的数据域名称已显示在data.xls表中,在程序代码:gx,gy,m,x,y,n=@ole('d:\data.xls','gx','gy','m','x','y','n')中,注意由于excel自行默认赋予属性,所以属性Refinery,CP可以默认不定义,只有六个相应变量名,分别为:'gx','gy','m','x','y','n',其相应变量定义的数据区域名称:'gx':Sheet1!$B$2:$G$2,'gy':Sheet1!$B$3:$G$3,'m':Sheet1!$B$4:$G$4,'n':Sheet1!$H$5:$H$6,'x':Sheet1!$I$5:$I$6,''y':Sheet1!$J$5:$J$6,另外'share'变量名,为需要输出的结果数据区域变量名,'share':=Sheet1!$B$5:$G$6,如图所示:
6、请注意在准备运行Lingo程序前,不要关闭Excel的data.xls文件,注意如果是高版的excel文件,data的扩展名可能为xlsx,点击"Debug"菜单,选择"Run"子菜单项,就可以得到此题的运行结果,如图所示:
7、此时,我们可以从Excel表格,得到本题的答案,如图所示:
8、从Excel表格,我们可以得到本题的答案为:即从A, B 两个炼油厂分别向各化工厂运送多少吨化工原料,使总的运力(吨千米数)最小.最小运力为 140.5404,如图所示:
9、如果大家觉得不错的话,喜欢就请点个赞,分享给你身边的朋友吧,我将发布更多的教程,Excel不同的版本可能细节上有些细微区别,请自行留意注意区别。