王 冰,劉 赫
(北京動物園,圈養(yǎng)野生動物技術(shù)北京市重點(diǎn)實(shí)驗(yàn)室,北京 100044)
野生動物的食性紛繁復(fù)雜,營養(yǎng)需求也不盡相同。在圈養(yǎng)條件下,野生動物只能采用人類種植的植物和養(yǎng)殖的動物為飼料原料,而且這些飼料原料的種類和數(shù)量非常有限,受到地區(qū)和季節(jié)的影響很大[1-2]。飼料配方是營養(yǎng)的主要載體,也是飼養(yǎng)管理的核心。合理的飼料配方才能保證營養(yǎng)的均衡,利于動物的健康發(fā)展。因此,利用有限的飼料原料配置合理的飼料配方是圈養(yǎng)野生動物飼養(yǎng)管理的關(guān)鍵。
野生動物的營養(yǎng)需求主要包括能量、粗蛋白質(zhì)、粗纖維和粗脂肪等,每種動物根據(jù)食性不同,所需的條件也相應(yīng)不同。野生動物的飼料配方優(yōu)化需要結(jié)合每種動物的營養(yǎng)需求,以及當(dāng)前可供的飼料原料,建立數(shù)學(xué)模型。在限定目標(biāo)函數(shù)和多個營養(yǎng)成分指標(biāo)的約束條件后,計(jì)算出適合規(guī)定營養(yǎng)成分的飼料配方,發(fā)現(xiàn)規(guī)定條件中的最優(yōu)方案,節(jié)約飼料成本和消耗。因此,本研究旨在選擇恰當(dāng)?shù)臄?shù)學(xué)模型并將模型轉(zhuǎn)化成應(yīng)用程序,利用計(jì)算機(jī)將野生動物的飼糧配方優(yōu)化,在滿足粗蛋白質(zhì)、粗纖維等約束條件的情況下,以單位配方飼料能量最大。
線性規(guī)劃的數(shù)學(xué)模型有很多種形式,為了計(jì)算方便,需要將這些數(shù)學(xué)模型統(tǒng)一成標(biāo)準(zhǔn)型,如下:
線性規(guī)劃中的一個主要求解方法就是單純形法,是1947年美國Dantzig創(chuàng)立而來,也是目前飼料配方優(yōu)化領(lǐng)域的一個重要方法[3]。使用單純形法求解線性規(guī)劃通常是建立單純形表,在對單純形表進(jìn)行一系列的迭代運(yùn)算求解,每迭代一步構(gòu)造出一個新的單純形表,見表1。
表1 單純形表的應(yīng)用
目前,流行的線性規(guī)劃運(yùn)算工具很多,例如Excel、Matlab等,其作為專用的數(shù)學(xué)工具功能雖然強(qiáng)大,但是系統(tǒng)集成度低,并非專門針對飼料管理設(shè)計(jì)。每次配制飼料都要在多種軟件之間切換,使用非常不方便,而且數(shù)據(jù)直接的反復(fù)錄入復(fù)制也容易造成混亂。本文將線性規(guī)劃引擎作為飼料管理信息系統(tǒng)的一個模塊納入到信息系統(tǒng)中,使管理程序、數(shù)據(jù)庫、算法引擎之間相互協(xié)作,提高系統(tǒng)的集成度,降低使用復(fù)雜度。
本飼料配方系統(tǒng)采用MVC架構(gòu),用戶通過瀏覽器查詢飼料原材料,選擇好希望加入配方的原料后,通過網(wǎng)絡(luò)提交到服務(wù)器,服務(wù)器運(yùn)算后返回給用戶飼料配方結(jié)果經(jīng)過適當(dāng)調(diào)整后自動保存至數(shù)據(jù)庫。操作始終在一個系統(tǒng)內(nèi)完成,不需要其他軟件輔助。應(yīng)用系統(tǒng)運(yùn)行環(huán)境為ASP.net 4.5,數(shù)據(jù)庫采用SQLServer 2012。MVC架構(gòu)包括Model、View、Controller 3部分組成,交互界面對應(yīng)View控制層對應(yīng)Controller,業(yè)務(wù)層及線性規(guī)劃計(jì)算引擎對應(yīng)Model。MVC設(shè)計(jì)使每層之間都是松耦合的,界面的改變不會影響業(yè)務(wù)邏輯和算法引擎,而算法引擎的改變也不會影響界面的顯示。
本系統(tǒng)中用單純形法解決線性規(guī)劃問題使用的是迭代運(yùn)算求最優(yōu)解,通過編程實(shí)現(xiàn)單純形法自動演算。目前主要的計(jì)算方法有:大M法和兩階段法。其中兩階段法比較適合應(yīng)用于計(jì)算機(jī)運(yùn)算。第一階段:不考慮原問題是否存在基可行基;給原線性規(guī)劃問題加入人工變量,并構(gòu)造僅含人工變量的目標(biāo)函數(shù)和要求實(shí)現(xiàn)最小化。然后用單純形法求解。若值帶入目標(biāo)函數(shù)為0,說明有可行基,否則無可行解,停止運(yùn)算。第二階段:將第一階段計(jì)算結(jié)果得到最終表,除去人工變量。將目標(biāo)函數(shù)的系數(shù)換成原問題的目標(biāo)函數(shù)系數(shù),作為第二階段的初始表,然后進(jìn)行迭代運(yùn)算。
核心算法采用面向?qū)ο缶幊?,主要包含兩類。格式化類:?fù)責(zé)將用戶錄入的數(shù)據(jù)格式化成單純形法迭代運(yùn)算需要的數(shù)據(jù)格式。運(yùn)算類:負(fù)責(zé)對數(shù)據(jù)進(jìn)行運(yùn)算最后返回結(jié)果。面向?qū)ο蟮木幊蹋庋b了內(nèi)部的運(yùn)算邏輯只暴露出用戶必須使用的函數(shù)。這樣的設(shè)計(jì)模式減少了程序代碼之間的耦合,增強(qiáng)了代碼的復(fù)用性。如果將來系統(tǒng)希望使用目標(biāo)規(guī)劃作為運(yùn)行引擎,只要更改少量代碼即可滿足需求。
前端設(shè)計(jì)采用EasyUI框架提供的組件,用戶選擇配方需要的飼料以及營養(yǎng)成分,然后點(diǎn)擊“生成矩陣”頁面自動切換到矩陣編輯頁面。可以修改約束條件以及價(jià)值系數(shù)和目標(biāo)函數(shù)系數(shù),然后點(diǎn)擊“計(jì)算”后將數(shù)據(jù)無刷新上傳至服務(wù),通過運(yùn)算返回結(jié)果。根據(jù)需求添加所需計(jì)算的飼料,再添加所提供的營養(yǎng)成分條件,如蛋白質(zhì)、脂肪、纖維素等,同時還需要添加保證盡可能多飼料的百分比條件。
輸入目標(biāo)函數(shù)系數(shù)以及相應(yīng)的約束條件參數(shù)后,輸出結(jié)果滿足約束條件以及目標(biāo)函數(shù)最大化原則。以野生水禽的飼料配方設(shè)計(jì)為例,原料有雞蛋、胡蘿卜、油菜和顆粒料,要求能量最大,粗蛋白質(zhì)>10%,粗脂肪<5%,粗纖維>2%。根據(jù)目標(biāo)輸入后計(jì)算結(jié)果如表2所示:顆粒飼料61.4%、胡蘿卜13.6%、雞蛋10%、油菜5%。
表2 野生水禽飼料配方優(yōu)化設(shè)計(jì)應(yīng)用
再以圈養(yǎng)食草動物為例,原料有食草顆粒、干羊草、鮮苜蓿、胡蘿卜,要求能量最大,粗蛋白質(zhì)>12%,粗脂肪<3%,粗纖維>30%。根據(jù)目標(biāo)輸入后計(jì)算結(jié)果如表3所示。
表3 野生食草動物飼料配方優(yōu)化設(shè)計(jì)應(yīng)用
目前飼料配方的優(yōu)化和設(shè)計(jì)主要采用線性規(guī)劃、目標(biāo)規(guī)劃和模糊線性規(guī)劃3種方式,每種優(yōu)化模型各有特點(diǎn)[4-5]。線性規(guī)劃模型是最簡單、最準(zhǔn)確的方法,不會因?yàn)榻2划?dāng)而導(dǎo)致不合理的配方[6]。目標(biāo)規(guī)劃是處理多個目標(biāo)共存,以及主目標(biāo)與次目標(biāo)共存時常用的數(shù)學(xué)模型。目標(biāo)規(guī)劃雖然貌似適合解決飼料配方這種多目標(biāo)問題,但是目標(biāo)規(guī)劃中“權(quán)系數(shù)”選擇的偏差會直接影響結(jié)果的有效性,而“權(quán)系數(shù)”選擇沒有標(biāo)準(zhǔn)的公式,需要經(jīng)驗(yàn)積累,對于普通使用者來講,這是有一定難度的。顯然,目標(biāo)規(guī)劃并不適合作為飼料配方的最佳算法。根據(jù)需求,選擇經(jīng)典的線性規(guī)劃數(shù)學(xué)模型是比較穩(wěn)妥的方案。
通過線性規(guī)劃中的單純形法求解飼料配方,建模簡便,適合計(jì)算機(jī)編程輔助運(yùn)算,減少了人工盲目試算,提高了效率。然而,線性規(guī)劃也有其自身的不足,線性規(guī)劃只能有一個目標(biāo)函數(shù)而實(shí)際飼料配方中往往目標(biāo)不止一個。飼料配方是一門經(jīng)驗(yàn)性科學(xué),有些配方是多年經(jīng)驗(yàn)總結(jié),無法完全通過模型配置所需配,還需結(jié)合實(shí)際情況,以及動物本身的狀況進(jìn)行參考。而且,在數(shù)學(xué)建模中無法列出足夠完備的約束方程,往往只要幾種原材料就能滿足約束條件,從而導(dǎo)致結(jié)果偏差,這顯然違背了飼料配方多樣性的原則。為了解決上述問題,可以在飼料配比中預(yù)留調(diào)整空間,進(jìn)行人工干預(yù),這個預(yù)留比例約為15%,以便酌情添加其他原料。
利用單純形法解決線性規(guī)劃問題是飼料配方優(yōu)化應(yīng)用中的主要方法,建模簡單、結(jié)果準(zhǔn)確。通過設(shè)定特殊的約束條件和目標(biāo)函數(shù)通過經(jīng)驗(yàn)積累也可以模擬出目標(biāo)規(guī)劃的效果。由于本系統(tǒng)開發(fā)時考慮到數(shù)學(xué)模型需要不斷的優(yōu)化和提升,在系統(tǒng)設(shè)計(jì)上盡量減少程序間的耦合。這為今后飼料配方系統(tǒng)的升級打下了良好的基礎(chǔ),為飼料配方的優(yōu)化核心算法提供依據(jù)。