一文读懂遗传算法工作原理!

article/2025/6/12 21:00:19

简介

几天前,我着手解决一个实际问题——大型超市销售问题。在使用了几个简单模型做了一些特征工程之后,我在排行榜上名列第 219 名。

虽然结果不错,但是我还是想做得更好。于是,我开始研究可以提高分数的优化方法。结果我果然找到了一个,它叫遗传算法。在把它应用到超市销售问题之后,最终我的分数在排行榜上一下跃居前列。

没错,仅靠遗传算法我就从 219 名直接跳到 15 名,厉害吧!相信阅读完本篇文章后,你也可以很自如地应用遗传算法,而且会发现,当把它用到你自己正在处理的问题时,效果也会有很大提升。

目录

1、遗传算法理论的由来

2、生物学的启发

3、遗传算法定义

4、遗传算法具体步骤

  • 初始化
  • 适应度函数
  • 选择
  • 交叉
  • 变异

5、遗传算法的应用

  • 特征选取
  • 使用 TPOT 库实现

6、实际应用

7、结语

1、遗传算法理论的由来

我们先从查尔斯·达尔文的一句名言开始:

能够生存下来的往往不是最强大的物种,也不是最聪明的物种,而是最能适应环境的物种。

能够生存下来的往往不是最强大的物种,也不是最聪明的物种,而是最能适应环境的物种。

你也许在想:这句话和遗传算法有什么关系?其实遗传算法的整个概念就基于这句话。

让我们用一个基本例子来解释 :

我们先假设一个情景,现在你是一国之王,为了让你的国家免于灾祸,你实施了一套法案:

  • 你选出所有的好人,要求其通过生育来扩大国民数量。
  • 这个过程持续进行了几代。
  • 你将发现,你已经有了一整群的好人。

这个例子虽然不太可能,但是我用它是想帮助你理解概念。也就是说,我们改变了输入值(比如:人口),就可以获得更好的输出值(比如:更好的国家)。现在,我假定你已经对这个概念有了大致理解,认为遗传算法的含义应该和生物学有关系。那么我们就快速地看一些小概念,这样便可以将其联系起来理解。

2、生物学的启发

相信你还记得这句话:「细胞是所有生物的基石。」由此可知,在一个生物的任何一个细胞中,都有着相同的一套染色体。所谓染色体,就是指由 DNA 组成的聚合体。

传统上看,这些染色体可以被由数字 0 和 1 组成的字符串表达出来。

一条染色体由基因组成,这些基因其实就是组成 DNA 的基本结构,DNA 上的每个基因都编码了一个独特的性状,比如,头发或者眼睛的颜色。希望你在继续阅读之前先回忆一下这里提到的生物学概念。结束了这部分,现在我们来看看所谓遗传算法实际上指的是什么?

3、遗传算法定义

首先我们回到前面讨论的那个例子,并总结一下我们做过的事情。

  1. 首先,我们设定好了国民的初始人群大小。
  2. 然后,我们定义了一个函数,用它来区分好人和坏人。
  3. 再次,我们选择出好人,并让他们繁殖自己的后代。
  4. 最后,这些后代们从原来的国民中替代了部分坏人,并不断重复这一过程。

遗传算法实际上就是这样工作的,也就是说,它基本上尽力地在某种程度上模拟进化的过程。

因此,为了形式化定义一个遗传算法,我们可以将它看作一个优化方法,它可以尝试找出某些输入,凭借这些输入我们便可以得到最佳的输出值或者是结果。遗传算法的工作方式也源自于生物学,具体流程见下图:

那么现在我们来逐步理解一下整个流程。

4、遗传算法具体步骤

为了让讲解更为简便,我们先来理解一下著名的组合优化问题「背包问题」。如果你还不太懂,这里有一个我的解释版本。

比如,你准备要去野游 1 个月,但是你只能背一个限重 30 公斤的背包。现在你有不同的必需物品,它们每一个都有自己的「生存点数」(具体在下表中已给出)。因此,你的目标是在有限的背包重量下,最大化你的「生存点数」。

4.1 初始化

这里我们用遗传算法来解决这个背包问题。第一步是定义我们的总体。总体中包含了个体,每个个体都有一套自己的染色体。

