智能优化算法——python实现免疫遗传算法的图像拟合

本文介绍了如何使用Python实现免疫遗传算法进行图像拟合,详细阐述了算法思路、流程图、主要步骤(初始化、获取抗体相似度、克隆与变异、抗体更新等)以及训练过程评估。通过对比遗传算法,展示了免疫遗传算法在保持抗体多样性和提高拟合效率方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

算法思路

免疫算法是仿照生物体中的免疫应答来进行寻优的算法。我们待拟合的问题可以看作抗原,可能的解集抗原看作抗体。当有抗原入侵到生物体中时,免疫系统进行免疫应答。在免疫应答的初期会产生大量的抗体进行应答,随后会对与抗原亲和度高的抗体进行复制保留,对于浓度高的抗体进行复制抑制来保证抗体的多样性。在此过程中同时也会产生新的抗体加入到原本的抗体集中。为了更加直观的介绍免疫遗传算法,我们仍然以图片为例进行免疫遗传算法的实现与拟合。

流程图

在这里插入图片描述

算法主体

预备知识与智能优化算法——python实现使用遗传算法进行图片拟合相同,在此不再赘述,我们现在直接开始算法主体的实现。同样为了方便理解,将代码分割成若干部分介绍,完整代码可以在文末下载。

初始化

初始化与遗传算法的实现相同

def __init__(self, imgPath, saveName="temp", alpha=5, beta=0.5, maxgroup=200, features=100, epochs=1000):
	self.orignal_img, self.type, self.row, self.col = self.OpenImg(imgPath)
    self.max_group = maxgroup
    self.saveName = saveName
    self.groups = []
    self.features = features
    self.epochs = epochs
    self.group_dict = dict()
    self.alpha = alpha
    self.beta = beta
    if not os.path.exists(saveName):
       	os.mkdir(saveName)
    print("初始化...")
    for i in range(randint(self.max_group, self.max_group * 2)):
       	g = []
        for j in range(self.features):
       		tmp = [[choice(np.linspace(0, self.row, features)), choice(np.linspace(0, self.col, features))] for x in range(3)]
            tmp.append("#" + ''.join(choice('0123456789ABCDEF') for x in range(6)))

            g.append(tmp.copy())

        self.groups.append(g.copy())

    self.maxg = self.groups[0]
    print("初始化完成!")

获取抗体与抗体的相似度

我们使用structural_similarity函数来比较两个抗体的相似度

def get_antibody_similar(self, g1, g2):
    ssim = structural_similarity(np.array(g1), np.array(g2), multichannel=True)
    return ssim

克隆与变异

此过程与遗传算法同过程相同

注:在遗传算法中生物繁殖的后代不会与父辈和母辈完全相同,但是在抗体是可以做到完全一致的。所以在breeds函数在遗传算法中代表的是繁殖过程,而在免疫遗传算法的抗体的克隆和变异中,函数breeds代表的是抗体的变异。按照流程来讲免疫算法还应该具有克隆抗体的过程,而这里我们只需保留原有的抗体即可以看作是克隆过程已完成。为了方便对照,所以我们保留了原有的函数名。

def exchange(self, father, mother)->[]:
    # 交换
    # 随机生成互换个数
    min_locate = min(len(father), len(mother))
    n = randint(0, int(randint(25, 100) / 100 * min_locate))
    # 随机选出多个位置
    selected = sample(range(0, min_locate), n)
    # 交换内部
    for s in selected:
        father[s], mother[s] = mother[s], father[s]

    # 交换尾部
    locat = randint(0, min_locate)
    fhead = father[:locat].copy()
    mhead = mother[:locat].copy()

    ftail = father[locat:].copy()
    mtail = mother[locat:].copy()

    # print(fhead, ftail, mhead, mtail)
    fhead.extend(mtail)
    father = fhead
    mhead.extend(ftail)
    mother = mhead
    return [father, mother]

def mutation(self, gen):
    # 突变
    # 随机生成变异个数
    n = int(randint(1, 100) / 1000 * len(gen))

    selected = sample(range(0, len(gen)), n)

    for s in s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

艾醒(AiXing-w)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值