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

频道:生活应用 日期: 浏览:6

遗传算法原理与Python实现_遗传算法应用生活实例_遗传算法应用案例

遗传算法,这一优化工具,其核心在于模仿自然界的选择与遗传过程,被广泛用于处理各种复杂的优化难题。接下来,我将详细介绍遗传算法的基本原理、操作步骤,以及如何在 Python 环境下进行实现。

遗传算法理论的由来

遗传算法汲取了生物进化论的思想精髓,特别是达尔文的“适者生存”原则。它通过模仿自然界中的选择、基因重组以及突变等现象,在庞大的搜索领域中探寻最佳的解决方案。

遗传算法定义

遗传算法属于一种以种群为优化基础的算法,其迭代优化的过程涉及以下环节:

启动过程:首先随机构建初始的种群集合。筛选过程:接着依据个体的适应度标准挑选出表现优异的成员。繁殖过程:通过交叉遗传的方式创造出新的个体。变异过程:利用变异机制增加种群的多样性。迭代过程:不断重复上述步骤,直至达到终止条件。遗传算法的操作流程主要包括以上几个环节。

初始化(编码)

将问题解决方案的编码转换成染色体形式kaiyun全站app登录入口,例如二进制序列或浮点数值kaiyun全站登录网页入口,同时随机构建初始的种群集合。

适应度函数

设立一个评估个体优劣的适应度标准。该值越高,代表个体表现越佳。

选择

依据适应性指标挑选出杰出的个体,通常采用的策略有轮盘赌式选择和锦标赛式选择等。

交叉

通过交叉操作生成新个体。常用方法包括单点交叉、多点交叉等。

变异

通过实施变异策略来增加遗传多样性,以此防止陷入局部最优解。这一策略通常涉及随机变异和均匀变异等多种手段。

遗传算法应用

如何利用遗传算法解决一个二元函数的最大值求解问题。

问题

假设我们需要优化以下二元函数:

遗传算法应用案例_遗传算法原理与Python实现_遗传算法应用生活实例

目标是找到

范围内的最大值。