我们知道,染色体可表达为二进制数串,在这个问题中,1 代表接下来位置的基因存在,0 意味着丢失。(译者注:作者这里借用染色体、基因来解决前面的背包问题,所以特定位置上的基因代表了上方背包问题表格中的物品,比如第一个位置上是 Sleeping Bag,那么此时反映在染色体的『基因』位置就是该染色体的第一个『基因』。)

现在,我们将图中的 4 条染色体看作我们的总体初始值。

4.2 适应度函数

类似地,对于 A2 染色体 [001110] 来说,有:

对于这个问题,我们认为,当染色体包含更多生存分数时,也就意味着它的适应性更强。

因此,由图可知,染色体 1 适应性强于染色体 2。

4.3 选择

现在,我们可以开始从总体中选择适合的染色体,来让它们互相『交配』,产生自己的下一代了。这个是进行选择操作的大致想法,但是这样将会导致染色体在几代之后相互差异减小,失去了多样性。因此,我们一般会进行「轮盘赌选择法」(Roulette Wheel Selection method)。

想象有一个轮盘,现在我们将它分割成 m 个部分,这里的 m 代表我们总体中染色体的个数。每条染色体在轮盘上占有的区域面积将根据适应度分数成比例表达出来。

基于上图中的值,我们建立如下「轮盘」。

现在,这个轮盘开始旋转,我们将被图中固定的指针(fixed point)指到的那片区域选为第一个亲本。然后,对于第二个亲本,我们进行同样的操作。有时候我们也会在途中标注两个固定指针,如下图:

通过这种方法,我们可以在一轮中就获得两个亲本。我们将这种方法成为「随机普遍选择法」(Stochastic Universal Selection method)。

4.4 交叉

在上一个步骤中,我们已经选择出了可以产生后代的亲本染色体。那么用生物学的话说,所谓「交叉」,其实就是指的繁殖。现在我们来对染色体 1 和 4(在上一个步骤中选出来的)进行「交叉」,见下图:

这是交叉最基本的形式,我们称其为「单点交叉」。这里我们随机选择一个交叉点,然后,将交叉点前后的染色体部分进行染色体间的交叉对调,于是就产生了新的后代。

如果你设置两个交叉点,那么这种方法被成为「多点交叉」,见下图:

4.5 变异

如果现在我们从生物学的角度来看这个问题,那么请问:由上述过程产生的后代是否有和其父母一样的性状呢?答案是否。在后代的生长过程中,它们体内的基因会发生一些变化,使得它们与父母不同。这个过程我们称为「变异」,它可以被定义为染色体上发生的随机变化,正是因为变异,种群中才会存在多样性。

下图为变异的一个简单示例:

变异完成之后,我们就得到了新为个体,进化也就完成了,整个过程如下图:

在进行完一轮「遗传变异」之后,我们用适应度函数对这些新的后代进行验证,如果函数判定它们适应度足够,那么就会用它们从总体中替代掉那些适应度不够的染色体。这里有个问题,我们最终应该以什么标准来判断后代达到了最佳适应度水平呢?

一般来说,有如下几个终止条件:

  1. 在进行 X 次迭代之后,总体没有什么太大改变。
  2. 我们事先为算法定义好了进化的次数。
  3. 当我们的适应度函数已经达到了预先定义的值。

好了,现在我假设你已基本理解了遗传算法的要领,那么现在让我们用它在数据科学的场景中应用一番。

5、遗传算法的应用

5.1 特征选取

试想一下每当你参加一个数据科学比赛,你会用什么方法来挑选那些对你目标变量的预测来说很重要的特征呢?你经常会对模型中特征的重要性进行一番判断,然后手动设定一个阈值,选择出其重要性高于这个阈值的特征。

那么,有没有什么方法可以更好地处理这个问题呢?其实处理特征选取任务最先进的算法之一就是遗传算法。

我们前面处理背包问题的方法可以完全应用到这里。现在,我们还是先从建立「染色体」总体开始,这里的染色体依旧是二进制数串,「1」表示模型包含了该特征,「0 表示模型排除了该特征」。

不过,有一个不同之处,即我们的适应度函数需要改变一下。这里的适应度函数应该是这次比赛的的精度的标准。也就是说,如果染色体的预测值越精准,那么就可以说它的适应度更高。

现在我假设你已经对这个方法有点一概念了。下面我不会马上讲解这个问题的解决过程,而是让我们先来用 TPOT 库去实现它。

