关键词不能为空

当前您在: 主页 > 英语 >

hopefulgrasshopper-galapagos遗传算法

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-01-20 18:01
tags:

卡希尔-hopeful

2021年1月20日发(作者:campaigner)
Evolutionary Principles applied to
Problem Solving

遗传算法






There is nothing particularly new about Evolutionary Solvers or Genetic Algorithms. The
first references to this field of computation stem from the early 60's when Lawrence J.
Fogel published the landmark paper
first endeavours into evolutionary computing. The early 70's witnessed further forays
with seminal work produced by -among others- Ingo Rechenberg and John Henry
Holland. Evolutionary Computation didn't gain popularity beyond the programmer world
until Richard Dawkins' book
program that generated a seemingly endless stream of body-plans called
based on human selection. Since the 80's the advent of the personal computer has made
it possible for individuals without government funding to apply evolutionary principles to
personal projects and they have since made it into the common parlance.
其实在遗传算法和基因算法里并什么特别新的理论出现,该领域的第一篇文献出现 在六十年代由
Lawrence J. Fogel
出版的具有里程碑意义的论文“智能组织 ”
,这篇论文使人们开始致力于研究遗
传算法。七十年代又由
ngo Rechenberg and John Henry Holland
的工作进一步带动了基因算法
的发展,遗传算法直到
1986
年才因为
Richard Dawkins
的“
The Blind Watchmake
”而让人广
为 人知,里面有个小的例子,基于人类的选择仍然会产生无尽的被称为“生态形变”的动作计划。
80年代由于个人电脑的出现使得每个人都可以将进化算法用于个人项目而不用政府提供资金支持,从
此 ,进化算法开始像日常话题一样进入公众视野。

The term
but they are still very much a programmers tool. 'By programmers for programmers' if
you will. The applications out there that apply evolutionary logic are either aimed at
solving specific problems, or they are generic libraries that allow
other
programmers to
piggyback along. It is my hope that Galapagos will provide a
generic
platform for the
application of Evolutionary Algorithms to be used on a wide variety of problems by
non-
programmers. 虽然现在进化算法在现在已经广为人知,
但他大部分还作为编程工具使用,
只是程序员和程 序员之间
交流,
遗传算法即使应用也是处理一些特别的问题,
大部分时间还是呆在通用 库里等着程序员来用它,
我希望
galapagos
可以提供一个遗传算法的广泛平台 来让那些非编程人员来处理一些问题。


Pros and Cons
赞成和反对


Before we dive into the subject matter too deeply though I feel it is important to
highlight some of the (dis)advantages of this particular type of solver
, just so you know
what to expect. Since we are not living in the best of all possible worlds there is often no
such thing as the perfect solution. Every approach has drawbacks and limitations. In the
case of Evolutionary Algorithms these are luckily well known and easily understood
drawbacks, even though they are not trivial. Indeed, they may well be prohibitive for
many a particular problem.
在我们深入探讨这个问题之前,
我认为有必要向大家介绍这类特殊算法处理方式的优缺点,这样可能
更利于你了解你到底想通过这个获得什么。
事实上我们生活在一个不完美的世界,
没有什么事情会有
一个完美地解决方案,
每个解决方案都会有他的缺陷和限制。
而在遗传算法领域可喜的是我们明确地
知道他的一些缺陷,
而且这些缺陷也不小,
而 且确实在一些具体问题的处理上明确禁止用遗传算法来
解决。

Firstly; Evolutionary Algorithms are slow. Dead slow. It is not unheard of that a single
process may run for days or even weeks. Especially complicated set-ups that require a
long time in order to solve a single iteration will quickly run out of hand. A light/shadow
or acoustic computation for example may easily take a minute per iteration. If we
assume we'll need at least 50 generations of 50 individuals each (which is almost
certainly an underestimate unless the problem has a very obvious solution.) we're
already looking at a two-day runtime.
首先,遗 传算法在运行起来的时候很慢,奇慢,非常慢,慢的要死。一个小程序运行几天甚至几个星
期一点也不见 怪,尤其是需要长时间简单迭代的复杂数据结构,运行起来会马上超出你的掌控,就算
简单的光影分析或 者是声学分析每次迭代就要几分钟,假设我们设置
50
代,每代
50
个个体( 这都是
按照最少最理想的状态来设定的)
,那这个程序需要两天才能做完。

Secondly, Evolutionary Algorithms do not guarantee a solution. Unless a predefined
'good-enough' value is specified, the process will tend to run on indefinitely, never
reaching
The Answer
, or
, having reached it, not recognizing it for what it is.
其次,
遗传算法并不能百分之百的保证求出正确的解,
除非一个预先你已经想好的差不多的解 已经确
定下来,遗传算法会尽量的朝着你想要的那个解努力,但是他永远不会找到“真理”
,当 然,也可能
找到了只不过他是电脑,根本意识不到那个是最优解,即“真理”



All is not bleak and dismal however
, Evolutionary Algorithms have strong benefits as well,
some of them rather unique amongst the plethora of computational methods. They are
remarkably flexible for example, able to tackle a wide variety of problems.
There are
classes of problems which are by definition beyond the reach of even the best solver
implementation and other classes that are very difficult to solve, but these are typically
rare in the province of the human meso- world
. By and large the problems we encounter
on a daily basis fall into the 'evolutionary solvable' category.
当然,遗传算法也并不是上面我说的那么单调无力,一直被 吐槽。进化算法在一些方面也有着强大的
性能体现,在茫茫多的计算算法里他确实一枝独秀,进化算法有 很强的灵活性,能同时处理各种各样
的问题,
有些问题最好的解算器也解不出来,
而且 很多的我们日常遇到的问题都可以放到进化算法的
范畴内进行解决。

Evolutionary Algorithms are also quite forgiving. They will happily chew on problems
that have been under- or over-constrained or otherwise poorly formulated. Furthermore,
because the run-time process is progressive, intermediate answers can be harvested at
practically any time. Unlike many dedicated algorithms, Evolutionary Solvers spew forth
a never ending stream of answers, where newer answers are generally of a higher
quality than older answers. So even a pre-maturely aborted run will yield something
which could be called a result. It might not be a very good result, but it will be a result
of sorts.
进化算法的容忍性也很好,
他很有能力去处理一些你低估或者高估或者很傻
X
的操作,
进一步讲,
因< br>为它运行的时候是动态的,
所以你在任何时候都可以收获一大堆的解而不像其他解算法
( 解完了才能
得到答案)
,进化算法射出来一大堆永远没有尽头的解,而且这一代的解总体上来说 会比上一代的质
量更高,
所以,
尽管一些早产的结果产生我们也可以姑且把他认为是结 果,
虽然他不是最优秀的结果,
但是他确是得到最优结果必不可少的一部分。

Finally, Evolutionary Solvers allow -in principle- for a high degree of interaction with the
user
. This too is a fairly unique feature, especially given the broad range of possible
applications. The run-time process is highly transparent and browsable, and there exists
a lot of opportunity for a dialogue between algorithm and human. The solver can be
coached across barriers with the aid of human intelligence, or it can be goaded into
exploring sub-optimal branches and superficially dead-ends.
最后讲一点,进化算法和用户有很强的交互性, 这是非常特别独特的属性,特别是当你给了他一大堆
可能的条件是。当他在运行起来的时候,求解过程非 常透明也便于浏览,
因此存在很多机会创建人机
交互的对话窗口,引导解算跨过障碍,或者探索 一些并不是很理想的答案,甚至一条死胡同。



The Process
运行特点


In this section I shall briefly outline the process of an Evolutionary Solver run. It is a
highly simplified version of the remainder of the blog post, and I'll skip over many
interesting and even important details. I'll show the process as a series of image frames,
where each frame shows the state of the 'population' at a given moment in time. Before
I can start however
, I need to explain what the image below means.
在这段里我将简单的介 绍一下进化算法是如何运行的,
这些内容都是以前一些博客简化了的,
所以忽
略了一些 有趣甚至重要的细节。
下面我会用一系列的图片来展示他是如何运行的,
每一张图都记录了在特定时刻的“代”的关系,在开始之前,我先解释一下下图是啥意思。






What you see here is the
Fitness Landscape
of a particular model. The model contains
two variables, meaning two values which are allowed to change. In Evolutionary
Computing we refer to variables as
genes
. As we change
Gene A
, the state of the model
changes and it either becomes better or worse (depending on what we're looking for). So
as
Gene A
changes, the fitness of the entire model goes up or down. But for every value
of
A
, we can also vary
Gene B
, resulting in better or worse
combinations of A and B
.
Every combination of A and B results in a particular fitness, and this fitness is expressed
as the height of the Fitness Landscape. It is the job of the solver to find the highest peak
in this landscape.
你可以把上面这张图当成一个特别的景观模型(类似于山脉)
,这个模 型包涵了两个变量,他们可以
同时变化。
在进化算法中我们习惯把变量称为基因。
当我 们改变基因
A
的时候结果会变好或者变坏
(取
决于我们希望他变好还是变坏)
来匹配适合模型的状态。
所以,
当基因
A
改变时,
整个模型 都在变化。
同理,在基因
A
发生变化时,基因
B
也可以同时参与变化 ,这时候出来的结果就是
A

B
同时起的
作用。每一个
A< br>和
B
所产生出来的结果都被反映在这个模型的
Z
轴高度上,因为我们的 任务就是找
出来这个山峰的最高点。

Of course a lot of problems are defined by not just two but many genes, in which case we
can no longer speak of a 'landscape' in the strict sense. A model with 12 genes would be
a 12-dimensional fitness volume deformed in 13 dimensions instead of a
two- dimensional fitness plane deformed in 3 dimensions. As this is impossible to
visualize I shall only use one and two-dimensional models, but note that when we speak
of a
shows. 诚然,大量的问题并非简单的通过两个基因就能确定,而是需要很多基因,所以严格意义上来讲的话
也就不能用景观(山脉)这个概念来解释,你想想看,一个用
12
个变量确定的将会是一个12
维体扭
曲在
13
维空间里,而不再是
2
维平面扭曲 在三维空间里。所以我用一个
2
维的模型是不可能展示出来
12
维物体的,不 过我提到这个只是想说有时候我们研究的要比上面这个
2
维世界的图复杂得多。

As the solver starts it has no idea about the actual shape of the fitness landscape. Indeed,
if we knew the shape we wouldn't need to bother with all this messy evolutionary stuff in
the first place. So the initial step of the solver is to populate the landscape (or

nothing more than a specific value for each and every gene. In the above case, a
genome could for example be {A=0.2 B=0.5}. The solver will then evaluate the fitness
for each and every one of these random genomes, giving us the following distribution:
当这个进化算法开始的时候,
其 实电脑是不知道这个山脉景观的,
如果电脑会像我们一样一眼看出来
这个山脉的高低一开始就不 用这么麻烦的去弄一大堆的数据。所以,在一开始,电脑就要用一大堆随
机的点(基因组)来给他塑形。 基因组就是一组数据,没别的,在这个例子里,一个基因组就相当于
A=0.2 B=0.5
的 一个坐标。电脑计算过每一个随机的基因组,并且适应化之后,我们就可以看到下
图这样的分布。




Once we know how fit every genome is (i.e., the elevation of the red dots), we can make
a hierarchy from fittest to lamest. We are looking for high-ground in the landscape and
it is a reasonable assumption that the higher genomes are closer to potential
high-ground than the low ones. Therefore we can kill off the worst performing ones and
focus on the remainder:
一旦我们知道了这些基因组(下图这些抬 高的红点点)匹配这个山脉的程度,我们就可以通过匹配的
程度,非常匹配或者差一些的,来给他们分级 。我们是在寻找这个山脉上位置较高的点,所以有充足
的理由来假设这些位置较高的基因组要比位置靠下 的基因组更加接近顶端,
所以,
我们可以把那些表
现的差一些的拖出去斩了而只关注那 些剩下来的优秀的。





It is not good enough to simply pick the best performing genome from the initial
population and call it quits. Since all the genomes in Generation 0 were picked at random,
it is actually quite unlikely that any of them will have hit the jack- pot. What we need to
do is breed the best performing genomes in Generation 0 to create Generation 1. When
we breed two genomes, their offspring will end up somewhere in the intermediate
model-space, thus exploring fresh ground:
如果我们只是把位置较好的基因从第一代提取出来并且停止工作这样并不是很好,因为
0
代基因是随
机生成的点,
不一定这些随机的点就有一个恰好在这个山脉的顶 端。
所以我们要做的是把第一代表现
优良的基因组取出来并且让他们培育第二代,
他们 的后代会在这个原来父代模型空间的中间区域,

以也相当于扩展到了新的空间。



We now have a new population, which is no longer completely random and which is
already starting to cluster around the three fitness 'peaks'. All we have to do is repeat
the above steps (kill off the worst performing genomes, breed the best-performing
genomes) until we have reached the highest peak.
现在我们有了 新的一代人,并且这一代人并不是完全的随机了,而是更加的成组团的靠近三个山峰。
后面我们要做的就 是重复上一步(干掉那些掉链子的,养育那些表现好的,
PS
题外话:这就是赤裸
裸的 落后就要挨打啊,还不光挨打,直接干掉。



)直到我们找到到达最顶峰 的点。




In order to perform this process, an Evolutionary Solver requires five interlocking parts,
which I'll discuss in something resembling detail. We could call this the
anatomy
of the
Solver
.
这种算 法需要五个具有连锁反应的部分,稍后我们会讨论下类似的细节,下面我们开始解剖他吧。

?

Fitness Function

适应度函数

?

Selection Mechanism


选择机制

?

Coupling Algorithm


耦合算法

?

Coalescence Algorithm


合并算法

?

Mutation Factory

突变因素



Fitness Functions
适应度函数




In biological evolution, the quality known as
stumbling block. Usually it is very difficult to say exactly what it means to be
fit
. It
certainly has little or nothing to do with being the strongest, or the fastest, or the most
vicious. The reason there are no flying dogs isn't that evolution hasn't gotten around to
making any yet, it is that the dog lifestyle is supremely incompatible with flying and the
sacrifices required to equip a dog with flight would certainly detract more from the
overall fitness than flight would add to it. Fitness is the result of a million conflicting
forces. Evolutionary Fitness is the ultimate compromise. < br>在生物进化论里,
适应度这种概念在一定程度上就相当于阻碍。
有时候我们很难准确定义 什么是适应。
适应这种概念这个年代看起来和更强壮的,更快的,或者是更邪恶的没有什么关系。没有进 化出来飞
狗并不是进化还没到一个很高的程度,
而是狗的生活习惯不适于飞行,
如果非 要让一个狗进化出来能
飞的翅膀,这个翅膀反而会大大削减其他方面的机能,所以他没有进化出来。适应 的进化是百万年外
界压力的磨合,进化的形态是最终向大自然妥协的结果。

A fit individual is
on average
able to produce more offspring than an unfit one, so we
could say that fitness equals the number of genetic children. A better measure yet would
be to count the number of grand-children. And a better measure yet would be to count
the allele frequency in the gene-pool of the genes that made up the individual in
question. But these are all rather ad-hoc definitions that cannot be measured on the
spot.
一个适应性更强的父代 平均来说要比适应性差的父代子孙更多,
所以我们可以简单地说适应性就相当
于后代数量。一个很好的测算方法就是看他的后代数量,
或者更好的方法就是看后代基因组频率和父
代的 相似度。但是这些专门定义方法在一些情况下不适用。

At least in Evolutionary Computation, fitness is a very easy concept.
Fitness is whatever
we want it to be
. We are trying to solve a specific problem, and therefore we know what
it means to be fit. If for example we are seeking to position a shape so that it may be
milled with minimum material waste, there is a very strict fitness function that leaves no
room for argument.
在进化算法里,适 应性是个很简单的概念,适应性就是我们想要的结果,当我们尝试解决一些特别的
我们已经知道以何种方 式匹配的问题。
举个例子,
我们试图寻找一个图形的位置他可以尽量的减少材
料的浪费 ,这就是一个非常严格的没有什么讨论余地的问题。

Let's have a look at the fitness landscape again and let's imagine it represents a model
that seeks to encase an object in a minimum volume bounding-box. A minimum
bounding-box is the smallest orthogonal box that completely contains any given shape.
In the image below, the green shape is encased by two bounding boxes. B has a smaller
area than A and is therefore fitter
.
我们再看一个地形,
让我们把 它想象成一个包在最小长方形体里的模型,
最小包裹体就是包含任何形
状最小的正交方体,在下 面的图例,绿色的形状被两个盒子包含,
B
就比
A
的面积更小,更合适。


When we need to mill or 3D-print a shape, it is often a good idea to rotate it until it
requires the least amount of material to be used during manufacturing. For a real
minimum bounding-box we need at least three rotation axes, but since that will not allow
me to display the real fitness landscape, we will restrict ourselves to rotation around the
world X and Y axes. So,
Gene A
will represent the rotation around the X axis and
Gene
B
will represent rotation around the Y axis. There is no need to allow for rotation higher
than 360 degrees, so both genes have a limited working domain. (In fact, since we are
talking about orthogonal boxes, even a 0-90 degree domain would suffice). Behold
rotation around a single axis:
当我们需要做一个三维的模型时,
如果能在加 工制造时最大化的减少材料的浪费是个很好的想法,

个三维的最小的包涵盒子最少要
3
个旋转轴,但是因为也显示不了真正的结果,我们在这里就只围绕
X

Y< br>轴旋转。所以基因
A
就代表
X
轴旋转,基因
B
就代表
Y
轴旋转。没必要旋转
360
度因为每个基
因都有一个限制工作的范 围(事实上,因为我们讨论的是正交的盒子,所以
90
度就已经足够了)看
他围绕单轴 旋转:



When we pick two rotational angles at random, we end up somewhere on the fitness
landscape. If we allow for 4 decimal places in the rotation angles it means we can
actually generate almost 810,000,000,000 (or 810 billion) unique rotations. It is
therefore exceptionally unlikely that we manage to pick a random rotation that yields the
best possible answer
. But let's say we don't even manage to get close. Let's say we
manage to pick a random genome that is at the bad end of the fitness scale, i.e. at the
bottom of the fitness landscape. What can we say about the blood-line of this genome?
When we track the descendants of a particular genome there is always a large amount
of randomness involved due to the workings of the Solver
, but there is a strong general
tendency that can be distinguished. Just like water will always flow downhill along the
steepest slope, so genetic descendants will generally climb uphill along the steepest
slope:
当我们选择两个旋转轴的时候,随机停在一个时候,如果我 们的旋转轴设定
4
位小数,那就意味着我
们会产生
810,000,000, 000
个角度的解,看来我们随机选一个角度来产生优秀的解这个方法是行
不通了,甚至根本 无法接近那个最优解,我们随机选的这些基因最后都不是最优解,像是在刚才那个
山丘的最底层的那些点 。
我们怎么来定义这些基因的血缘呢?当我们去追溯一个基因的后代,
通常因
为计算会 产生出大量的后代,
但是他们都有一个很强的易区别的某种倾向性。
就像水流只顺着斜率最大的陡坡流下,这些后代会朝着最小阻力的顶部攀登。


Every individual tries to maximize its own fitness, as high fitness is rewarded by the
solver
. And the steepest uphill climb is the fastest way towards high fitness. So if the
black sphere represents the location of the ancestral genome, the orange track
represents the pathway of its most successful offspring. We can repeat this exercise for
a large amount of sample points which will tell us something about how the Solver and
the Fitness Landscape interact:
每一个个体都 尽力最大化自己的适应性,
因为适应性高才能存活,
而且斜率最高的攀爬路径是最快的,
所以大家看上面那张图,
黑色的球体代表最初的基因,
而橘黄色的路径就是那些表现最优良的 基因所
攀爬的方式,我们可以通过大量的点来测试一下,看看基因算法和适应性机制是如何相互作用的。




Since every genome is pulled uphill, every peak in the fitness landscape has a
basin of
attraction
around it. This basin represents all the points in model- space that will
converge upon that specific peak. It is important to notice that the
area
of the basin is in
no way representative of the
quality
of the peak. Indeed, a very poor solution may have
a large basin of attraction while a good peak might have a small catchment area.
Problems like this are typically very difficult to solve, as the solution tends to get stuck
in local optima. But we'll have a look at problematic fitness functions later on.
因为每个基因都会被拉到山顶,
所以开始之前就有点池在山顶的周围环绕,
这 个池子里面就是将会聚
集到山顶的点,我们要特别注意一点就是点池并不意味着山顶的质量,因为存在一 个问题,有可能一
个比较矮的山顶周围围绕了大量的点,
而较高的山顶只围绕了少量的,
像出现这样的问题一般很难处
理,这个解算在局部最优以后就会停止,所以随后我们会看见一个有些问 题的解。

First, let's have a closer look at the actual fitness landscape for our minimum
bounding-box model. I'm afraid it's not quite as simple as the image we've been using so
far
. I was actually quite surprised how organic and un-box-like the actual fitness
landscape for this problem is. Remember
, the x-axis rotation is mapped along the
Gene
A
direction and the y-axis rotation along the
Gene B
direction. So every point on the
AB

plane represents a unique rotation composed of two angles. The elevation of this point
is a direct mapping of the volume of the bounding-box at those two rotation angles:
首先,看一下上图那个平面景观的最小的包含体,实际上远没有那么简单。如果是有机形态或者是非长方体那复杂程度真的吓我一跳。记住,基因
A
代表
X
轴旋转角度,基因
B
代表
Y
轴旋转角度,
,所
以以
AB
为平 面的每一个点都代表了相应的
XY
轴旋转的角度,而那些提高的点(
z
轴坐标 )意味着
xy
旋转轴所对应的最小的包含体的体积。



The first thing to notice is that the landscape is periodic. I.e., it repeats itself every 90
degrees in both directions. Also, this landscape is in fact inverted as we're looking for a
minimum
volume, not a maximum one. Thus, the orange peaks in fact represent the
worst solutions to this problem. Note that there are 16 of these peaks in the entire range
and that they are rounded. When we look at the bottom of this fitness landscape, we get
a rather different view:
首先我们观察到的是由 那些数据绘制出来的图是这样的周期曲面,说明每
90
度他们就会重复一次,
这张图展 示的和我们预想的正好相反(因为最顶端代表体积越大)
,你看图中橘黄色的就代表最差的
结果 ,而且在我们搜寻的范围内,他们能够出现
16
次,当我们看看这个图的底部的时候,我们会发
现一个有趣的现象:



It would appear that the lowest points in this landscape (the minimum bounding-boxes)
are both fewer in number and of a different kind. We only get 8 optimal solutions and
they are all very sharp, indicating a somewhat more fragile state.
图中展示 的最低点(也就是我们要找的最小盒子)在数量上和差异性上都要少一些,我们只得到
8
最优解,
而且他们所处的地方都很陡峭,
说明他们所处的状态很脆弱
(也就是他们 的相似值范围很小,
我们搜寻是很容易错过)


Still, on the whole we have nothing to complain about. All the solutions are of equal
quality and there are no local optima at all. We can generalize this landscape to a
2-dimensional graph:
直到现在,我 们对这些结果也没什么抱怨的,所有的解品质都一样而且也没有局部最优的现象,我们
可以把那张图做成 这样的二维图表:




No matter where you end up as an ancestral genome, your blood-line will always find its
way to a minimum bounding box. There's nowhere for it to get 'stuck'. So it's really just
a question about who gets there first. If we look at a slightly more complex fitness graph,
it becomes apparent that this need not be the case:
无论你在什么时候暂停,
并把当前状态作为最 初的父代,
根据原来的血缘我们还是能够找到那个最小
的盒子,而且运行时不会被卡主。唯一的 问题就是谁更快的到达那个地方。但是如果我们做个稍微复
杂一点的图形,你就可以很明显的看出来问题 所在。




This fitness landscape has two kinds of solutions. The high quality sharp ones near the
bottom of the graph and the low quality flat ones near the top. The basin of attraction is
given for both solutions (yellow for high quality, pink for low quality) and you can see
that about half of the model space is attracted to the low quality solutions.
根据上面这张 图这时候有两类解,
高质量的解在这张图表的最下面锋利的地方,
二低质量的解在靠近
顶部的地方,开始的那些父代给了我们两种解(黄色代表高质量解,粉色代表低质量解)你可以看出
将近 有一半的父代导致我们求出了低质量的解。

An even worse example (flipped upright again this time, so high values indicate good
solutions) would be the following fitness landscape:
现在我们把刚才那个最优和次优的图标 简化一下翻转过来,
现在高的代表高质量解,
低的代表低质量
解:

卡希尔-hopeful


卡希尔-hopeful


卡希尔-hopeful


卡希尔-hopeful


卡希尔-hopeful


卡希尔-hopeful


卡希尔-hopeful


卡希尔-hopeful



本文更新与2021-01-20 18:01,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/539698.html

grasshopper-galapagos遗传算法的相关文章