GA 的广义理论






2.39/5 (12投票s)
在单个染色体中表示实数变量。
引言
这是一个演示如何在更具体的约束中使用 GA 的示例。 大多数 GA 实现都侧重于将染色体用作断开连接的类型。 染色体结构将如下所示:A-B-D-F-R-... 或者在二进制中:101010101 (= 整数)。 如果我们有多个变量要寻找怎么办? 显而易见的答案是:使您的染色体更大,并且对于每个额外的变量,在染色体中添加新的基因(细胞)。
示例:x1、x2、x3 是三个变量,它们将包含在染色体中,如下所示:101 111 001(此处,x1 的基因型为 101,x2 的基因型为 111,x3 的基因型为 001)。
好的,现在我们有一个新的约束:变量是实数,并且每个变量都有自己的实数范围:Xi 从 [Ri1, Ri2] ,其中:? < i。
现在您可以考虑一下:像提到的那样将染色体分成几部分,并保留每个部分中的附加基因以表示该变量的小数部分和一个新的基因来表示变量的信号。 但是没有数学证明表明这对于任何适应度函数都能很好地工作[尝试最大化 (Cos Xi * 0.0000001) + 1,您可以看到小数部分在这里是无用的]。 此外,为每个变量检索小数部分,并从整数和小数部分重新格式化变量,检查变量的范围并注意精度会浪费时间......
以下是已证明的关于我们约束的定律,这些定律简化了一切
- Xi 属于 [Bi, Ai]
- 计算 D = (Bi - Ai) * 10^p(其中 p 是精度)
- 计算最大的 m:其中 2^m - 1 < D
- 计算 Frac = (Bi - Ai) / ( 2^m - 1)
现在,要从染色体中检索实数值,将染色体的(整数)数值乘以 Frac,然后计算适应度... 当然,您应该仅在程序开始时(在 GA 启动之前)计算每个实数变量的 Frac。 您可以看到 Frac 应该是一个全局变量,以便在适应度函数中看到,否则您必须将其传递给代码中的每个子程序。
背景
语言和遗传编程的基本知识。
使用代码
我假设读者已经了解 GA(可以在 Internet 上找到数十篇关于 GA 的免费文章)。 我不会在这里解释 GA,但会谈论一般要点。 该程序将显示此文本
最大化函数:(最大适应度)79.45-segma(i=1:3,Xi^2) 其中?<= Xi <= ?
现在,如果您更改标签“最大适应度”附近的文本框中的(最大适应度)值,则程序显示的文本将更改为您的新函数,这将是最大化的新函数。 在我的程序中,我将三个变量设置在相同范围内以简化我的观点。 您可以使范围不同,但您需要为每个变量计算一个新的 FRAC。 与普通的 GA 不同,我将 GA 在所有代中的所有工作中最好的变量保留下来,以告知用户最好的结果。
Private Sub Command2_Click(ByVal eventSender As System.Object, _
ByVal eventArgs As System.EventArgs) Handles Button1.Click
' super_fitness is best variables fitness i got during all generations
super_fitness = 0
''' init best results
'''you can let this if you want to show permenent best results
Label1.Visible = False
''''' best variables unhide /user may start
''''' the program again after halt or finish
Dim fir As Object
''take lower upper limits of variable's rang
ai = CType(Text13.Text, Double)
bi = CType(Text14.Text, Double)
pre = CType(Text15.Text, Double) '' precision
''calc accurding to laws in introduction
fir = (bi - ai) * (10 ^ pre)
mi = 0
Do While (2 ^ mi - 1) < fir ''calc accurding to laws in introduction
mi = mi + 1
Loop
frac = (bi - ai) / (2 ^ mi - 1) ''calc frac
' MsgBox(frac)
Main_pro()
End Sub
Public Sub Main_pro()
Dim a As Short
Dim a1 As Double
Dim a2 As Short
Dim a3 As Double
Dim a4 As Double
a = Val((Trim(Text7.Text)))
a1 = Val(Trim(Text8.Text))
a2 = Val(Trim(Text9.Text))
a3 = Val(Trim(Text10.Text))
a4 = Val(Trim(Text11.Text))
a5 = Val(Trim(Text12.Text))
Call BuildPopu(a, a2 * 3, a1, a1, a3, a4) ''init GA
'because we have 3 variables xi
Evolve((frac))
'Start GA iteration and stop when generations
'are done or user halted execution
End Sub
关注点
我们可以使用 GA 来确定神经网络中最佳的层数:每个染色体将代表层数。 适应度函数将使用指定的层数创建一个 NN。 该函数将使用一些示例对其进行训练,然后在训练后对其进行测试(随机示例),并且我们将使用以下计算来估计此新 NN 的准确性:比率(正确答案的数量/问题的数量)。 此染色体的适应度将被分配此比率,其他 GA 阶段保持不变。
我们可以使用 GA 来确定每层中最佳的神经元数量:通过将染色体分成几部分,每部分代表一层中的神经元数量。 下一部分将以相同的方式用于下一层神经元,依此类推…… 在类似的适应度函数中,我们将为每个染色体重建 NN,对其进行训练,进行测试,分配适应度……
历史
- 上次更新时间:2007 年 5 月 21 日