adm 发表于 2008-6-11 09:25:12

饲料配方软件的算法

饲料配方软件是饲料配方工作者的重要工具。自从有了饲料配方软件,配方软件的算法改进就成了配方软件设计的核心,算法的好与坏直接关系到配方的成本和营养指标的满足程度。  目前,用于配方软件的算法都是基于线性规划的,经过一系列的修改又产生了所谓的多配方套算、目标规划和模糊规划。虽然这些算法都有一定的特色和优越性,但是,他们仍然具备线性规划最基本的特征。多配方套算则仅仅是改变了线性规划的条件和输出方式而已,实质就是线性规划。
  线性规划
  线性规划是运筹学中研究较早、发展较快、应用广泛、方法较成熟的一个重要分支,它是辅助人们进行科学管理的一种数学方法。在经济管理、交通运输、工农业生产等经济活动中,提高经济效益是人们不可缺少的要求,而提高经济效益一般通过两种途径:一是技术方面的改进,例如改善生产工艺,使用新设备和新型原材料。二是生产组织与计划的改进,即合理安排人力物力资源。线性规划所研究的是在一定条件下,合理安排人力物力等资源,使经济效益达到最好。
  一般的,求线性目标函数在线性约束条件下的最大值或最小值问题,统称为线性规划问题。满足线性约束条件的解叫作可行解,由所有可行解组成的集合叫作可行域。
  线性规划问题数学模型的一般形式:
  (1)列出约束条件及目标函数。
  (2)画出约束条件所表示的可行域。
  (3)在可行域内求目标函数的最优解。
  正是因为利用线性规划可以合理配置资源,从它问世以来,很快就被用来进行饲料配方设计。它可以在满足营养指标和饲料原料使用上下限多个约束条件的情况下,给出最小成本的配方。
  目标规划
  线性规划模型只考虑了单一目标,并且所有约束都要绝对满足。然而,很多问题具有不同衡量单位的多重目标,这样建立一个综合的单一目标即使可能的话,也非常困难。
  目标规划是线性规划的一种变异形式,它容许处理不同层次的相互冲突的多个目标。各目标是分等级的,按优先级处理。在求解过程中,不能牺牲高等级的目标来满足低等级的目标。解决这个问题相当于把高等级目标当作低等级目标的约束,解一系列嵌套的线性规划问题。线性规划是要使单一目标最优化,而目标规划则是要使对目标体系的偏差最小,这样得出的解称为满意解。因为并不一定要满足所有目标,而是要尽量接近目标。
  目标函数仅包含偏差变量(即对目标或正或负的偏差),在同一优先级的偏差变量中,还可以赋予偏差权数以表示其相对重要程度。其目标则是在考虑优先级的前提下,使各优先级的偏差之和最小。全部约束都是等式约束,包括正的或负的偏差变量以及决策变量。
  饲料配方设计有时候也和目标规划相类似,一些条件无法满足的情况下,设计者会根据各个营养要素的重要性,进行相应的取舍,从而得到一个比较满意的配方。
  模糊线性规划
  模糊线性规划是在线性规划及加入伸缩量之后构造一新的线性规划。它能根据原线性规划各项营养成分及原料的影子价格自动按用户给出的伸缩量调整配方,从而得到一个成本低、又满足要求的合理配方。模糊线性规划期望模拟有经验的配方师对线性规划配方进行调整,但是,实质上有经验的配方师调整配方的时候并非完全按照事先确定所谓伸缩变量的规则来调整配方,因而,模糊线性规划也不能完全得出与优秀配方师一样的结果。
  三种计算方法的比较
  三种算法中,计算最为复杂的是模糊线性规划,其次是目标规划。后面两种都是从线性规划发展而来。
  从上面的简述可以看出,三者最大的不同不在于参与计算的条件,其实核心的计算方法都一样,都是线性规划。而后两者之所以能够区别于前者,其主要原因是引入了伸缩变量,也就是说,线性规划的计算条件是相对刚性的,而后两者的计算条件却可以在计算中调整。而目标规划和模糊线性规划的区别又在于目标规划的弹性变量只能靠人为引入,模糊线性规划却可以根据计算后的影子价格自动调整。
  需要指出的是,无论目标规划还是模糊线性规划的伸缩量,都必须由使用者在计算前指定。伸缩量的指定实质上是对饲养标准和原料使用量的调整。既然要对饲养标准和原料使用量进行调整,使用者就必须对动物营养和饲料科学知识有一定了解。
  在应用中,无论是目标规划还是模糊线性规划,使用者一般都会追求最低成本。由于在刚性条件下,线性规划的最优解已经是成本最低值,毫无疑问,目标规划和模糊线性规划都是并且只能通过牺牲营养指标的满足程度来获得更低成本。一般自己调整饲养标准和原料的添加比例,用线性规划按照自己的意愿来进行配方设计,而不是直接使用目标规划和模糊线性规划。
  三种算法的弊端
  因为这三种算法的核心都是线性规划,而线性规划的目标是获得最理想的结果。如果不人为设置某些常用原料的使用量,可能会因为原料价格的小小波动导致某种原料的使用与否,这样的话,动物对原料的剧烈变动不一定能适应。即便动物能够承受,一个厂家也没有那么大的仓储能力来满足原料选择的迅速变动。
  另外,这三种算法都是以获得单位营养浓度成本最低为原则计算的,实际上动物生产中饲料营养素浓度是可以在一定范围内变化的。需要指出的是,这种变化应该是按照预先设定的模型按比例变化,并非单独降低或者提高某个指标,如果期望利用大幅度改变营养素之间比例导致营养素之间的比例偏离,已经成熟的模型太远来求得配方成本下降,从而达到生产效益最高,最终只能导致营养素的浪费和总成本的上升。而参与计算的营养素浓度值得到的配方却不一定是性价比最高的,真正性价比最高的配方可能会略微提高或者降低营养素浓度才能达到,这也是线性规划为基础的所有算法的最大弊端。因为目前的线性规划还不能把某种营养素和价格之比(暂且称为性价比)作为线性规划的目标。也就是说,纯粹的线性规划程序无法得到效益配方。(作者:四川省畜牧科学研究院 易礼胜)

