基因表达式编程(GEP)自学 第【7】天 Python 实现

1. 基因表达式编程 GEP Python 代码

这次主要任务:

加入DC域,包括:

  • 设置随机常数长度
  • 设置随机常数范围
  • 随机常数的突变
  • DC域特殊的IS转座、IS元素长度设置

加入可增加中性基因

  • 触发加入中性基因条件
  • 中性基因对应值

化简操作:

  • 生成数学式子
  • 对数学式子进行化简

控制部分

  • 根据控制可实现有无连接基因
  • 根据控制可实现有无DC域

其他部分:

  • 自动生成样本数据,实现精度调节,实现输入X,
  • 评估函数加入相对误差计算
  • 实现原IS、RIS元素长度控制
  • 根据终结符个数,自动生成终结符号,自动需要加入‘?’

【PS:结合前边的内容】

基因表达式编程(GEP)自学 第【1】天 Python 实现
基因表达式编程(GEP)自学 第【2】天 Python 实现
基因表达式编程(GEP)自学 第【3】天 Python 实现
基因表达式编程(GEP)自学 第【4】天 Python 实现(代码)
基因表达式编程(GEP)自学 第【5】天 Python 实现(代码)
基因表达式编程(GEP)自学 第【6】天 Python 实现(代码)

2. 符号回归和数值常数的产生

GEP 采用不同的方法来解决常数产生的问题(Ferreira 2001)。GEP 采用一种附加终点“?”和由用来表示随机常数的符号构成的附加域Dc。对每个基因而言,这些随机常数产生于初始种群产生时并被保存在一个数组中。每个随机常数仅在其基因表达的过程中赋值。进一步说来,用一个特殊的算子来向随机常数池中引入遗传变化。该算丁且按对阻机符效乎行变异。而且 GEP的常规算子加上针对 Dc域的转座探作休近.什件中的隐机门效i动名效地在开始运行时产生恰当的多样性,而且通过遗传多样化的作用在以后很容易保持这种多样性。

2.2. GEP中随机常数的控制

要在GEP中实现数值常数很容易。为此在GEP基因中引入一个附加域Dc。从结构上讲,Dc在尾部的后面,和t的长度相等,由代表中间随机常数的符号构成。因此,在基因中生成了具有单独边界的,有自身字符集的另一个区域。对每个基因来说,这些常数在一次运行的初期随机生成。但是它们的循环由变异、转座、重组等常用的遗传算子保证。另外,一种特殊的变异算子允许向随机常数集中一直引入变化,一种针对域的IS转座操作保证常数能够进行更广泛的交换。考虑下面这个单基因的染色体,其头部长度为7(Dc用黑体标识):
在这里插入图片描述
其中终点“?”代表随机常数。这种染色体的表达与以前完全相同:
在这里插入图片描述
然后表达式树中的“?”从左到右,从上到下,由 Dc中的符号替换,得到:
在这里插入图片描述
这些符号对应的值保存在一个数组中。为了简单起见,数值所代表的为数列中数的顺序。A=(0.611,1.184,2.449,2.98,0.496,2.286,0.93,2.305,2.737,0.755)由染色体(4.8)得到:
在这里插入图片描述

3. 简单符号回归问题

3.1 样本数据一:

来自公式
在这里插入图片描述

af(a)
6.940844.90975
-7.86647.340925
-2.7861-4.47712
-5.0944-2.30674
9.489573.49381
-9.619717.41021
-9.414516.07291
-0.1432-0.41935
0.91073.146787
2.17628.896523

参数设置:

在这里插入图片描述

数据测试结果:

1 代,BestFitness= 91.2098452538483
++/*--/aaaaaaaa:+a+a-/*aaaaaaaa:/*+*a-+aaaaaaaa:
a**2/2 + 2*a + 1
**********************************************
**********************************************   完美解   **********************************************2 代 BestFitness= 1000.0
++a*--/aaaaaaaa:+a+a-//aaaaaaaa:/*+*a-+aaaaaaaa:
a*(a + 6)/2
Time: 0.2812916000000001

进程已结束,退出代码0

3.2 样本数据二:

来自公式:
在这里插入图片描述

nan
12
298
3426
41252
52930
65910
710738
818056
928602
1043210

参数设置

在这里插入图片描述

数据测试结果:

SI(没有加入DC域):

**********************************************10 代,BestFitness= 231.47229451708938
-/-/a*aaaaaaa:*aa/-aaaaaaaa:*a**++aaaaaaa:**/*+aaaaaaaa:*+-**+aaaaaaa:
4*a**4 + 4*a**3 + a + 1/a
**********************************************
**********************************************   完美解   **********************************************11 代 BestFitness= 250.0
*a*+a/aaaaaaa:aa*+aaaaaaaaa:*a**++aaaaaaa:/*/a++aaaaaaa:*+-**+aaaaaaa:
a*(4*a**3 + 3*a**2 + 2*a + 1)
Time: 3.5860974

进程已结束,退出代码0


进程已结束,退出代码0

SI*(加入DC域):

**********************************************100 代,BestFitness= 235.40469010273367
?/a?*+aaaa??? : [6, 8, 8, 1, 2, 6, 3] : [1.0, 2.0, 2.0, 0.0, 1.0, 2.0, 1.0, 1.0, 2.0, 0.0]:aaa?**?aaaa?? : [6, 8, 8, 1, 2, 6, 3] : [1.0, 2.0, 2.0, 0.0, 2.0, 2.0, 1.0, 2.0, 2.0, 0.0]:-?/***a?aa??? : [6, 8, 8, 1, 2, 6, 3] : [1.0, 2.0, 2.0, 0.0, 2.0, 2.0, 1.0, 2.0, 2.0, 0.0]:***+**aa?a??a : [6, 8, 8, 1, 1, 2, 6] : [2.0, 1.0, 2.0, 0.0, 2.0, 2.0, 1.0, 2.0, 2.0, 1.0]:-*/-aaa?aa?aa : [4, 6, 7, 4, 1, 0, 4] : [2.0, 2.0, 1.0, 3.0, 2.0, 3.0, 2.0, 3.0, 2.0, 2.0]:
4.0*a**3*(a + 1) - a*(a - 2.0) + 1.0
**********************************************
**********************************************    100 代后最佳解   **********************************************
result_fitness=   247.16234355591035
-?aa*aa?aa?aa : [6, 8, 8, 1, 4, 2, 7] : [1.0, 1.0, 2.0, 0.0, 3.0, 3.0, 1.0, 2.0, 2.0, 2.0]:*-*/a-a??a?aa : [1, 0, 4, 3, 3, 2, 1] : [2.0, 3.0, 0.0, 1.0, 0.0, 1.0, 2.0, 3.0, 1.0, 2.0]:++/-*-?aaaaa? : [0, 4, 2, 7, 5, 1, 7] : [2.0, 1.0, 2.0, 2.0, 3.0, 3.0, 3.0, 3.0, 1.0, 0.0]:***+**aa?a??a : [6, 8, 8, 1, 2, 6, 3] : [1.0, 1.0, 2.0, 0.0, 2.0, 2.0, 1.0, 2.0, 2.0, 2.0]:?a-*/+?a?aa?? : [6, 8, 8, 1, 2, 6, 3] : [1.0, 1.0, 2.0, 0.0, 2.0, 2.0, 1.0, 2.0, 2.0, 2.0]:
4.0*a**4 + 3.0*a**3 + 2.5*a**2 - 0.666666666666667*a + 1.33333333333333
Time: 25.5881866

进程已结束,退出代码0

3.3 样本数据三

来源以下公式:
在这里插入图片描述
【PS:其中a,b,c,d,e 范围为(0,1),一共50个数据。】

