遗传算法(Genetic Algorithm, GA)及 Python 实现

自然选择与遗传机制是这种优化算法的核心思想,它常用于处理难度较高的优化课题。接下来将介绍该算法的基本原理开元ky888棋牌官网版,并说明其具体实施流程开yunapp体育官网入口下载手机版,同时展示使用 Python 编写的代码示例。
遗传算法理论的由来
遗传算法的构思源自于生物的繁衍过程,特别是达尔文提出的“优胜劣汰”学说。它借助对自然选择机制、基因重组以及基因突变的模仿,可以在广阔的解域里探寻到最理想的答案。
遗传算法定义
遗传算法属于群体式搜索方法,依靠不断重复以下环节来提升解的质量:首先产生一个初始种群,然后对群体中的个体实施评估,接着依据适应度值挑选优良个体,再运用交叉和变异操作产生新个体,最后用新生成的群体替换旧群体,如此循环直至满足终止条件。
建立:随机产生初始种群,确定初始群体。挑选:依据适应度挑选出优良个体,进行选择。组合:借助组合方式产生新个体,实现交叉。改变:借助改变方式引入多样性,进行变异。重复:反复进行上述过程,直至达到结束标准。遗传算法详细流程
初始化(编码)
把答案转化成基因形态,比如是二进制序列或实数列表这类形式,同时随机地构造起最初的一代群体。
适应度函数
设定一个函数用以衡量各个体之间的高下。该函数的数值越高,代表该个体越为出色。
选择
依据表现程度挑选杰出成员,典型手段有转盘配额选取,以及竞技赛制拣选等。
交叉
通过交叉操作生成新个体。常用方法包括单点交叉、多点交叉等。
变异
借助变异手段能够产生多样性,这样可以防止碰壁于局部最优解开yun体育官网入口登录app,常用手段有随机改变和均匀调整等。
遗传算法应用
如何利用遗传算法解决一个二元函数的最大值求解问题。
问题
假设我们需要优化以下二元函数:

目标是找到
范围内的最大值。
在matplotlib库的子模块mplot3d中导入Axes3D类
import numpy as np
导入matplotlib.pyplot模块,命名为plt
# 创建图形和 3D 坐标轴
创建一个图形对象,尺寸为十乘六,用于绘图
ax 是通过调用 add_subplot 函数生成的, 它用于构建一个三维坐标系, 该函数的第一个参数是 111, 表示将绘图区域划分为 1 行 1 列, 并选择其中的第一个位置, 第二个参数 projection 设置为 '3d', 指定创建的是三维坐标轴
# 生成数据
x = np.arange(-10, 10, 0.1)
y = np.arange(-10, 10, 0.1)
X, Y = np.meshgrid(x, y)
Z 等于零点五减去括号内部分,括号内是负值,这个负值是括号内第一项除以括号内第二项,第一项是零点五减去括号内第三项的平方,括号内第三项是 X 的平方加上 Y 的平方再开平方根后取正弦,第二项是一加零点零零一乘以 X 的平方加上 Y 的平方再平方
# 设置标签
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
# 设置 z 轴范围
ax.set_zlim([-1, 5])
# 绘制 3D 曲面图
ax绘制三维曲面图,横坐标为X,纵坐标为Y,高度为Z,行步长为1,列步长为1,着色方案采用彩虹色
# 显示图形
plt.show()
输出结果:

创造染色体(编码)
编码为二进制串,每个变量用 25 位二进制数表示。
个体、种群与进化
通过选择、交叉和变异操作,逐步优化种群,找到最优解。
代码实现
import math
import random
class Population:
初始化时需要指定大小,染色体规模,交叉概率,变异概率以及最大代数
self个人集合为空列表
这个个体的适应度集合为空列表,需要逐一添加元素进去
self.selector_probability_list = , 里面存放着各个体被挑选的可能性数值
self的新一代个体列表为空列表
这个最优体包含基因序列,初始为两个零,适应度为零,年龄也是零
这个个体数量等于参数值,该参数用于确定整体规模,整体规模由这个值控制
这个染色体的尺寸就是给定的数值,这个数值被赋值给染色体长度的属性
这个程序把交叉概率赋值给变量self.crossover_probability,这个概率就是cp所代表的数值
这个类的一个属性被赋值为mp,它代表基因突变的可能性
这个程序设定了最大轮数,这个轮数是 gen_max,这个数值将被赋值给 self.generation_max
当前迭代次数记为0岁,以此作为年龄值
# 初始化种群
v等于二乘以基因组的长度减去一
for _ in range(self.size):
self.individuals集合里添加一个列表,列表第一个元素是0到v之间的随机整数,第二个元素也是0到v之间的随机整数
self的新个体列表中添加一个包含两个零元素的子列表
self.fitness.append(0)
这个选择器概率列表新增一个零值,作为初始数据添加进去
这个方法用来解析指定的区间和染色体信息
"""将染色体解码为区间内的数值"""
d = interval[1] - interval[0]
n等于二乘以染色体尺寸次方减去一的结果,转换成浮点数
返回区间第一个元素值,加上染色体数值乘以距离系数,再除以总数量
计算适应度值时,需要接收两个基因序列作为参数,分别是第一个基因序列和第二个基因序列,然后根据这些序列进行评估,最后得出适应度得分,这个得分将用于后续的遗传算法操作过程中
"""计算适应度"""
interval = [-10.0, 10.0]
x = self译码间隔,得到chrom1
n等于x乘以x加上y乘以y的平方根的正弦值的平方减去零点五
d等于一加上千分之零点零一乘以x的平方加上y的平方的结果,然后整体平方
return 0.5 - n / d
def evaluate(self):
"""评估种群"""
for i in range(self.size):
计算该个体的适应度值,将其结果赋值给数组对应位置,具体计算方法为应用适应度函数,输入该个体的一对基因,输出最终的适应度得分,整个过程中,数组的索引为i,基因信息分别来自两个维度。
ft_sum = sum(self.fitness)
for i in range(self.size):
该程序将第i个选择器的概率设置为该个体的适应度值除以所有适应度值的总和
for i in range(1, self.size):
self.selector_probability数组第i个元素的值,要加上它前面那个元素的值,也就是第i-1个元素的值
def select(self):
"""选择操作"""
t = random.random()
for i in range(self.size):
当自我选择概率列表中第i个元素的值大于某个阈值时
return i
return self.size - 1
此方法用于实现两个染色体的交叉操作,具体过程如下:选取两个染色体,进行基因交换,产生新的组合结果,完成遗传算法中的交叉步骤。
"""交叉操作"""
if random.random() < self.crossover_probability:
t = random.randint(1, self.chromosome_size - 1)
mask = (2 ** t) - 1
r1 = chrom1 & mask
r2 = chrom2 & mask
chrom1 = (chrom1 >> t) << t | r2
chrom2 = (chrom2 >> t) << t | r1
return chrom1, chrom2
def mutate(self, chrom):
"""变异操作"""
if random.random() < self.mutation_probability:
t = random.randint(1, self.chromosome_size)
mask = 1 << (t - 1)
chrom ^= mask
return chrom
def reproduct_elitist(self):
"""保留最佳个体"""
j = -1
for i in range(self.size):
if self.elitist['fitness'] < self.fitness[i]:
j = i
self.elitist['fitness'] = self.fitness[i]
if j >= 0:
自我精英个体的基因序列首个元素被设置为第j个个体的基因序列首个元素,这个操作发生在当前迭代过程中,目的是为了保留表现最优的那个个体,确保其基因信息能够顺利传递到下一代中
自我精英个体的基因序列,第一个元素,赋值为,当前群体中,编号为j的个体,其基因序列的第二个元素
自我精英的年龄属性被设定为自身的年龄值,这个值被赋予到对应的属性中,具体表现为年龄字段,在数据结构中以键值对的形式存在,其中键名为年龄,键值为当前的年龄数值
def evolve(self):
"""进化过程"""
self.evaluate()
i = 0
while i < self.size:
idv1 = self.select()
idv2 = self.select()
chrom1_x, chrom1_y = self.individuals[idv1]
chrom2_x, chrom2_y = self.individuals[idv2]
chrom1_x, chrom2_x = self.cross(chrom1_x, chrom2_x)
chrom1_y, chrom2_y = self.cross(chrom1_y, chrom2_y)
chrom1_x = self.mutate(chrom1_x)
chrom1_y = self.mutate(chrom1_y)
chrom2_x = self.mutate(chrom2_x)
chrom2_y = self.mutate(chrom2_y)
self.new_individuals[i] = [chrom1_x, chrom1_y]
self.new_individuals[i + 1] = [chrom2_x, chrom2_y]
i += 2
self.reproduct_elitist()
for i in range(self.size):
self.individuals[i] = self.new_individuals[i]
def run(self):
"""运行遗传算法"""
for i in range(self.generation_max):
self.evolve()
print(f"Generation {i}: Max Fitness = {max(self.fitness)}, Avg Fitness = {sum(self.fitness) / self.size}, Min Fitness = {min(self.fitness)}")
if __name__ == '__main__':
pop = Population(size=50, chrom_size=25, cp=0.8, mp=0.1, gen_max=150)
pop.run()
输出结果:
第一代最佳适应度值为0.9320918621733865,平均适应度值为0.4954834156696198,最低适应度值为0.026357438143339962
第一代,最大适应度值为0.9896341348743642,平均适应度值为0.6389232683504396,最小适应度值为0.08107863902455653
第二代最大适应度值为0.9896446473786993, 平均适应度值为0.6443137824492189, 最小适应度值为0.009866848370089831
第四代,最高适应度值为0.9902239532518116,平均适应度值为0.7654922570385395,最低适应度值为0.17033709734517277
第五代,最高适应度值为0.9902234122354928,平均适应度值为0.7453572750578633,最低适应度值为0.10205681592882726
第六代,最高适应度值为0.9902532734866867,平均适应度值为0.7587122305429048,最低适应度值为0.05908208763899786
第七代,最高适应度值为0.988001225616707,平均适应度值为0.7547165619142523,最低适应度值为0.08094648959231021
第九代,最高适应度值为0.9766098966273332,平均适应度值为0.8277463861718509,最低适应度值为0.10369966141993042
第10代:最高适应度值为0.9901963068825237,平均适应度值为0.8131921085507838,最低适应度值为0.0775567804832944
第11代,最高适应度值为0.990213650807025,平均适应度值为0.7541319083194324,最低适应度值为0.019304840353681407
第12代:最高适应度值为0.9902767546258016,平均适应度值为0.828972110480419,最低适应度值为0.18060758183964543
第13代:最大适应度值等于0.9902823344017536,平均适应度值等于0.839133029896098,最小适应度值等于0.09206618595168747
第14代,最高适应度值为0.9902823482240481,平均适应度值为0.816311002247176,最低适应度值为0.015280046910190914
第15代,最高适应度值为0.9902822812914671,平均适应度值为0.8492426908421313,最低适应度值为0.018977570371294883
第十六代:最高适应度值为0.9902828203436129,平均适应度值为0.8519033341303439,最低适应度值为0.059747682329074236
第十七代,最高适应度值为0.9902837035145464,平均适应度值为0.8314486723896841,最低适应度值为0.004575430144862003
第十八代,最高适应度值为0.990253119036802,平均适应度值为0.8232468028759858,最低适应度值为0.040669443165425145
第十九代:最高适应度值为0.9902835737967071,平均适应度值为0.8559589544529953,最低适应度值为0.21049951834022107
第20代:最高适配度等于0.9902836904086549,平均适配度等于0.8685120518082863,最低适配度等于0.15147497179373443
第21代:最大适应度值为0.9902836904086549,平均适应度值为0.8903009987627556,最小适应度值为0.18994062077096507
第22代:最高适应度值为0.9902508370160821,平均适应度值为0.8924340233493286,最低适应度值为0.021480365294719916
第23代:最高适应度值为0.9902734807604113,平均适应度值为0.9290448481639154,最低适应度值为0.7629914990882563
第24代:最高适应度值为0.9902821690831047,平均适应度值为0.9081769113471703,最低适应度值为0.6695310196021943
第25代:最高适应度值为0.9902796879493828,平均适应度值为0.8709331855555666,最低适应度值为0.2348856228952662
第26代:最高适应度值为0.9902812015265526,平均适应度值为0.8901397957096484,最低适应度值为0.15844925421496586
第27代:最高适应度值为0.9900221032625915,平均适应度值为0.8264579495511838,最低适应度值为0.10859938441467354
第28代:最高适应度值为0.9892920708389932,平均适应度值为0.8015430201401004,最低适应度值为0.056693594823612414
第29代:最高适应度值为0.9833920430914822,平均适应度值为0.8206139023353433,最低适应度值为0.1082901727953463
第30代:最高适应度值为0.9828794877220948,平均适应度值为0.8004584724088397,最低适应度值为0.11731667410765284
第32代,最高适应度值为0.990283753599569,平均适应度值为0.8199371219521729,最低适应度值为0.10644998082782225
第33代,最高适应度值为0.9902837699955644,平均适应度值为0.8597873339248817,最低适应度值为0.20077301892086524
第34代,最高适应度值为0.9902837699955644,平均适应度值为0.8454472814215785,最低适应度值为0.08825076588226233
第36代,最高适应度值为0.990279999439227,平均适应度值为0.8520049904678916,最低适应度值为0.10019399954941655
第37代,最高适应度值为0.9902320536812586,平均适应度值为0.9023291196375776,最低适应度值为0.41728376693329466
第38代,最高适应度值为0.9902320536812586,平均适应度值为0.8668440551949226,最低适应度值为0.10360927384616242
第39代,最高适应度值为0.9902837014700696,平均适应度值为0.9114844260304971,最低适应度值为0.5489750669896547
第40代:最大适应度值为0.9902837014700696,平均适应度值为0.8620099093503444,最小适应度值为0.004365274341785297
第四十一代,最高适应度值为0.9897328233086381,平均适应度值为0.8327726934350238,最低适应度值为0.06427780857535492
第四十二代:最高适应度值为0.9897928104619498,平均适应度值为0.8743312912620645,最低适应度值为0.060225019863451135
第43代,最高适应度值为0.9898000871934206,平均适应度值为0.8978114796170995,最低适应度值为0.045407253293564265
第四十五代,最高适应度值为0.9901178376722239,平均适应度值为0.8806260978790599,最低适应度值为0.16258860123727759
第四十七代,最高适应度值为0.989775231801967,平均适应度值为0.8700757075464726,最低适应度值为0.02156973517763916
第48代,最高适应度值为0.9898536023469197,平均适应度值为0.8594761464301988,最低适应度值为0.11657917251830979
第四十九代,最高适应度值为0.9897196901177616,平均适应度值为0.8770079237411545,最低适应度值为0.11972049418717212
第50代:最高适应度值为0.9897196371119559,平均适应度值为0.9002571155206402,最低适应度值为0.13423958282986176
第51代:最高适应度值为0.9899560515296949,平均适应度值为0.9181986834385516,最低适应度值为0.597077361981889
第52代:最高适应度值为0.9885029148493402,平均适应度值为0.8708363470060257,最低适应度值为0.043658930205161595
第53代:最高适应度值为0.9898597420386093,平均适应度值为0.9351473828165395,最低适应度值为0.8200722568914485
第54代:最高适应度值为0.9894058975143611,平均适应度值为0.9036548448033881,最低适应度值为0.17267449873023882
第55代:最高适应度值为0.9894062638670005,平均适应度值为0.9150278739259974,最低适应度值为0.23424982829126084
第56代,最高适应度值为0.9899506385103369,平均适应度值为0.8732725501494651,最低适应度值为0.06222935368966337
第59代,最高适应度值为0.9900539698566249,平均适应度值为0.9495511848435723,最低适应度值为0.633085313605261
第60代:最高适应度值为0.9900539529917773,平均适应度值为0.9115081724358929,最低适应度值为0.021850465288007437
第62代,最高适应度值为0.9900235402437028,平均适应度值为0.9306158968255482,最低适应度值为0.6515276198998533
第63代,最高适应度值为0.990263913324229,平均适应度值为0.8956523021597111,最低适应度值为0.035233302363883556
第64代:最高适应度值为0.9901681431506326,平均适应度值为0.8956172110867192,最低适应度值为0.1945972191417149
第66代:最高适应度值为0.9896959531296141,平均适应度值为0.8500543663322834,最低适应度值为0.07531027814562136
第67代:最高适应度值为0.9894693506701615,平均适应度值为0.9281582045383859,最低适应度值为0.4279468811103081
第68代:最高适应度值为0.9894693506701615,平均适应度值为0.9356177136267958,最低适应度值为0.5714412442324988
第七十代:最高适应度值为0.9895338801371154,平均适应度值为0.9235126547905986,最低适应度值为0.05167448490129434
第七十一代,最高适应度值为0.9897111219076946,平均适应度值为0.9319031829907384,最低适应度值为0.0912571306021644
第72代:最高适应度值为0.9897111970472705,平均适应度值为0.9393488758509659,最低适应度值为0.21904796216088052
第73代,最高适应度值为0.9898154883843702,平均适应度值为0.9347005559940584,最低适应度值为0.20108294686616346
第74代:最高适应度值为0.9899411554610307,平均适应度值为0.9146350451718519,最低适应度值为0.06998284354336853
第75代:最高适应度值为0.9901708033146926,平均适应度值为0.8952880685536267,最低适应度值为0.16670039919812546
第78代,最高适应度值为0.9897162008960827,平均适应度值为0.96545823094931,最低适应度值为0.5919166179118072
第七十九代,最高适应度值为0.9897160150835613,平均适应度值为0.9351326469970198,最低适应度值为0.036252579829132714
第八十代:最大适应度值为0.9897105303541627,平均适应度值为0.9481517492234786,最小适应度值为0.6085372241716369
第81代:最高适应度值为0.9892663719224909,平均适应度值为0.9397109983135599,最低适应度值为0.5736823388562267
第85代:最高适应度值为0.9891913230588913,平均适应度值为0.9550868835250651,最低适应度值为0.4064975617638628
第86代:最高适应度值为0.9896700002469235,平均适应度值为0.9330158941766133,最低适应度值为0.06158537369942496
第87代:最高适应度值为0.989903756473989,平均适应度值为0.9341424557339525,最低适应度值为0.040855666821667525
第89代:最高适应度值为0.9900785903799467,平均适应度值为0.9341456450561451,最低适应度值为0.20886675593718107
第91代:最高适应度值为0.9899261524327265,平均适应度值为0.946749255595407,最低适应度值为0.3417097255939362
第92代:最高适应度值为0.990283609719373,平均适应度值为0.9128767491066817,最低适应度值为0.03479987780897059
第93代:最高适应度值为0.990283609719373,平均适应度值为0.951832013218665,最低适应度值为0.30070086061226486
第94代:最大适应度值为0.9902836136408383,平均适应度值为0.9667134217904514,最小适应度值为0.8041697659204078
代际九五:最高适配度等于零点九九零二八三六一八六零三四,平均适配度等于零点九四零六三三七零七一八二一七,最低适配度等于零点一四二零九六五一三六二一零八三一六
第96代:最高适应度值等于0.9902840583338006,平均适应度值等于0.9292624947205386,最低适应度值等于0.14207223687962006
第97代:最高适应度值为0.9902840585020025,平均适应度值为0.9019028078753536,最低适应度值为0.11411014902484845
第99代:最高适应度值为0.9902813181665471,平均适应度值为0.8843522791501331,最低适应度值为0.08013416036243043
第100代:最高适应度值为0.9902397388852495,平均适应度值为0.9182929719641173,最低适应度值为0.4713882357517271
第102代:最高适应度值为0.9898719023702025,平均适应度值为0.8991690591537469,最低适应度值为0.058076541765653744
第103代,最高适应度值为0.9898698756134588,平均适应度值为0.9223012738700817,最低适应度值为0.6529482222958387
第104代,最高适应度值为0.989865391053623,平均适应度值为0.9224985507233615,最低适应度值为0.05794561415279992
第107代:最高适应度值为0.9898280387574951,平均适应度值为0.916709984391681,最低适应度值为0.057860394482743716
第108代:最高适应度值为0.9898691146354848,平均适应度值为0.9337946447508116,最低适应度值为0.4089157675876794
第109代:最高适应度值为0.9898691146354848,平均适应度值为0.918791522648331,最低适应度值为0.05817954562906341
第113代,最高适应度值为0.9902840201049796,平均适应度值为0.9045355178915492,最低适应度值为0.03381901279146765
第114代,最高适应度值为0.9899410163203375,平均适应度值为0.9183186805384805,最低适应度值为0.6812529148820022
第115代:最高适应度值为0.9902418290152855,平均适应度值为0.9202110123861348,最低适应度值为0.6721217857002006
第116代:最高适应度值为0.990260497694653,平均适应度值为0.8927166887966762,最低适应度值为0.07622803243622345
第117代:最高适应度值为0.9902605248024086,平均适应度值为0.9122048263397963,最低适应度值为0.6721217857002006
第123代,最高适应度值为0.9897434816434533,平均适应度值为0.9089396816578547,最低适应度值为0.05748252474298421
第124代,最高适应度值为0.9898321233474185,平均适应度值为0.9281639336432069,最低适应度值为0.2178254637069092
第128代:最高适应度值为0.9898899638122743,平均适应度值为0.8944386790449361,最低适应度值为0.217205932484349
第130代:最高适应度值为0.9900040096309284,平均适应度值为0.8818203210610588,最低适应度值为0.09540343767642073
第133代,最高适应度值为0.9902657145532778,平均适应度值为0.8852305848646985,最低适应度值为0.05989763073531268
第135代,最高适应度值为0.9899074678811768,平均适应度值为0.9126775465687764,最低适应度值为0.06806432302595394。
第136代:最高适应度值为0.9901051861140332,平均适应度值为0.9281862156278415,最低适应度值为0.668936206924557
第137代,最高适应度值为0.9899496024019264,平均适应度值为0.9193007202855796,最低适应度值为0.13061748787984778
第138代:最高适应度值为0.9897566064992529,平均适应度值为0.892318080150125,最低适应度值为0.06060813290703382
第141代,最高适应度值为0.9902729146280362,平均适应度值为0.9200429348080666,最低适应度值为0.4328653349357341
第142代,最高适应度值为0.9902729146280362,平均适应度值为0.9077687099143297,最低适应度值为0.09277980107149059
第144代,最高适应度值为0.9901485145025357,平均适应度值为0.8906784589748753,最低适应度值为0.06649268644515649
第145代,最高适应度值为0.9901484869507768,平均适应度值为0.9669407934551931,最低适应度值为0.8545644492559092
第146代:最高适应度值为0.9901525984053179,平均适应度值为0.9560884565945662,最低适应度值为0.5775589159452273
第147代,最高适应度值为0.9901526074533769,平均适应度值为0.9455069081688297,最低适应度值为0.16546062880882784
第149代,最高适应度值为0.9901375379792172,平均适应度值为0.9623465454943375,最低适应度值为0.6861861456373193
遗传算法的实际应用
工程设计
import random
import numpy as np
import matplotlib.pyplot as plt
# 目标函数:计算桥梁的成本和强度
def bridge_fitness(params):
成本与参数的总和直接相关,参数值越大,成本值就越高
强度与参数偏离理想值的大小成反比关系,计算方法为1除以1加上参数与1差值的平方和,差值平方和通过将参数减去1后求平方再求和得到
# 遗传算法实现
遗传算法通过设定种群规模,参数维度,以及迭代代数来进行计算,其中种群规模代表个体数量,参数维度决定变量个数,迭代代数体现优化过程持续的时间
# 初始化种群
种群数组 = 用随机数填充多个列表元素, 每个列表包含特定数量的数值, 总共生成指定数量的列表, 每个列表的数值个数固定
# 计算适应度
适应度值通过遍历种群中的每个个体来计算,每个个体的适应度值单独计算后存入列表中,最终形成完整的适应度值集合
# 选择
挑选出适应度排名前一半的个体,使用numpy库中的argsort函数对适应度数组进行排序,然后取后半部分作为结果,这个操作会得到一个索引数组
# 交叉
children = []
选取群体中的两个个体,分别作为parent1和parent2
子代等于双亲之和除以二,这是一种基础的混合方式
children.append(child)
population.extend(children)
# 变异
if random.random() < 0.1: # 10% 的变异概率
population[i] += np.random.normal(0, 0.1, param_size) # 添加随机噪声
# 记录当前最优适应度值
best_fitness = max(fitness)
best_fitness_history.append(best_fitness)
print(f"Generation {generation}: Best Fitness = {best_fitness}")
# 可视化适应度值的变化
plt.figure(figsize=(10, 6))
plt.plot(range(generations), best_fitness_history, marker='o', linestyle='-', color='b')
plt.title("Genetic Algorithm: Best Fitness Over Generations")
plt.xlabel("Generation")
plt.ylabel("Best Fitness")
plt.grid(True)
plt.show()
return population[np.argmax(fitness)]
# 运行遗传算法
best_params = genetic_algorithm(pop_size=50, param_size=10, generations=100)
print("Best Parameters:", best_params)
输出结果:
第二代最佳适配度值等于负三点一九六五六六零八六六二九八零三
第六代:最优适应度值为负二点七六六六八二二七五二八一一一九
第八代,最优适配度等于负二点四四四二零四七四零八五零四四四
型号二十四:最优健康度等于负点七七二八六九五七三七三五四五五
第二十五代最佳适配度值等于负点九四八一一一八五零九六一七六二九
型号二十七:最优健康度等于负零点六七八五三零六四二五二七零四
第35代,最优适配度值为负零点一九七八七九一一二二二五三一四五七
第四十代:最优健康水平为0.168573395636448
第四十二代,最优适配度达到零点四四八二四五二一七一零八四四三三
第四十五代,最优健康程度等于一,点零零四五七九九零五六一七三三五
第四十七代,最优适配度等于一,点零零四五六,九零五九,六一七三,三五
第五十一代:最优适配度等于一点三六四零四七五八七二八七四六
型号55:最优健康程度等于一点九五八五九八五八七二二五四七
第69代:最优适配度等于三点五六二零零八六二四四一零四九八
第七十六代,最优适配值为四点零三五零九一二零一五二八六五
八零世代:最优健康指数为四点八七一七六零六七八八三六一二五
世代八十四,最优适配值为五点零九一零四八七四七七五九一六
九七世代:最优适配度等于六点三九七八六零四九八五二三四
负零点七一一二五七三,负零点五二七零九三四七,负零点五六五三一八九,负零点九三零五九零二八