gujunjian52 发表于 2008-8-28 22:59:41

好文章!就是太专业。谢谢了!

ktz 发表于 2009-3-31 12:55:06

看看我的思路:(绝对原创)很多专家认为是“疯狂的思路”


说明:以下技术在“智能二代”饲料软件中基本上采用自动运行功能,不需要软件使用者掌握,仅供技术交流之用.

1,数据索引


   “智能二代”软件采用数据索引技术来提取营养需求标准。目的有两个:一是为提取数据更方便(操作简单)。二对提取的类型容易被软件识别。现在的”智能二代”软件不仅可以配置单胃、双胃的动物饲料,而且还可以对人类的营养配餐进行精确的计算。软件中的配方算法是通用的,唯有配方筛选时需要自动分辨单胃、双胃还是人类的营养配餐。故此数据索引主要是为配方筛选而准备的。
“智能二代”软件的数据索引采取是最高10层索引方式,主要形式如下:
1

11
生长育肥猪《瘦肉型》
111
1-5公斤 仔猪
112
5-10公斤 仔猪
113
10-20公斤 仔猪
114
20-35公斤 生长猪
115
35-60公斤 生长猪
116
60-90公斤 肥育猪
12
生长育肥猪
121
5-15公斤(乳猪)
122
通过上面的例子,很容易就能掌握上面数据索引的制作方法。会了“智能二代”软件数据索引的制作方法就可以在软件中添加各个种类的营养需求了。10层索引方式从理论上讲可以添加超过十亿营养需求。


2,计算精度


    在最初的“智能二代”软件中我采用的是双精度计算,偶然的一个机会发现取小数点后的十为位同双精度计算配方所得的结果差别微小,为了微小的差别而耗费宝贵的内存很不值得。所以现在“智能二代”软件采取自定义的方式,让用户根据自己电脑配置进行设置。为了避免产生错误,通过软件给出了最小值。在2008.2.28版本中非注册用户不能修改.
3,温度计算
根据温度生成各项营养需求其实是一个非常成熟的理论,算法编写也很简单,这里只介绍一下温度生成的参数截面.根据温度生成各项营养需求这个功能在试用版中被禁止使用.
 
上面的数据修改需要密码授权


4,根据实际生长生成营养需求


根据实际生长生成营养需求是提高养殖效益的一个很好的方法,通过数据索引,综合考虑同一种类所有的数据很容易就计算出某一点的营养需求量既实际生长生成营养需求.


5,配方筛选


配方筛选是这么多年一直困绕我的问题,困难在于始终有按下葫芦浮起瓢的感觉.以前我试用过十几个方法解决,但结果一直不令我满意.在升级到2008.2.28版本前,终于解决了这个问题.可能同我的长期思考、运气有关系。筛选的结果超出了我的最大预期。配方筛选问题解决了,软件中的梯度计算实际成了个多余的功能。


6,梯度计算


梯度计算是针对特殊配方计算而设定的。举个例子说明一下:假如配置16%蛋白的饲料,而所有的原料的蛋白含量都小于16%,软件该怎么办?为了解决这个特殊的配方问题,“智能二代”软件加入了梯度计算功能。在2008.2.28版本梯度计算功能仍然保留。