导入mpl_toolkits模块中的mplot3d子模块。
import numpy as np
导入matplotlib.pyplot库,以便后续进行数据可视化操作。
# 创建图形和 3D 坐标轴
创建一个图形对象,其尺寸设置为10x6英寸。
# 生成数据
x = np.arange(-10, 10, 0.1)
y = np.arange(-10, 10, 0.1)
X, Y = np.meshgrid(x, y)
Z 等于 0.5 减去(正弦函数的平方根下 X 的平方加 Y 的平方)的平方再减去 0.5,然后除以(1 加上 0.001 乘以 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()

输出结果:

遗传算法应用生活实例_遗传算法原理与Python实现_遗传算法应用案例

创造染色体(编码)

编码为二进制串,每个变量用 25 位二进制数表示。

个体、种群与进化

通过选择、交叉和变异操作,逐步优化种群kaiyun.ccm,找到最优解。

代码实现

import math
import random
class Population:
初始化时,需指定大小参数、染色体长度、拷贝数、配子数以及最大世代数。
self.individuals 被初始化为一个空集合,用于存储个体信息。
个体适应度列表初始化为空
个体选择概率的集合已被初始化为空列表。
self.new_individuals 初始化为一个空列表,用于存放新一代的个体成员。
self.elitist字典中包含以下信息:其染色体属性为一个包含两个零的列表,适应度属性为0,年龄属性同样为0,这代表了一个表现最优的个体。
将种群规模设定为:size
自身的染色体长度被设定为染色体大小。
将交叉概率设定为cp。
本对象的变异概率设定为mp。
本实例的最大迭代次数设定为gen_max。
将迭代次数初始化为0,设定当前年龄值为零。
        # 初始化种群
v 等于 2 的 self.chromosome_size 次方减去 1。
        for _ in range(self.size):
self.individuals中新增元素,该元素为一个列表,列表内包含两个随机整数,范围均为0至v。
self.new_individuals中新增了一个包含两个零的列表。
            self.fitness.append(0)
self.selector_probability列表中新增了一个元素,其值为0。
实现解码功能时,需指定时间间隔和染色体参数。
        """将染色体解码为区间内的数值"""
        d = interval[1] - interval[0]
n 等于 2 的 self.chromosome_size 次幂减 1 的浮点数表示。
返回值等于区间首项加上染色体乘以步长除以总长度的结果。
定义一个名为fitness_func的方法,该方法接受两个参数:chrom1和chrom2。
        """计算适应度"""
        interval = [-10.0, 10.0]
x 等于 本身对时间间隔和染色体1进行解码的结果。
n 等于 x 和 y 的平方和的平方根的正弦值的平方,再减去 0.5。
d 等于(1 加上 0.001 乘以 x 的平方 加上 y 的平方)的平方。
        return 0.5 - n / d
    def evaluate(self):
        """评估种群"""
        for i in range(self.size):
个体i的适应度值被设定为,通过将个体i的第一个和第二个属性传递给适应度函数计算得出的结果。
        ft_sum = sum(self.fitness)
        for i in range(self.size):
自身的选择概率在第i个位置被设定为第i个个体的适应度除以总的适应度之和。
        for i in range(1, self.size):
自身选择概率的第i个值增加,其增量等于自身选择概率的第i-1个值。
    def select(self):
        """选择操作"""
        t = random.random()
        for i in range(self.size):
若当前索引i的选取概率大于阈值t,
                return i
        return self.size - 1
实现交叉操作时,需传入染色体1和染色体2作为参数。
        """交叉操作"""
        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:
self.elitist字典中'chromosome'键对应的列表的第一个元素被赋值为self.individuals列表中第j个元素的第一个元素。
self.elitist字典中键为'chromosome'的列表的第二项被赋值为self.individuals列表中索引为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.9902239251370824,平均适应度值为0.7678734036680478,最小适应度值为0.12770111031371967。
第四代:最大适应度值为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.9880841852899815,平均适应度值为0.7143451662181528,最小适应度值为0.0026464867718520857。
第九代:最大适应度值为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。
第16代:最大适应度值为0.9902828203436129,平均适应度值为0.8519033341303439,最小适应度值为0.059747682329074236。
第17代:最大适应度值为0.9902837035145464,平均适应度值为0.8314486723896841,最小适应度值为0.004575430144862003。
第18代:最大适应度值为0.990253119036802,平均适应度值为0.8232468028759858,最小适应度值为0.040669443165425145。
第19代:最大适应度值为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。
第31代:最大适应度值为0.9902839583783066,平均适应度值为0.8231508084286224,最小适应度值为0.19241132809400424。
第32代:最大适应度值为0.990283753599569,平均适应度值为0.8199371219521729,最小适应度值为0.10644998082782225。
第33代:最大适应度值为0.9902837699955644,平均适应度值为0.8597873339248817,最小适应度值为0.20077301892086524。
第34代:最大适应度值为0.9902837699955644,平均适应度值为0.8454472814215785,最小适应度值为0.08825076588226233。
第35代:最大适应度值为0.99028,平均适应度值为0.82779,最小适应度值为0.26237。
第36代:最大适应度值为0.99028,平均适应度值为0.85200,最小适应度值为0.10019。
第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。
第41代:最大适应度值为0.9897328233086381,平均适应度值为0.8327726934350238,最小适应度值为0.06427780857535492。
第42代:最大适应度值为0.9897928104619498,平均适应度值为0.8743312912620645,最小适应度值为0.060225019863451135。
第43代:最大适应度值为0.9898000871934206,平均适应度值为0.8978114796170995,最小适应度值为0.045407253293564265。
第44代:最大适应度值为0.9901178376722239,平均适应度值为0.8844167857528693,最小适应度值为0.021872889075361335。
第45代:最大适应度值为0.9901178376722239,平均适应度值为0.8806260978790599,最小适应度值为0.16258860123727759。
第46代:最大适应度值为0.9901210334388395,平均适应度值为0.8758831550114653,最小适应度值为0.4136468497338621。
第47代:最大适应度值为0.989775231801967,平均适应度值为0.8700757075464726,最小适应度值为0.02156973517763916。
第48代:最大适应度值为0.9898536023469197,平均适应度值为0.8594761464301988,最小适应度值为0.11657917251830979。
第49代:最大适应度值为0.9897196901177616,平均适应度值为0.8770079237411545,最小适应度值为0.11972049418717212。
第五十代:最大适应度值为0.9897196371119559,平均适应度值为0.9002571155206402,最小适应度值为0.13423958282986176。
第五十一代:最大适应度值为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。
第57代:最大适应度值为0.9901892597299891,平均适应度值为0.9380201015735815,最小适应度值为0.6059051407908205。
第58代:最大适应度值为0.9899659510449677,平均适应度值为0.9430460926162836,最小适应度值为0.650257512766607。
第59代:最大适应度值为0.9900539698566249,平均适应度值为0.9495511848435723,最小适应度值为0.633085313605261。
第60代:最大适应度值为0.9900539529917773,平均适应度值为0.9115081724358929,最小适应度值为0.021850465288007437。
第61代:最大适应度值为0.9901443387994644,平均适应度值为0.9380211708892697,最小适应度值为0.6347087167499745。
第62代:最大适应度值为0.9900235402437028,平均适应度值为0.9306158968255482,最小适应度值为0.6515276198998533。
第63代:最大适应度值为0.990263913324229,平均适应度值为0.8956523021597111,最小适应度值为0.035233302363883556。
第64代:最大适应度值为0.9901681431506326,平均适应度值为0.8956172110867192,最小适应度值为0.1945972191417149。
第65代:最大适应度值为0.9900229650353243,平均适应度值为0.8854720103462003,最小适应度值为0.39245504516275703。
第66代:最大适应度值为0.9896959531296141,平均适应度值为0.8500543663322834,最小适应度值为0.07531027814562136。
第67代:最大适应度值为0.9895,平均适应度值为0.9282,最小适应度值为0.4280。
第68代:最大适应度值为0.9895,平均适应度值为0.9356,最小适应度值为0.5714。
第69代:最大适应度值为0.9894843784617469,平均适应度值为0.9468644377286854,最小适应度值为0.7363839024011957。
第70代:最大适应度值为0.9895338801371154,平均适应度值为0.9235126547905986,最小适应度值为0.05167448490129434。
第71代:最大适应度值为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。
第76代:最大适应度值为0.9902518474101847,平均适应度值为0.9274414073070824,最小适应度值为0.15708932120606323。
第77代:最大适应度值为0.990271647449124,平均适应度值为0.9365563858204429,最小适应度值为0.20616640249458001。
第78代:最大适应度值为0.9897162008960827,平均适应度值为0.96545823094931,最小适应度值为0.5919166179118072。
第79代:最大适应度值为0.9897160150835613,平均适应度值为0.9351326469970198,最小适应度值为0.036252579829132714。
80代:最大适应度值为0.9897105303541627,平均适应度值为0.9481517492234786,最小适应度值为0.6085372241716369。
第81代:最大适应度值为0.9892663719224909,平均适应度值为0.9397109983135599,最小适应度值为0.5736823388562267。
第82代:最大适应度值为0.9898693768127402,平均适应度值为0.9399174952983691,最小适应度值为0.2077241133455865。
第83代:最大适应度值为0.9898693768127402,平均适应度值为0.9119991181698218,最小适应度值为0.07837053062900012。
第84代:最大适应度值为0.9894719287957476,平均适应度值为0.9240305817611228,最小适应度值为0.22460258342382566。
85代:最大适应度值为0.9891913230588913,平均适应度值为0.9550868835250651,最小适应度值为0.4064975617638628。
第86代:最大适应度值为0.9896700002469235,平均适应度值为0.9330158941766133,最小适应度值为0.06158537369942496。
87代:最大适应度值为0.989903756473989,平均适应度值为0.9341424557339525,最小适应度值为0.040855666821667525。
第88代:最大适应度值为0.9900860195762067,平均适应度值为0.9485786377849612,最小适应度值为0.7750942730460575。
89代:最大适应度值为0.9900785903799467,平均适应度值为0.9341456450561451,最小适应度值为0.20886675593718107。
90后一代:最大适应度值为0.9900821481517961,平均适应度值为0.9513498904017674,最小适应度值为0.7188424883900982。
代际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。
95代:最大适应度值为0.9902836146186034,平均适应度值为0.9406337307108217,最小适应度值为0.14209651362108316。
第96代:最大适应度值为0.9902840583338006,平均适应度值为0.9292624947205386,最小适应度值为0.14207223687962006。
97代:最大适应度值为0.9902840585020025,平均适应度值为0.9019028078753536,最小适应度值为0.11411014902484845。
第98代:最大适应度值为0.9902397440084794,平均适应度值为0.9324918107281946,最小适应度值为0.23174893848640543。
99代:最大适应度值为0.9902813181665471,平均适应度值为0.8843522791501331,最小适应度值为0.08013416036243043。
在Generation 100这一代中,最大适应度达到了0.9902397388852495,平均适应度是0.9182929719641173,而最小适应度则为0.4713882357517271。
Generation 101的参数如下:最大适应度值为0.9902370762122024,平均适应度值为0.9112174896829776,最小适应度值为0.06262690501546114。
在第二代中,最大适应度达到了0.9898719023702025,平均适应度为0.8991690591537469,最小适应度则为0.058076541765653744。
第103代:最大适应度值为0.9898698756134588,平均适应度值为0.9223012738700817,最小适应度值为0.6529482222958387。
第104代:最大适应度值为0.989865391053623,平均适应度值为0.9224985507233615,最小适应度值为0.05794561415279992。
第105代:最大适应度值为0.9898661432537672,平均适应度值为0.9441908197254391,最小适应度值为0.7233615536922622。
第106代:最大适应度值为0.9898280387574951,平均适应度值为0.939737488991593,最小适应度值为0.7233607392004844。
第107代:最大适应度值为0.9898280387574951,平均适应度值为0.916709984391681,最小适应度值为0.057860394482743716。
第108代:最大适应度值为0.9898691146354848,平均适应度值为0.9337946447508116,最小适应度值为0.4089157675876794。
第109代:最大适应度值为0.9898691146354848,平均适应度值为0.918791522648331,最小适应度值为0.05817954562906341。
第110代:最大适应度值为0.9899163406274816,平均适应度值为0.9438086045852815,最小适应度值为0.7194092705688385。
第111代:最大适应度值为0.9899163406274816,平均适应度值为0.9269341026547441,最小适应度值为0.06862166512288664。
第112代:最大适应度值为0.9901223083747722,平均适应度值为0.9338418360002864,最小适应度值为0.24597827419720103。
第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。
第118代:最大适应度值为0.9902811577622135,平均适应度值为0.9252790982379808,最小适应度值为0.1651600877580096。
第119代:最大适应度值为0.9902607596267936,平均适应度值为0.9051200831714254,最小适应度值为0.08326216677244941。
在Generation 120这一代中,最大适应度达到了0.9897406797873018,平均适应度为0.9167976103900479,而最小适应度则是0.6827927788996135。
第121代:最大适应度值为0.9894687390941395,平均适应度值为0.8881350397756499,最小适应度值为0.04792454505095761。
第122代:最大适应度值为0.9896018594774207,平均适应度值为0.9340238969409352,最小适应度值为0.6808193173178512。
第三代:最大适应度值为0.9897434816434533,平均适应度值为0.9089396816578547,最小适应度值为0.05748252474298421。
在124代中,最大适应度达到了0.9898321233474185,平均适应度为0.9281639336432069,而最小适应度则是0.2178254637069092。
第125代:最大适应度值为0.990050182862042,平均适应度值为0.8863479370660392,最小适应度值为0.21576056357512474。
在本次第126代中,最大适应度达到了0.990050182862042,平均适应度为0.9354616588247786,而最小适应度则是0.6293193878400621。
第127代:最大适应度值为0.9898897204639511,平均适应度值为0.9130281391231467,最小适应度值为0.629332848201831。
第128代:最大适应度值为0.9898899638122743,平均适应度值为0.8944386790449361,最小适应度值为0.217205932484349。
第129代:最大适应度值为0.9900005631851577,平均适应度值为0.8654250813546114,最小适应度值为0.22502911420687544。
第130代:最大适应度值为0.9900040096309284,平均适应度值为0.8818203210610588,最小适应度值为0.09540343767642073。
第131代:最大适应度值为0.9901048357629503,平均适应度值为0.869244317491622,最小适应度值为0.17121938049212282。
第132代:最大适应度值为0.9900148311638743,平均适应度值为0.8762875769167254,最小适应度值为0.21404994258485138。
第133代:最大适应度值为0.9902657145532778,平均适应度值为0.8852305848646985,最小适应度值为0.05989763073531268。
第134代:最大适应度值为0.989907435818971,平均适应度值为0.8972327462460679,最小适应度值为0.06033524449037969。
第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。
第139代:最大适应度值为0.9901048144914171,平均适应度值为0.8826377130182601,最小适应度值为0.4983535695525108。
第十四代:最大适应度值为0.9897570398181499,平均适应度值为0.8837505169150961,最小适应度值为0.05721795788531914。
第141代:最大适应度值为0.9902729146280362,平均适应度值为0.9200429348080666,最小适应度值为0.4328653349357341。
第142代:最大适应度值为0.9902729146280362,平均适应度值为0.9077687099143297,最小适应度值为0.09277980107149059。
第143代:最大适应度值为0.99014063787308,平均适应度值为0.9320713622960852,最小适应度值为0.3541209347828336。
第144代:最大适应度值为0.9901485145025357,平均适应度值为0.8906784589748753,最小适应度值为0.06649268644515649。
在Generation 145中,最大适应度值为0.9901484869507768,平均适应度值为0.9669407934551931,最小适应度值为0.8545644492559092。
第146代:最大适应度值为0.9901525984053179,平均适应度值为0.9560884565945662,最小适应度值为0.5775589159452273。
第147代:最大适应度值为0.9901526074533769,平均适应度值为0.9455069081688297,最小适应度值为0.16546062880882784。
第148代:最大适应度值为0.9901526074533769,平均适应度值为0.9542875002805519,最小适应度值为0.4524957721574564。
第149代:最大适应度值为0.9901375379792172,平均适应度值为0.9623465454943375,最小适应度值为0.6861861456373193。

遗传算法的实际应用

遗传算法,亦称GA,是一种功能卓越的优化技术,其应用范围广泛,覆盖众多实际问题。在现实世界中,遗传算法的典型应用场景包括:

工程设计

设计阶段对模型构建与仿真分析的需求颇高,这有助于确保设计流程既高效又节省成本。在此过程中,遗传算法能够派上用场,对设计参数进行优化,比如:

对桥梁的设计参数进行优化,包括材料分配和支撑点布局等,旨在降低成本并提升结构的承重能力。

import random
import numpy as np
import matplotlib.pyplot as plt
# 目标函数:计算桥梁的成本和强度
def bridge_fitness(params):
桥梁的构造细节,包括材料分布、支撑位置等关键设计参数。
成本计算基于参数值的累加,即等于参数总和。
强度计算公式为:1除以(1加上参数与理想值之差的平方和),且该强度与参数偏离理想值的程度呈负相关关系。
力求强度最大化,同时成本最小化。
# 遗传算法实现
定义一个遗传算法函数,其参数包括种群规模、参数数量以及迭代代数。
    # 初始化种群
人口规模等于通过随机生成函数对参数规模进行随机分配的结果,该结果被应用于每个个体,形成了一个由pop_size个这样的随机分配结果组成的列表。
创建一个空列表,用于存储每一代所达到的最优适应度数值。
遍历每一代,从0开始至代数上限,依次执行:
        # 计算适应度
fitness 列表由对种群中每个个体应用桥接适应度函数的结果组成。
        # 选择
通过计算适应度,我们选取了排序后位于末尾的 50%,即适应度最高的个体,将其赋值给 selected。
人口数据 = [选取的个体[i]所对应的人口数]
        # 交叉
        children = []
在循环中,执行以下操作:以种群大小减去当前种群成员数量为上限,进行循环迭代。
parent1 和 parent2 均从种群中随机选取,各取两个个体。
子代基因是通过将父代1和父代2的基因组合后,再进行平均分配来实现的。这可以理解为一种简单的基因交叉过程。
            children.append(child)
        population.extend(children)
        # 变异
在遍历种群的过程中,对于每一个索引i,它都位于从0到种群长度减1的范围内。
            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)