0.99193  0.51446  0.88855  0.06328  0.79029  -0.42222062152506784
0.07718  0.34471  0.19925  0.08126  0.29484  -0.1512013809728614
0.82287  0.43778  0.24615  0.0622  0.83879  -0.3954602986232597
0.83438  0.71669  0.09807  0.29046  0.97367  -0.28210317387787076
0.7471  0.13171  0.66232  0.52666  0.04239  1.0097764113037084
0.98846  0.23915  0.15395  0.40494  0.81078  0.3216012776359086
0.93236  0.44798  0.96831  0.49227  0.30461  0.6359058688359684
0.92809  0.34821  0.37718  0.03443  0.25019  0.40394020998396507
0.28268  0.36465  0.48981  0.65657  0.57733  0.28339080364682273
0.76763  0.91717  0.66877  0.47943  0.08352  0.7202268027326734
0.45825  0.13833  0.00582  0.3873  0.20027  0.6261221368625305
0.62673  0.4707  0.98774  0.688  0.70618  0.30081204726726896
0.06912  0.9505  0.96079  0.56281  0.7959  -0.21257337119221936
0.39789  0.37473  0.30688  0.86346  0.92719  0.24547689685726062
0.46164  0.48926  0.12048  0.78961  0.01457  1.3496716583519688
0.3095  0.72947  0.53848  0.82008  0.2926  0.7560128075797033
0.43852  0.58268  0.63833  0.29628  0.36811  0.1857080587713715
0.36645  0.52465  0.47477  0.62426  0.02345  0.9299075506524141
0.01078  0.20631  0.6507  0.92829  0.64129  0.3027694035650446
0.55656  0.3931  0.85669  0.14975  0.23704  0.23044582004046188
0.02924  0.69882  0.29584  0.20773  0.62971  -0.429644169991186
0.42811  0.59082  0.84832  0.47553  0.43669  0.2644539200878486
0.381  0.95329  0.50485  0.28542  0.82228  -0.42789816773868494
0.63559  0.30909  0.75147  0.97976  0.71691  0.6574655929738893
0.06898  0.17357  0.47908  0.14599  0.73447  -0.6139279797237168
0.72515  0.39702  0.08505  0.40135  0.08036  0.9186815624154154
0.05817  0.96856  0.13597  0.86556  0.50271  0.41042949436795306
0.87661  0.86001  0.0169  0.80298  0.06928  1.3988246022856246
0.90255  0.5467  0.88847  0.11495  0.17547  0.36941057568188224
0.71006  0.98573  0.79799  0.75992  0.76704  0.23444000629226522
0.85406  0.62422  0.01176  0.46693  0.33024  0.7457336308869078
0.37059  0.92646  0.26608  0.1177  0.45224  -0.15716336018492863
0.45861  0.13637  0.78788  0.67602  0.54803  0.4244776214231313
0.41163  0.83728  0.66014  0.90249  0.5177  0.5975376837533948
0.14137  0.84849  0.57788  0.10083  0.65656  -0.5512415059946163
0.76896  0.72218  0.69593  0.09933  0.31978  0.14436051149104542
0.01498  0.53541  0.07318  0.5621  0.90048  -0.33949487699720005
0.56211  0.00636  0.21552  0.26212  0.20296  0.5377452930658656
0.14567  0.35905  0.69368  0.74942  0.82572  0.01962107017585056
0.74565  0.13218  0.70319  0.92279  0.51596  0.9040370515004582
0.89078  0.15657  0.25707  0.22643  0.15255  0.7494257668528665
0.62473  0.77432  0.90211  0.6519  0.70128  0.2169085944287869
0.09935  0.32993  0.43387  0.34202  0.46483  -0.04789403232309525
0.68402  0.52862  0.72289  0.79845  0.41408  0.784633121433205
0.07731  0.51948  0.78952  0.79242  0.33704  0.5348850042062976
0.94102  0.15692  0.06074  0.13631  0.73824  0.08737795769423295
0.36994  0.94019  0.73229  0.59673  0.45521  0.2902974380023562
0.34037  0.52937  0.85872  0.55816  0.10205  0.6781723286099974
0.57177  0.52443  0.10768  0.40347  0.86209  -0.04988318270331232
0.19946  0.57805  0.68392  0.99834  0.3046  0.9495289301496511

参数设置

在这里插入图片描述
【PS:Q:sqrt,E:e^(x);S:sin,C:cos,T:tan】:

数据测试结果:

**********************************************    100 代后最佳解   **********************************************
result_fitness=   4575.405744305627
*sinsina*coscosbca*edcdbaecedecab:-deddsine++tanexpabbaaaeecbdbac:
d - e + sin(a)*sin(cos(b)*cos(c))
Time: 670.7396095

进程已结束,退出代码0

3.4 样本数据四

来源以下公式:
在这里插入图片描述
【PS:其中因变量保留了6小数,一共40个数据】
数据:

3.86392  1.18173  4.74086  4.58392
4.13431  4.46644  1.41801  6.418971
7.40769  3.1694  3.89634  10.158875
8.02282  6.84999  8.69457  13.889326
7.55535  9.58745  5.07384  13.531566
4.2704  2.72785  6.37575  7.84818
1.44986  7.93916  3.85375  6.893974
3.915  8.65118  0.46589  3.914196
6.35939  6.6132  6.96758  11.930277
0.16971  7.59654  8.69179  6.384901
0.7768  4.30366  7.61851  5.702335
0.90607  1.2336  1.11729  0.365694
4.16957  8.12904  9.24041  10.526933
4.47388  5.4845  6.63127  9.638265
7.93085  6.33989  7.73864  13.49448
0.03836  0.16293  2.82582  -2.638704
1.51326  1.53626  4.95908  3.751748
9.62854  5.88192  5.05282  14.400732
4.65667  1.93825  2.56416  4.157903
9.8598  9.20013  3.20453  15.055684
5.43579  9.00631  4.9716  11.305957
8.90615  5.25885  5.62061  13.593865
2.61804  8.79167  2.85016  7.902673
6.74108  2.44268  9.67327  10.460757
1.03425  0.57348  5.18512  1.140551
1.3899  3.89458  6.21038  5.876111
0.34644  9.72325  5.73989  6.636693
4.49942  4.32224  6.51479  9.12694
0.24211  6.36433  6.96857  5.879464
4.70665  8.55759  5.02114  10.497931
3.49295  7.02955  5.75737  9.053417
0.37841  5.20065  2.47408  4.551995
4.88958  1.22187  9.32541  6.962512
5.06194  3.31222  4.09506  8.399837
7.34237  7.65966  1.74657  11.17604
6.5823  5.59833  7.78299  11.915401
5.38421  5.30825  1.71296  8.364129
3.78736  5.29658  2.67535  7.794576
4.72774  5.00382  6.69609  9.697563
9.06253  6.85194  6.1797  14.492031

参数设置

在这里插入图片描述

数据测试结果:

**********************************************    1000 代后最佳解   **********************************************
result_fitness=   999.9998183438697
ln*-bc/abccabcccccbaac:a//*/*babccbccbbbbbbc:lnb/-lnba-*bbcbaabbcbac:
(a*log(e) + log(b) + log(-a + b*c))/log(e)
Time: 289.3962677

进程已结束,退出代码0

4.太阳黑子时间序列预测

数据:

[101, 82, 66, 35, 31, 7, 20, 92, 154, 125,
   85, 68, 38, 23, 10, 24, 83, 132, 131, 118,
   90, 67, 60, 47, 41, 21, 16, 6, 4, 7,
   14, 34, 45, 43, 48, 42, 28, 10, 8, 2,
   1e-8, 1, 5, 12, 14, 35, 46, 41, 30,
   24,16, 7, 4, 2, 8, 17, 36, 50, 62, 67,
   71,48, 28, 8, 13, 57, 122, 138, 103, 86,
   63,37, 24, 11, 15, 40, 62, 98, 124, 96,
   66,64, 54, 39, 21, 7, 4, 23, 55, 94,
   96,77, 59, 44, 47, 30, 16, 7, 37, 74]
处理后

参数设置

在这里插入图片描述

数据测试结果:

SS(没有加入DC域):

**********************************************500 代,BestFitness= 85195.2542368892
-ji+ga+ighgaeah:/ijcec-dfacjdjd:j*cffe*bieefjbg:
-i + i/j + 2*j
**********************************************
**********************************************    500 代后最佳解   **********************************************
result_fitness=   85399.67919072144
-jijbgficbefjjb:/i-hi/*iiifjdfj:j/dfaieegedeigb:
(i + (h - i)*(-i + 2*j))/(h - i)
Time: 593.1848037999999

进程已结束,退出代码0

SS*(加入DC域):

**********************************************500 代,BestFitness= 85399.67919072144
/i-hih+becfjiif : [3, 8, 3, 9, 9, 9, 8, 9] : [0.118498769373534, 0.647888167419013, 0.050084592506132, 0.886897793141401, 0.091397748290483, 0.81499559160092, 0.683418133097667, -0.468533873583754, -0.63409264432283, -0.670588130076901]:-jih-jaafeafgjg : [9, 9, 2, 3, 3, 9, 8, 9] : [-0.434099481411413, -0.897778896207682, -0.436112575119754, 0.991472342195282, 0.147740743610077, 0.456032610727201, 0.921129783142729, -0.403735171041188, -0.755344755091458, -0.403350424522149]:jihjhj-bh?edeb? : [9, 8, 9, 2, 3, 9, 8, 9] : [-0.823041346025364, -0.897778896207682, 0.137699436508055, 0.395386883102979, -0.742405908684189, 0.704590081613101, 0.683418133097667, 0.874314122642751, -0.120490307414403, -0.403350424522149]:
(i + (h - i)*(-i + 2*j))/(h - i)
**********************************************
**********************************************    500 代后最佳解   **********************************************
result_fitness=   85399.67919072144
/i-hih/jddei?ac : [8, 8, 8, 0, 5, 8, 3, 8] : [0.69732715316274, -0.783010751077373, -0.851177099509528, -0.514108891300504, -0.644115954105636, 0.79235597440412, -0.414728384380069, 0.462450960572396, -0.955008818728986, 0.285014207865032]:-jiiaf/j?bjedff : [8, 8, 8, 8, 8, 0, 5, 8] : [0.69732715316274, -0.783010751077373, -0.851177099509528, -0.232362557828261, -0.350968203397269, -0.75177718618264, -0.533144868386809, 0.462450960572396, -0.921910788250858, 0.285014207865032]:ji-e?f?bbbighif : [8, 8, 8, 0, 8, 5, 8, 0] : [0.69732715316274, -0.783010751077373, 0.107401590804095, 0.623731395771651, -0.644115954105636, 0.79235597440412, -0.414728384380069, 0.462450960572396, -0.955008818728986, 0.285014207865032]:
(i + (h - i)*(-i + 2*j))/(h - i)
Time: 502.0849433

进程已结束,退出代码0

5. 鸢尾花分类问题

鸢尾花分类一个多分类的问题。其中鸢尾花分类的数据集含有4个自变量,分别是萼片长度,萼片宽度,花瓣长度,花瓣宽度。数据中含有150个样本,其中每种鸢尾含有50个样本,鸢尾的种类分别是: Iris setosa, Iris versicolor, Iris vifginica。
数据:

参数设置

【PS:150有点多就不贴数据了
在这里插入图片描述

数据测试结果:

(1)第一个0-1分类,是 Iris setosa 与非 Iris setosa

**********************************************   完美解   **********************************************2 代 BestFitness= 150
b-*cdcddada:*a-baaccadc:a*c--dbbccb://d-bbcacca:b++a-abbdad:
(b*d*(-a*(a - b) + a + 2*b) + b - c)/(b*d)

(2)第二个0-1分类,是 Iris versicolor 与非 Iris versicolor

**********************************************1000 代,BestFitness= 149
--*-adbbbdc:bb-/adcacbd:dd+a/dacdda:-/*-cbbbbdc:/a/-ccbbbcd:
(-a*c + (b - c)*(-a - b**2 - b*d + b + d))/(b - c)

(3)第三个0-1分类,是 Iris vifginica与非 Iris vifginica

**********************************************1000 代,BestFitness= 149
*/d-dccabaa:*//-ccddadc:-/dd-bcadcb:/dda*babbac:-c//bdcdbcb:
c - d + d/(b - c) + 1 - (a - d)/d - d/(b*c)

分类规则:

   	C1 =1 if (b*d*(-a*(a - b) + a + 2*b) + b - c)/(b*d) > 0.5 else 0
    C2 =1 if(-a*c + (b - c)*(-a - b**2 - b*d + b + d))/(b - c) > 0.5 else 0
    C3 =1 if c - d + d/(b - c) + 1 - (a - d)/d - d/(b*c)  > 0.5 else 0
    # 是 Iris setosa类
    if C1==1 and C2 == 0 and C3==0:
        return 0   
    # 是 Iris versicolor类
    elif  C1==0 and C2 == 1 and C3==0:
        return 1
    # 是 Iris vifginica类
    elif  C1==0 and C2 == 0 and C3==1:
        return 2

分类结果:

**********************************************
正确分类的个数: 149
分类正确率: 99.333333%

【PS:其中的分类计算的适应度,与回归的适应度计算不同,之后在进行相应的更新。】

6. 求最大值问题

在这里插入图片描述
其中x,y的取值范围:
在这里插入图片描述

参数设置

【PS:对于在一定范围内求极值点,就不需要传入数据,需充分利用Dc域作用】
在这里插入图片描述

数据测试结果:

**********************************************    1000 代后最佳解   **********************************************
result_fitness=   556.6331091807164
max_value=   18.554436972690546
+/*-*-??????? : [8, 9, 4, 4, 9, 2, 4] : [-0.3991, 0.9028, -0.517, -0.6875, -0.2357, 0.7261, 0.1965, -0.7594, 0.2777, -0.2282]:+/--*???????? : [8, 4, 4, 4, 7, 6, 8] : [-0.3991, 0.9028, -0.517, -0.6875, -0.2357, 0.7261, 0.1965, -0.3803, 0.2777, -0.2282]:
[9.03830450026599, 8.66457724961565]
Time: 175.074392

【PS:最大值的基因将不需要用“+”连接。而是一个基因对应一个变量,如两个基因分别对应x,y。对于不同的求极值,其计算适应度可进行相应的变化。】

7. 代码实现整合

Python文件分成:main.py ; Environment.py ; Chromosome.py;Gene.py ; Genome.py。
Python代码
【代码】对于代码随机种子的设置random.seed(x),均可删除也建议删除(固定随机种子一般是方便调试找问题,遇到都可以删除)
可咨询相关内容、价格【目前CSDN,资源无法调控制。之后价格显示过高,可私下询问】,避免不必要的尴尬(微笑)。可适当教如何使用。【22-10-30至23-01-01有事在期间可能不能正常回答问题,抱歉。有问题查看1-8的博客是否有提及,有些解释可能对解决问题有些帮助】

本文作者:九重!
本文链接:https://blog.csdn.net/weixin_43798572/article/details/122886611
关于博主:评论和私信会在第一时间回复。或者直接私信我。
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【点赞】【收藏】一下。您的鼓励是博主的最大动力!

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论
GEP(Gene Expression Programming)是一种基因表达式编程算法,可以用来解决复杂的问题。在Python中,我们可以通过编写相应的代码来实现GEP算法。 首先,我们需要定义基本的基因编码。在GEP中,基因编码由一系列基因节点组成,每个基因节点代表一个函数或者一个变量。我们可以使用字符串来表示基因节点,在Python中可以使用list或者字符串来表示整个基因。 接下来,我们需要定义适应度函数。适应度函数用来评估染色体的适应性,也就是解决问题的能力。在Python中,我们可以根据具体的问题自定义适应度函数。 然后,我们需要编写遗传算法的相关操作,包括选择、交叉和变异等。选择操作根据适应度函数选择出一定数量的个体作为父代,用来进行交叉和变异操作。交叉操作将父代个体的基因进行交换和重组,生成新的子代个体。变异操作是对子代个体进行随机的变异操作,以增加种群的多样性。 最后,我们可以使用循环迭代的方式不断进行遗传算法的进化过程,直到达到停止条件。在每一代的进化过程中,根据适应度函数对个体进行选择、交叉和变异操作,生成新的种群。 总之,通过以上步骤的实现,我们就可以使用Python实现GEP算法,并应用于解决各种复杂的问题。这只是一个简单的概述,具体实现需要根据具体的问题来进行调整和完善。
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九重!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值