7,原料限量


原料限量是我最不想在“智能二代”软件中加入的功能,但在2008.2.28版本我加入了,因为我惹不起这个行业的传统势力!在”智能二代”软件中原料限量功能可用、可不用。具体情况,根据用户的习惯而定。


8,饲料软件智能化问题


智能化其实并不复杂,只要通过巧妙的构思,编写难度很一般。在“智能二代”软件中很多地方体现智能化。我举的简单的例子:2008.2.28版本引入了经验阐述问题,只要是是设计出格式来,让计算机读懂,一切都完事大吉了。在这种阐述中不需要多么详细,把人人共知的知识告诉电脑就可以了。


9,自动运行


在“智能二代”软件以前版本有个自动运行功能。每天只要打开计算机,不需任何操作,就能计算出所需的饲料配方。现在配方筛选算法过关,实现这个功能100%没有问题了。由于在升级过程中,我删除了大部分识别人机操作源码,在新版中这个功能不能运行了。


10,配方计算算法


“智能二代”软件的配方计算算法是我最得意的,这个算法是一个通用算法,它可以计算单胃、双胃动物和人的营养配餐。由于这个算法具有保密性,在此不进行全部详细的介绍,只介绍”智能二代”软件算法最基本的的原理之一:优先级。
“智能二代”软件算法最基本的的原理:是对营养需求(目标)数据进行优先级处理。例如:对常规饲料配方的计算中,首先考虑蛋白,再计算能量,再计算钙、磷等等。这个优先级数据设定是由软件中的数据文件所决定的,也就是说,任何软件使用者,都可以根据自己的想法进行优先级设定。
在能量的优先级的设定上,可能有些人会有疑问,猪、鸡和反刍动物的能量含义各不相同,应该如何设置?其实处理这个问题很简单。软件在计算前先在能量数据段进行搜索并判断是否为“0”?假如为“0”,继续搜索,直到搜到大于“0” 的数据,并把此数据作为能量需求量。这样大家就会明白了,在能量的优先级的设定上,通过把猪、鸡和反刍动物的能量全设定上,软件就可以分辨出所计算的配方是猪、鸡还是反刍动物的配方。(总磷和有效磷的原理同上)
软件总是先处理优先级高的设定,当这个级别处理完或无法处理,软件才能处理下一个优先级的数据。通过了解数据优先级的处理过程,很容易得出这样的结论,只要有一个优先级被软件处理,就会计算出配方,这也是”智能二代”软件计算配方时不会产生无解的原因。
软件在处理优先级数据时,采用无弹性计算方式。例如:在蛋白这个优先级上,假如蛋白需求是16%,软件就根据16%进行计算。这样才能保证配方营养结果的唯一性和确定性。”智能二代”软件在计算配方时不需要数据建模的原因就在这里。有了唯一性和确定性作基础,”智能二代”软件才能有根据温度和动物的实际生长计算配方的功能。
 
 
11,这个行业需要的是创新精神

......................................................................
“智能二代”软件是本着给个数据就运行的原则编写的,所以对数据要求不高。只要把有营养标准,软件就会根据标准计算出配方。大量的工作是由软件中编码所形成的算法进行完成的,为此总共编写了五万多条。


12,(续)连续筛选


连续筛选功能终于完成了,具体使用方法,大家试一试就应该会使用.这个功能很难编,主要原因是牵涉的内容太多,每种动物,同一动物不同生长阶段的筛选要求不同,所以连续筛选是一个动态过程.假如配方编号处出现"推荐",软件结束这个动态过程,完成连续筛选.真的很高兴!
原想配方计算后软件自动进行连续筛选(编写起来很简单),思来想去还是把这个主动权交给用户.
 
13,(续)超强的计算能力


在计算单胃动物饲料时,”智能二代”饲料软件计算11%、12%的蛋白饲料配方非常轻而易举。在计算反刍动物饲料时,计算7%、8%蛋白的饲料更不在话下。这一点超出了我在软件设计之初的设计要求。我收集了所有能收集到的饲料软件,通过对比发现,能达到”智能二代”这样超强计算能力的,好象没有.

lajirenzzz 发表于 2009-4-12 06:37:46

回 2楼(ktz) 的帖子

卖软件的?报上价格?好像只有猪的饲料配方是吗?

ktz 发表于 2009-4-12 06:51:35

Re:回 2楼(ktz) 的帖子

引用第5楼lajirenzzz于2009-04-12 06:37发表的 回 2楼(ktz) 的帖子 :
卖软件的?报上价格?好像只有猪的饲料配方是吗?

猪鸡都有。
页: [1]
查看完整版本: 饲料配方软件的算法