输出结果:

第零代:最佳健康指数为-3.1965666086629803。
第一代:最佳健身指数为-3.1965666086629803。
第二代:最佳健身效果指数为-3.1965666086629803。
第三代:最佳健身效果指数为负三万一千三百五十九点三七九三三五九三七一一零五。
第四代产品:最佳性能指数为-3.073050347528962。
第五代产品:最佳健身效果指数为-2.784462861113548。
第六代产品:最佳健身效果指数为-2.766682275288119。
第七代产品:最佳健身指数为-2.766682275288119。
第八代产品:最佳健身指数为-2.4445204740850444。
第九代产品:最佳健身指数为-2.4445204740850444。
第十代:最佳健身指数为-2.1956089999206823。
第11代:最佳健身指数为-2.065947392327315。
第十二代:最佳健康状况指数为-2.066。
第13代:最佳健身指数为-2.0481715335523494。
第十四代:最佳健身指数为-1.995541312792798。
第15代:最佳健身指数为-1.995541312792798。
第16代:最佳健身指数为-1.870992217626249。
第17代:最佳健身指数为-1.779260045624249。
第18代:最佳健身指数为-1.3874976940886647。
第19代:最佳健身指数为-1.3874976940886647。
第20代:最佳健身指数为-1.3874976940886647。
21世纪一代:最佳健身指数为-0.7728695737335455。
第22代:最佳健身指数为-0.7728695737335455。
第23代:最佳健身指数为-0.7728695737335455。
第24代:最佳健身指数为-0.7728695737335455。
第25代:最佳健身指数为-0.9481118509617629。
第26代:最佳健身指数为-0.7666421931114844。
第27代:最佳健身指数为-0.678853064252704。
第28代:最佳健身指数为-0.678853064252704。
第29代:最佳健身指数为-0.5696965845567228。
第30代:最佳健身指数为-0.5696965845567228。
第31代:最佳健身指数为-0.5696965845567228。
第32代:最佳健身指数为-0.19787911222531457。
第33代:最佳健身指数为-0.19787911222531457。
第34代:最佳健身指数为-0.19787911222531457。
第35代:最佳健身指数为-0.19787911222531457。
第36代:最佳健康指数为0.031572760674921846。
第37代:最佳健身指数为0.168573395636448。
第38代:最佳健身指数为0.168573395636448。
第39代:最佳健身指数为0.168573395636448。
第40代:最佳健身指数为0.168573395636448。
第41代:最佳健身指数为0.3618601111138203。
42代产品:最佳健身指数为0.44824521710844434。
第43代:最佳健身指数为0.44824521710844434。
第44代:最佳健身指数为0.7446368705887136。
第45代:最佳健身指数为1.0045799059617335。
第46代:最佳健身值达到1.0045799059617335。
第47代:最佳健身指数为1.0045799059617335。
第48代:最佳健身指数为1.0045799059617335。
第49代:最佳健身指数为1.0045799059617335。
第五十代:最佳健身指数为1.3640475872878746。
第五十一代:最佳健身指数为1.3640475872878746。
第52代:最佳健身指数为1.4329004047375271。
第53代:最佳健身指数为1.5013556792515934。
第54代:最佳健身指数为1.9585985887225457。
第55代:最佳健身指数为1.9585985887225457。
第56代:最佳健身指数为2.73961887532364。
第57代:最佳健身指数为2.73961887532364。
第58代:最佳健身指数为2.73961887532364。
第59代:最佳健身指数为2.73961887532364。
第60代:最佳健身指数为2.73961887532364。
第61代:最佳健身指数为2.73961887532364。
第62代:最佳健身指数为2.8110155787986235。
第63代:最佳健身指数为2.8110155787986235。
第64代:最佳健身指数为2.8110155787986235。
65代:最佳健身指数为3.258898992317929。
第66代:最佳健身指数为3.258898992317929。
第67代:最佳健身指数为3.4676550007622406。
第68代:最佳健身指数为3.56,数值精确至小数点后七位。
第69代:最佳健身指数为3.56,数值精确至小数点后七位,即3.5620086264410498。
第七代产品:最佳健身指数为3.56,数值精确至小数点后七位,即3.5620086264410498。
第71代:最佳健身指数为3.65。
第72代:最佳健身指数为3.65,数值精确到小数点后六位。
第73代:最佳健身指数为3.8650955873728363。
第74代:最佳健身指数为3.8650955873728363。
第75代:最佳健身指数为3.8650955873728363。
第76代:最佳健身指数达到4.035091201528655。
77代:最佳健身指数为4.198909927458275。
第78代:最佳健身指数为4.655349527425295。
第79代:最佳健身指数为4.655349527425295。
80后一代:最佳健身指数为4.8717606678836125。
第81代:最佳健身指数为4.8717606678836125。
82代:最佳健身指数为4.8717606678836125。
第83代:最佳健身指数为5.09104874775916。
84代:最佳健身指数为5.09104874775916。
85后一代:最佳健身指数为5.09104874775916。
Generation 86:最佳健身指数为5.09104874775916。
87世代:最佳健身指数达到5.09104874775916。
世代88:最佳健身指数达到5.638080184789858。
89世代:最佳健身指数为5.638080184789858。
90后一代:最佳健身指数为5.453643041932155。
91代:最佳健身指数为5.901696009319434。
92代:最佳健身指数为5.901696009319434。
Generation 93组别中,最佳健身指数达到了5.97352800632088。
第94代:最佳健身指数为6.098588670965432。
95后一代:最佳健身指数为6.190729596015322。
第九十六代:最佳健身指数为6.190729596015322。
97代人群:最佳健身指数为6.397860498525234。
98代人群:最佳健身指数为6.509891070648545。
99代:最佳健身指数为6.509891070648545。
最佳参数为:-0.72047515,-0.84325645,-0.14463896,-0.49926481,-0.71148087,-0.81466747。