交通与船运路线(巡回售货员问题)
import numpy as np
import random
import matplotlib.pyplot as plt
# 定义城市坐标
cities = np.array([
])
# 计算路径的总距离
distance = 0
city1 = cities[route[i]]
city2 = cities[route[i + 1]]
# 返回起点
距离增加等于路线末尾城市减去路线起始城市坐标点差的欧式距离
return distance
# 初始化种群
设置种群规模,确定城市数量,完成初始化过程,其中规模代表个体数目,数量指代城镇数目,两者共同构成初始化的基础参数
population = []
for _ in range(pop_size):
random.shuffle(route)
population.append(route)
return population
# 选择操作
parents = []
for _ in range(num_parents):
idx = np.argmin(fitness), 找到适应度值最大也就是距离最小那个体, 将其索引存入idx
列表将父辈加入其中, 索引值为 idx 的个体被添加进去, 这个体属于当前种群
return parents
# 交叉操作(顺序交叉)
child = [None] * len(parent1)
ptr = 0
for gene in parent2:
if gene not in child:
while child[ptr] is not None:
ptr += 1
child[ptr] = gene
return child
# 变异操作(交换两个城市)
if random.random() < mutation_rate:
idx1, idx2 = random.sample(range(len(route)), 2)
route[idx1], route[idx2] = route[idx2], route[idx1]
return route
# 可视化路径
def plot_route(route, title):
plt.figure(figsize=(10, 6))
plt.scatter(cities[:, 0], cities[:, 1], c='red', s=100, label='Cities') # 绘制城市点
for i in range(len(route) - 1):
city1 = cities[route[i]]
city2 = cities[route[i + 1]]
plt.plot([city1[0], city2[0]], [city1[1], city2[1]], 'b-') # 绘制路径
# 返回起点
city1 = cities[route[-1]]
city2 = cities[route[0]]
plt.plot([city1[0], city2[0]], [city1[1], city2[1]], 'b-')
plt.title(title)
plt.xlabel('X Coordinate')
plt.ylabel('Y Coordinate')
plt.legend()
plt.show()
# 遗传算法主函数
def genetic_algorithm(cities, pop_size=50, generations=100, mutation_rate=0.01):
num_cities = len(cities)
population = initialize_population(pop_size, num_cities)
for generation in range(generations):
# 计算适应度
fitness = [calculate_distance(route) for route in population]
# 选择
parents = selection(population, fitness.copy(), pop_size // 2)
# 交叉
children = []
while len(children) < pop_size - len(parents):
parent1, parent2 = random.sample(parents, 2)
child = crossover(parent1, parent2)
children.append(child)
# 变异
children = [mutate(child, mutation_rate) for child in children]
# 更新种群
population = parents + children
# 输出当前最优解
best_fitness = min(fitness)
print(f"Generation {generation}: Best Distance = {best_fitness}")
# 返回最优路径
best_route = population[np.argmin(fitness)]
return best_route
# 运行遗传算法
best_route = genetic_algorithm(cities)
print("Best Route:", best_route)
# 可视化最优路径
plot_route(best_route, "Best Route Found by Genetic Algorithm")
输出结果:
第三代最佳距离等于五百九十八点一二五七一六一五九七一七
第十七代:最优距离为四百八十六点九八三八零五一四五七三六四
第十八代最佳距离为四百五十九点九八九四三五九四三一九四一
第20代:最佳距离为四百五十九点九八九四三五九四三一九一
第32代最佳距离为四百五十九点九八九四三五九四三一九四一
第34代,最优距离为四百五十九点九八九四三五九四三一九四一
第四十七代,最优距离为四百五十九点九八九四三五九四三一九四一
型号五十五:最优距离等于四百五十九点九八九四三五九四三一九四一
第57组数据:最优距离为四百五十九点九八九四三五四三一九四一
第61代:最优距离等于四百五十九点九八九四三五九四三一九四一
系列六十三最优距离等于四百五十九点九八九四三五九四三一九四一
第七十二代:最佳距离等于四百五十九点九八九四三五九四三一九四一
第78代:最佳距离等于四百五十九点九八九四三五九四三一九四一
型号八十四:最优距离等于四百五十九点九八九四三五九四三一九四一
型号八十五:最优距离等于四百五十九点九八九四三五九四三一九四一
代号为九七的那一批,最优距离等于四百五十九点九八九四三五九四三一九四一

结语
实践建议: