王 冰,刘 赫
(北京动物园,圈养野生动物技术北京市重点实验室,北京 100044)
野生动物的食性纷繁复杂,营养需求也不尽相同。在圈养条件下,野生动物只能采用人类种植的植物和养殖的动物为饲料原料,而且这些饲料原料的种类和数量非常有限,受到地区和季节的影响很大[1-2]。饲料配方是营养的主要载体,也是饲养管理的核心。合理的饲料配方才能保证营养的均衡,利于动物的健康发展。因此,利用有限的饲料原料配置合理的饲料配方是圈养野生动物饲养管理的关键。
野生动物的营养需求主要包括能量、粗蛋白质、粗纤维和粗脂肪等,每种动物根据食性不同,所需的条件也相应不同。野生动物的饲料配方优化需要结合每种动物的营养需求,以及当前可供的饲料原料,建立数学模型。在限定目标函数和多个营养成分指标的约束条件后,计算出适合规定营养成分的饲料配方,发现规定条件中的最优方案,节约饲料成本和消耗。因此,本研究旨在选择恰当的数学模型并将模型转化成应用程序,利用计算机将野生动物的饲粮配方优化,在满足粗蛋白质、粗纤维等约束条件的情况下,以单位配方饲料能量最大。
线性规划的数学模型有很多种形式,为了计算方便,需要将这些数学模型统一成标准型,如下:
线性规划中的一个主要求解方法就是单纯形法,是1947年美国Dantzig创立而来,也是目前饲料配方优化领域的一个重要方法[3]。使用单纯形法求解线性规划通常是建立单纯形表,在对单纯形表进行一系列的迭代运算求解,每迭代一步构造出一个新的单纯形表,见表1。
表1 单纯形表的应用
目前,流行的线性规划运算工具很多,例如Excel、Matlab等,其作为专用的数学工具功能虽然强大,但是系统集成度低,并非专门针对饲料管理设计。每次配制饲料都要在多种软件之间切换,使用非常不方便,而且数据直接的反复录入复制也容易造成混乱。本文将线性规划引擎作为饲料管理信息系统的一个模块纳入到信息系统中,使管理程序、数据库、算法引擎之间相互协作,提高系统的集成度,降低使用复杂度。
本饲料配方系统采用MVC架构,用户通过浏览器查询饲料原材料,选择好希望加入配方的原料后,通过网络提交到服务器,服务器运算后返回给用户饲料配方结果经过适当调整后自动保存至数据库。操作始终在一个系统内完成,不需要其他软件辅助。应用系统运行环境为ASP.net 4.5,数据库采用SQLServer 2012。MVC架构包括Model、View、Controller 3部分组成,交互界面对应View控制层对应Controller,业务层及线性规划计算引擎对应Model。MVC设计使每层之间都是松耦合的,界面的改变不会影响业务逻辑和算法引擎,而算法引擎的改变也不会影响界面的显示。
本系统中用单纯形法解决线性规划问题使用的是迭代运算求最优解,通过编程实现单纯形法自动演算。目前主要的计算方法有:大M法和两阶段法。其中两阶段法比较适合应用于计算机运算。第一阶段:不考虑原问题是否存在基可行基;给原线性规划问题加入人工变量,并构造仅含人工变量的目标函数和要求实现最小化。然后用单纯形法求解。若值带入目标函数为0,说明有可行基,否则无可行解,停止运算。第二阶段:将第一阶段计算结果得到最终表,除去人工变量。将目标函数的系数换成原问题的目标函数系数,作为第二阶段的初始表,然后进行迭代运算。
核心算法采用面向对象编程,主要包含两类。格式化类:负责将用户录入的数据格式化成单纯形法迭代运算需要的数据格式。运算类:负责对数据进行运算最后返回结果。面向对象的编程,封装了内部的运算逻辑只暴露出用户必须使用的函数。这样的设计模式减少了程序代码之间的耦合,增强了代码的复用性。如果将来系统希望使用目标规划作为运行引擎,只要更改少量代码即可满足需求。
前端设计采用EasyUI框架提供的组件,用户选择配方需要的饲料以及营养成分,然后点击“生成矩阵”页面自动切换到矩阵编辑页面。可以修改约束条件以及价值系数和目标函数系数,然后点击“计算”后将数据无刷新上传至服务,通过运算返回结果。根据需求添加所需计算的饲料,再添加所提供的营养成分条件,如蛋白质、脂肪、纤维素等,同时还需要添加保证尽可能多饲料的百分比条件。
输入目标函数系数以及相应的约束条件参数后,输出结果满足约束条件以及目标函数最大化原则。以野生水禽的饲料配方设计为例,原料有鸡蛋、胡萝卜、油菜和颗粒料,要求能量最大,粗蛋白质>10%,粗脂肪<5%,粗纤维>2%。根据目标输入后计算结果如表2所示:颗粒饲料61.4%、胡萝卜13.6%、鸡蛋10%、油菜5%。
表2 野生水禽饲料配方优化设计应用
再以圈养食草动物为例,原料有食草颗粒、干羊草、鲜苜蓿、胡萝卜,要求能量最大,粗蛋白质>12%,粗脂肪<3%,粗纤维>30%。根据目标输入后计算结果如表3所示。
表3 野生食草动物饲料配方优化设计应用
目前饲料配方的优化和设计主要采用线性规划、目标规划和模糊线性规划3种方式,每种优化模型各有特点[4-5]。线性规划模型是最简单、最准确的方法,不会因为建模不当而导致不合理的配方[6]。目标规划是处理多个目标共存,以及主目标与次目标共存时常用的数学模型。目标规划虽然貌似适合解决饲料配方这种多目标问题,但是目标规划中“权系数”选择的偏差会直接影响结果的有效性,而“权系数”选择没有标准的公式,需要经验积累,对于普通使用者来讲,这是有一定难度的。显然,目标规划并不适合作为饲料配方的最佳算法。根据需求,选择经典的线性规划数学模型是比较稳妥的方案。
通过线性规划中的单纯形法求解饲料配方,建模简便,适合计算机编程辅助运算,减少了人工盲目试算,提高了效率。然而,线性规划也有其自身的不足,线性规划只能有一个目标函数而实际饲料配方中往往目标不止一个。饲料配方是一门经验性科学,有些配方是多年经验总结,无法完全通过模型配置所需配,还需结合实际情况,以及动物本身的状况进行参考。而且,在数学建模中无法列出足够完备的约束方程,往往只要几种原材料就能满足约束条件,从而导致结果偏差,这显然违背了饲料配方多样性的原则。为了解决上述问题,可以在饲料配比中预留调整空间,进行人工干预,这个预留比例约为15%,以便酌情添加其他原料。
利用单纯形法解决线性规划问题是饲料配方优化应用中的主要方法,建模简单、结果准确。通过设定特殊的约束条件和目标函数通过经验积累也可以模拟出目标规划的效果。由于本系统开发时考虑到数学模型需要不断的优化和提升,在系统设计上尽量减少程序间的耦合。这为今后饲料配方系统的升级打下了良好的基础,为饲料配方的优化核心算法提供依据。