遗传算法原理与Python实现_遗传算法应用案例_遗传算法应用生活实例

交通与船运路线(巡回售货员问题)

巡回售货员问题,亦称TSP,系组合优化领域中的经典难题,其核心在于探寻一条最短路径,以便旅行者能够遍历所有城市并最终返回出发地。在此问题求解中,遗传算法展现出卓越的性能,并被广泛采纳应用于多个领域。

以下是一个运用遗传算法来处理巡回售货员问题(TSP)的代码实例。该实例详细阐述了如何对物流配送、公共交通系统或船舶调度等领域的路线规划进行优化。

import numpy as np
import random
import matplotlib.pyplot as plt
# 定义城市坐标
cities = np.array([
60至200区间,180至200区间,80至180区间,140至180区间,20至160区间。
将数值范围划分为[100, 160]、[200, 160]、[140, 140]、[40, 120]以及[100, 120]等几个区间。
])
# 计算路径的总距离
定义一个函数,用于计算路线的长度。
    distance = 0
在遍历路线的长度减一的范围内,对每个索引进行迭代。
        city1 = cities[route[i]]
        city2 = cities[route[i + 1]]
distance = distance + np.linalg.norm(city1 - city2) ,这是在计算city1和city2两点间的欧几里得距离
    # 返回起点
距离值累加,等于计算起点城市与终点城市之间的欧几里得距离,即:distance = distance + np.linalg.norm(cities[route的最后一个元素] - cities[route的第一个元素])。
    return distance
# 初始化种群
设定种群规模为pop_size,并初始化包含num_cities座城市的种群。
    population = []
    for _ in range(pop_size):
路线设定为从1到城市数量的整数序列列表。
        random.shuffle(route)
        population.append(route)
    return population
# 选择操作
进行选择操作,针对人群集合,基于适应度函数,选取指定数量的父代个体。
    parents = []
    for _ in range(num_parents):
通过计算,我们得到了适应度最低(即距离最短)的个体索引,并将其赋值给变量idx。
父母列表中添加了种群索引为idx的个体。
将fitness数组中索引为idx的元素赋值为无穷大,以防止再次进行重复选择。
    return parents
# 交叉操作(顺序交叉)
定义一个名为crossover的函数,该函数接受两个参数:parent1和parent2。
    child = [None] * len(parent1)
启动,结束 = 对parent1长度范围内的随机样本进行排序后选取的两个元素
子序列[child]从起始位置[start]到终止位置[end]被替换为父序列[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")

输出结果:

第一代:最佳距离为661.3160663375326。
第一代产品:最佳距离值为598.1257116159717。
第二代产品:最佳距离值为598.1257116159717。
第三代产品:最佳距离值为598.1257116159717。
第四代产品:最佳距离值为598.1257116159717。
第五代产品:最佳距离值为597.1871695635145米。
第六代产品:最佳距离值为570.1050569791831。
第七代产品:最佳距离值为570.1050569791831。
第八代产品:最佳距离值为570.1050569791831。
第九代产品:最佳距离值为570.1050569791831。
第10代产品:最佳距离值为570.1050569791831。
第11代:最佳距离为570.1050569791831米。
第12代:最佳距离为570.1050569791831米。
第13代:最佳距离为503.55千米。
第十四代产品:最佳距离为503.55千米。
第15代:最佳距离为503.55千米。
第16代:最佳距离为486.9838051457364米。
第17代:最佳距离为486.9838051457364米。
第18代:最佳距离为459.9894359431941米。
第19代:最佳距离为459.9894359431941米。
第20代:最佳距离为459.9894359431941米。
21世纪一代:最佳距离为459.9894359431941米。
第22代:最佳距离为459.9894359431941米。
第23代:最佳距离为459.9894359431941米。
第24代:最佳距离为459.9894359431941米。
第25代:最佳距离为459.9894359431941米。
第26代:最佳距离为459.9894359431941米。
第27代:最佳距离为459.9894359431941米。
第28代:最佳距离为459.9894359431941米。
第29代:最佳距离为459.9894359431941米。
第三十代:最佳距离为459.9894359431941米。
第31代:最佳距离为459.9894359431941米。
第32代:最佳距离为459.9894359431941。
第33代:最佳距离为459.9894359431941米。
第34代:最佳距离为459.9894359431941米。
第35代:最佳距离为459.9894359431941米。
第36代:最佳距离为459.9894359431941。
第37代:最佳距离为459.9894359431941米。
第38代:最佳距离为459.9894359431941米。
第39代:最佳距离为459.9894359431941米。
第40代:最佳距离为459.9894359431941米。
第四十一代:最佳距离为459.9894359431941米。
42代产品:最佳距离值为459.9894359431941。
第43代:最佳距离为459.9894359431941米。
第44代:最佳距离为459.9894359431941米。
第45代:最佳距离为459.9894359431941米。
第46代:最佳距离为459.9894359431941米。
第47代:最佳距离为459.9894359431941米。
第48代:最佳距离为459.9894359431941米。
第49代:最佳距离为459.9894359431941米。
第五十代:最佳距离为459.9894359431941米。
第五十一代:最佳距离为459.9894359431941米。
第52代:最佳距离为459.9894359431941米。
第53代:最佳距离为459.9894359431941米。
第54代:最佳距离为459.9894359431941米。
第55代:最佳距离为459.9894359431941米。
第56代:最佳距离为459.9894359431941米。
第57代:最佳距离为459.9894359431941米。
第58代:最佳距离为459.9894359431941米。
第59代:最佳距离为459.9894359431941米。
第60代:最佳距离为459.9894359431941米。
第61代:最佳距离为459.9894359431941米。
第62代:最佳距离为459.9894359431941米。
第63代:最佳距离为459.9894359431941米。
第64代:最佳距离为459.9894359431941米。
第65代:最佳距离为459.9894359431941米。
Generation 66:最佳距离值为459.9894359431941。
第67代:最佳距离为459.9894359431941米。
第68代:最佳距离为459.9894359431941米。
第69代:最佳距离为459.9894359431941米。
第七代产品:最佳距离值为459.9894359431941。
第71代:最佳距离为459.9894359431941米。
第72代:最佳距离为459.9894359431941米。
第73代:最佳距离为459.9894359431941米。
第74代:最佳距离为459.9894359431941米。
第75代:最佳距离为459.9894359431941米。
第76代:最佳距离为459.9894359431941米。
77代人群:最佳距离为459.9894359431941米。
78代:最佳距离值为459.9894359431941。
79代产品:最佳距离值为459.9894359431941。
80年代出生的一代人:最佳距离值为459.9894359431941。
81代产品:最佳距离为459.9894359431941米。
82代产品:最佳距离为459.9894359431941米。
第83代:最佳距离为459.9894359431941米。
第84代:最佳距离为459.9894359431941米。
85代产品:最佳距离值为459.9894359431941。
第86代:最佳距离为459.9894359431941米。
87代产品:最佳距离值为459.9894359431941。
第88代:最佳距离为459.9894359431941米。
89代:最佳距离为459.9894359431941米。
90后一代:最佳距离值为459.9894359431941。
91代:最佳距离为459.9894359431941米。
92代产品:最佳距离值为459.9894359431941。
第93代:最佳距离为459.9894359431941米。
第94代:最佳距离为459.9894359431941米。
95后一代:最佳距离值为459.9894359431941。
96代产品:最佳距离为459.9894359431941米。
97代产品:最佳距离值为459.9894359431941。
98代产品:最佳距离值为459.9894359431941。
Generation 99系列:最佳距离值为459.9894359431941。
最佳路径:8号、4号、0号、2号、5号、3号、1号、6号、7号、9号。

遗传算法原理与Python实现_遗传算法应用生活实例_遗传算法应用案例

结语

遗传算法具备广泛的通用性和出色的适应性,它在众多领域都得到了广泛的应用。通过本文的阐述,您对遗传算法的实际运用应当有了更为深刻的认识。为了更有效地掌握遗传算法,我们建议您在解决实际问题,如参与数据科学竞赛或执行工程项目时,尝试运用这一算法。

实践建议:

网友留言(0)

评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。