5.2 用 TPOT 库来实现

这个部分相信是你在一开始读本文时心里最终想实现的那个目标。即:实现。那么首先我们来快速浏览一下 TPOT 库(Tree-based Pipeline Optimisation Technique,树形传递优化技术),该库基于 scikit-learn 库建立。下图为一个基本的传递结构。

图中的灰色区域用 TPOT 库实现了自动处理。实现该部分的自动处理需要用到遗传算法。

我们这里不深入讲解,而是直接应用它。为了能够使用 TPOT 库,你需要先安装一些 TPOT 建立于其上的 python 库。下面我们快速安装它们:

# installing DEAP, update_checker and tqdm

pip install deap update_checker tqdm

# installling TPOT

pip install tpot

这里,我用了 Big Mart Sales(数据集地址:https://datahack.analyticsvidhya.com/contest/practice-problem-big-mart-sales-iii/)数据集,为实现做准备,我们先快速下载训练和测试文件,以下是 python 代码:

# import basic libraries

importnumpy asnp

importpandas aspd

importmatplotlib.pyplot asplt

%matplotlib inline

fromsklearn importpreprocessing

fromsklearn.metrics importmean_squared_error

## preprocessing

### mean imputations

train[ 'Item_Weight'].fillna((train[ 'Item_Weight'].mean), inplace= True)

test[ 'Item_Weight'].fillna((test[ 'Item_Weight'].mean), inplace= True)

### reducing fat content to only two categories

train[ 'Item_Fat_Content'] = train[ 'Item_Fat_Content'].replace([ 'low fat', 'LF'], [ 'Low Fat', 'Low Fat'])

train[ 'Item_Fat_Content'] = train[ 'Item_Fat_Content'].replace([ 'reg'], [ 'Regular'])

test[ 'Item_Fat_Content'] = test[ 'Item_Fat_Content'].replace([ 'low fat', 'LF'], [ 'Low Fat', 'Low Fat'])

test[ 'Item_Fat_Content'] = test[ 'Item_Fat_Content'].replace([ 'reg'], [ 'Regular'])

train[ 'Outlet_Establishment_Year'] = 2013- train[ 'Outlet_Establishment_Year']

test[ 'Outlet_Establishment_Year'] = 2013- test[ 'Outlet_Establishment_Year']

train[ 'Outlet_Size'].fillna( 'Small',inplace= True)

test[ 'Outlet_Size'].fillna( 'Small',inplace= True)

train[ 'Item_Visibility'] = np.sqrt(train[ 'Item_Visibility'])

test[ 'Item_Visibility'] = np.sqrt(test[ 'Item_Visibility'])

col = [ 'Outlet_Size', 'Outlet_Location_Type', 'Outlet_Type', 'Item_Fat_Content']

test[ 'Item_Outlet_Sales'] = 0combi = train.append(test) fori incol:

combi[i] = number.fit_transform(combi[i].astype( 'str'))

combi[i] = combi[i].astype( 'object')

train = combi[:train.shape[ 0]]

test = combi[train.shape[ 0]:]

test.drop( 'Item_Outlet_Sales',axis= 1,inplace= True)

## removing id variables

tpot_train = train.drop([ 'Outlet_Identifier', 'Item_Type', 'Item_Identifier'],axis= 1)

tpot_test = test.drop([ 'Outlet_Identifier', 'Item_Type', 'Item_Identifier'],axis= 1)

target = tpot_train[ 'Item_Outlet_Sales']

tpot_train.drop( 'Item_Outlet_Sales',axis= 1,inplace= True)

# finally building model using tpot library

fromtpot importTPOTRegressor

X_train, X_test, y_train, y_test = train_test_split(tpot_train, target,

train_size= 0.75, test_size= 0.25)

tpot = TPOTRegressor(generations= 5, population_size= 50, verbosity= 2)

tpot.fit(X_train, y_train)

print(tpot.score(X_test, y_test))

tpot.export( 'tpot_boston_pipeline.py')

一旦这些代码运行完成,tpot_exported_pipeline.py 里就将会放入用于路径优化的 python 代码。我们可以发现,ExtraTreeRegressor 可以最好地解决这个问题。

## predicting using tpot optimised pipeline

tpot_pred = tpot.predict(tpot_test)

sub1 = pd.DataFrame(data=tpot_pred)

#sub1.index = np.arange(0, len(test)+1)

sub1 = sub1.rename(columns = { '0': 'Item_Outlet_Sales'})

sub1[ 'Item_Identifier'] = test[ 'Item_Identifier']

sub1[ 'Outlet_Identifier'] = test[ 'Outlet_Identifier']

sub1.columns = [ 'Item_Outlet_Sales', 'Item_Identifier', 'Outlet_Identifier']

sub1 = sub1[[ 'Item_Identifier', 'Outlet_Identifier', 'Item_Outlet_Sales']]

sub1.to_csv( 'tpot.csv',index= False)

如果你提交了这个 csv,那么你会发现我一开始保证的那些还没有完全实现。那是不是我在骗你们呢?当然不是。实际上,TPOT 库有一个简单的规则。如果你不运行 TPOT 太久,那么它就不会为你的问题找出最可能传递方式。

所以,你得增加进化的代数,拿杯咖啡出去走一遭,其它的交给 TPOT 就行。此外,你也可以用这个库来处理分类问题。进一步内容可以参考这个文档:http://rhiever.github.io/tpot/。除了比赛,在生活中我们也有很多应用场景可以用到遗传算法。

6、 实际应用

遗传算法在真实世界中有很多应用。这里我列了部分有趣的场景,但是由于篇幅限制,我不会逐一详细介绍。

6.1 工程设计

工程设计非常依赖计算机建模以及模拟,这样才能让设计周期过程即快又经济。遗传算法在这里可以进行优化并给出一个很好的结果。

相关资源:

  • 论文:Engineering design using genetic algorithms
  • 地址:http://lib.dr.iastate.edu/cgi/viewcontent.cgi?article=16942&context=rtd

这是一个非常著名的问题,它已被很多贸易公司用来让运输更省时、经济。解决这个问题也要用到遗传算法。

6.3 机器人

遗传算法在机器人领域中的应用非常广泛。实际上,目前人们正在用遗传算法来创造可以像人类一样行动的自主学习机器人,其执行的任务可以是做饭、洗衣服等等。

相关资源:

  • 论文:Genetic Algorithms for Auto-tuning Mobile Robot Motion Control
  • 地址:https://pdfs.semanticscholar.org/7c8c/faa78795bcba8e72cd56f8b8e3b95c0df20c.pdf

希望通过本文介绍,你现在已经对遗传算法有了足够的理解,而且也会用 TPOT 库来实现它了。但是如果你不亲身实践,本文的知识也是非常有限的。

所以,请各位读者朋友一定要在无论是数据科学比赛或是生活中尝试自己去实现它。

原文链接:https://www.analyticsvidhya.com/blog/2017/07/introduction-to-genetic-algorithm/

声明:公众号偶尔转载的文章出于非商业性的教育和科研目的供大家参考和探讨,并不意味着支持其观点或证实其内容的真实性。版权归原作者所有,如转载稿涉及版权等问题,请立即联系我们删除。

广告及商务合作,合推广等,请加微信:posongbi01

弹性力学的研究内容及发展概况
谈弹塑性力学的物性方程:理论与实验终于协调了
理论力学、材料力学与结构力学的关系
一名优秀的工程师首先是力学家
直观的力学性能-动图讲解
浅谈有限元方法的核心思想:数值近似和离散化
有限元四面体网格与六面体网格的争议
关于疲劳问题的有限元分析清单
如何看“力学”
疲劳失效和SN曲线


http://www.hkcw.cn/article/xEupDDgmRv.shtml

相关文章

原创杨丽萍的丈夫刘淳晴说:我们生个孩子吧!杨丽萍却说:离婚吧!

杨丽萍的丈夫刘淳晴说:我们生个孩子吧!杨丽萍答应了。随后,杨丽萍去看了医生。回来后,她对丈夫说:我们离婚吧! 杨丽萍在西双版纳歌舞团时,与第一任老公结婚。在歌舞团的日子,杨丽萍感觉自己到了结婚年龄,加上父母催促,她认为对方人不错,就仓促结婚了。 婚后杨丽萍还…

原创徐帆生日罕见秀恩爱,养女徐朵送妈妈鲜花,冯小刚头发几乎全白了

徐帆57岁生日,养女徐朵甜美庆生,冯小刚甜蜜互动 前言 近日,徐帆的57岁生日成为热门话题,其养女徐朵通过社交平台为其庆生,并晒出一组母女同框照,一时间引发热议。作为知名影视演员,徐帆凭借出色的演技赢得了观众的喜爱,而在娱乐圈中,她与丈夫冯小刚的恩爱婚姻也备受瞩…

任航作品参展影像上海艺术博览会:赤裸、鲜活,无可抗拒的美

玩摄影的应该都知道“任航”这个名字。对于吃瓜群众而言,知道这个名字可能是几个月前他因抑郁而自杀的消息。2017年2月24日,任航选择从28楼坠下,结束了他年轻的生命。任航在其离世前一周摄于斯德哥尔摩,图片来源:The New York Times 任航17岁移居北京,起初只是拿着相机什…

327道!高中数学必修一填空题(含解析),打好基础是重点,收藏

高中数学试卷中,填空题排在第二大题,选择题之后,包含4道题目,共20分。填空题是只要求写出结果不要求计算过程的客观性试题。 填空题跟选择题有许多的共同点:小巧灵活,结构简单运算量不大等特点,考察的知识点范围比较广,根据填空时所填写的内容形式, 学长这里整理了高中…

最难喝的饮料排行榜

在日常生活的饮用中,我们往往会遇到各种口味的饮料供我们选择。然而,并非所有的饮料都受欢迎,有些饮料的口感甚至被公认为史上最难喝的。本篇文章将为您揭晓十大最难喝的饮料排名,供您参考。 第十名:啤儿茶爽是由娃哈哈集团推出的一款具有茉莉花啤酒风味的产品。尽管该产品…

浅尾美和曾是沙排球女,退役拍写真被怒斥为腿太粗

浅尾美和日本的沙滩排球运动员,是世界上公认的沙滩排球美女,曾被称为“沙排仙女”(中国女排运动员张常宁也打过一段时间沙滩排球,也是沙排里面公认的美女)。浅尾美和沙滩排球比赛中 她出生于1986年,2012年12月10日退役。她打沙滩排球的时候,现场观众激增,很多人去就是为…

【海洋百科】——鲸鲨

文章来源:诗巴丹潜水鲸鲨展开全文鲸鲨(学名:Rhincodon typus),又名鲸鲛、豆腐鲨、大憨鲨,是目前世界上体型最大的鱼类,属于软骨鱼纲须鲨目鲸鲨科。截至目前为止,生物学家实际记录到的最大尺寸为12.65米长,21.5公吨重,其他体型更大的个体报告并未确认。鲸鲨为鲸鲨科(…

走近最美纺织工 | 金桂兰:设计让生活更加美好舒适

雨果曾经说:“谁虚度了年华,青春就将褪色。”是的,青春是用来奋斗的,不是用来挥霍的。 ——江苏斯得福纺织股份有限公司金桂兰 “在平凡的工作岗位上有许许多多平凡的劳动者,他们有理想有信念,有娴熟的技能,并勇于创新,在各自岗位默默奉献。‘最美纺织工’推树活动给予…

聚桥文创:企业文化建设必备的三大识别系统是什么?

企业文化是企业发展的动力,也是企业铸就核心竞争力的关键。企业文化建设是一项涉及面广、操作难度大、时间跨度长的工作,关系到企业优劣强弱与兴衰成败。因此,企业文化建设又是企业最重要的一项战略任务。企业要进行文化建设,首先应当了解企业文化中的三大识别系统,分别是…

英雄联盟:LEC夏季赛各战队名单更新,多支战队主力人员并无变动

LOLesports今天在官网放出了LEC赛区的各战队大名单,一起来看吧:EXCEL上单:Expect、Send0o 打野:Caedrel、Taxer 中单:Mickey、Exile、Special AD:Hjarnan、Jeskla 辅助:Mystiques、kaSing 转入: Mickey (APK), Hjarnan (Ad Hoc Gaming) 转出:Innaxe (Unicorns of Love…

大虾用清水洗等于没洗,教您3个技巧,脏东西全跑光,别再做错了

欢迎大家观看二姐这篇大虾用清水洗等于没洗,教您3个技巧,脏东西全跑光的文章。本图文为二姐美食原创作品,严禁转载与抄袭。如果有美食方面的想法,欢迎大家和我交流!二姐美食,教你做家常美味。欢迎大家观看二姐这篇大虾用清水洗等于没洗,教您3个技巧,脏东西全跑光的文章…

《斗破苍穹》药老结局为何被杀?原来我们都理解错了!

在很多人看了《斗破苍穹》之后都会问一个问题,那就是大结局为什么萧炎杀药老?其实这是大家的误解了萧炎。不管是在动画中还是在原著中,药老都只是暂时的沉睡了,而造成沉睡的原因就是因为萧炎的佛怒盛莲威力太大,药老也是为了救萧炎才沉睡的。其实真相是这样的,当时的萧炎…

这种「偷窃」的艺术,为何令那么多人着迷?

点击上方蓝字关注 探图网摄影社区 图文丨全球摄影网(侵删)街头摄影的奇妙之处在于,你无法预设最佳场景,也无法复制它。画面产生的瞬间,在你还未来得及感叹它的奇妙时,它们已经消失了。 ♬ 城市彩蛋,街头恶趣味 英国摄影师马特斯图尔特是当今街头摄影的代表人物之一,他试…

高三全年复习规划表,2024届考生必看!

又是一年高三时, 作为准高考生们, 高三一年有哪些大事需要关注呢? 学年大事记,一张图搞定除了大事记,高三这一年的宝贵时光如何度过你也要知道~ 根据目前大部分学校的教学计划安排,高三复习共分为三个阶段(时间节点只是个大概,同学们不必纠结于此): 第一个阶段:9月初…

原创主持人海霞:21岁成美女主播,嫁大11岁清华教授,51岁当央视主任

央视诞生了很多超级优秀的主持人,比如让自己上综艺、重回新闻撒贝宁是严肃的主持人,董卿是私底下踏实但重回央视舞台却充满诗意的人,或者康辉是行走的新华字典等等。不过,今天我们说的不是上面三位主持人,而是大家熟知的主持人海霞。她曾在央视工作多年,主持过《早间新闻…

现代化学之父拉瓦锡贡献卓著,为何最后竟惨遭砍头

安托万.洛朗德拉瓦锡是18世纪著名化学家、生物学家,被尊称为"现代化学之父"。1743年8月26日拉瓦锡生于巴黎贵族家庭,父亲是一名律师。 在人类的化学史上,拉瓦锡有两大重要贡献。 其一是从实验的角度验证并总结了质量守恒定律。1756 年,多才多艺的俄罗斯科学家罗蒙…

嫦娥和后羿是一对,他们的爱情故事比月老和孟婆还凄美!

嫦娥,上古时期三皇五帝之一帝喾(天帝帝俊)的女儿、后羿(大羿)之妻,其美貌非凡,本称姮娥 ,因西汉时为避汉文帝刘恒的忌讳而改称嫦娥,又作常娥。展开全文图片来自西游记剧照 后羿,本称"羿"、"大羿"、"司羿",五帝时期人物,帝尧的射师.相传嫦…

原创卓越名人对话|诺贝尔化学奖得主迈克尔·莱维特教授:激发科学好奇心和探索欲望

卓越名人对话虚拟访谈系列(文心大模型3.5生成) 诺贝尔化学奖得主迈克尔莱维特教授:激发科学的好奇心和探索欲望 章继刚 今天卓越名人网公众号(以下简称《卓越名人网》)要对话其中一位诺贝尔奖得主,他就是2013年诺贝尔化学奖得主、英国皇家学会院士、斯坦福大学终身教授、…

头条 | 美国“世界和谐基金会”授权的郑重维权声明

经发现国内个别企业或个人冒用美国“世界和谐基金会” (The World Harmony Foundation, Inc(WHF) U.S.A)名义进行非法组织、领导传销活动,以慈善帮扶互助为幌子进行虚假宣传,违法发展会员,收取费用,严重扰乱经济社会秩序。现已有相关个人或企业接受了严厉的刑罚。对此,美…

白术提取物的作用效果,兽用白术提取物的功能主治用法用量配伍和畜牧养殖应用

兽用白术提取物的作用效果,白术提取物的功能主治,白术提取物的兽用用途有哪些?兽用白术提取物的用法用量和配伍禁忌,兽用白术提取物的厂家价格,白术提取物在畜牧养殖方面的应用有哪些?白术提取物的兽用功效是什么? 白术又名于术、于白术,别名山蓟、山芥、山姜、山精、山…