65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 中的人工免疫算法

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (12投票s)

2008年7月6日

CPOL

6分钟阅读

viewsIcon

116292

downloadIcon

2367

如何开发 C# 免疫算法

引言

人工免疫算法受生物免疫系统的原理和过程启发。本文介绍了如何开发一个简单的 C# 免疫算法,该算法模拟了克隆选择、亲和力成熟和抗体相互作用。

背景

我们的免疫系统保护我们免受包括细菌、病毒和毒素在内的病原体的侵害。它提供多层防御,皮肤是抵抗感染的第一道屏障。一旦病原体进入体内,它们就会被先天免疫系统处理,然后由适应性免疫应答系统处理(参见图 1)。先天免疫系统提供始终存在的保护。它使用游走的吞噬细胞(巨噬细胞)来吞噬异常细胞,从而清除系统。

图 1. 免疫系统的防御层级。

适应性免疫系统提供通过免疫应答产生的保护。能够引发特异性免疫应答的物质称为抗原。几乎所有病原体都是抗原。抗体由免疫系统用于识别和中和抗原(外来物),并通过一种称为 B 细胞的白细胞产生。

克隆选择模型化了与特异性抗原结合的抗体的产生。受体结合过程通常被比作钥匙锁机制。形成结合的概率(即匹配强度)被称为亲和力。克隆选择确立了这样一个理念:只有识别抗原的抗体才会被选择进行克隆和突变。克隆抗体的突变比例与其与抗原的匹配程度成反比,因此更匹配的抗原突变较少,匹配度低的抗体突变较多。这个过程称为亲和力成熟,并提高了抗体形成结合的可能性。免疫模型还必须考虑抗体之间相互作用产生的活性。

通过免疫算法进行优化

从计算机科学的角度来看,模拟适应性免疫系统的行为可以为解决问题提供新的途径。函数优化问题涉及在约束条件下找到函数的最佳解(峰值或谷值)。

在示例代码中,使用了一个测试函数,并绘制在图 2 中。该测试函数使用正弦函数产生起伏的图,因此找到最高峰是一个挑战。其方程为:

Fitness = (15*x*y*(1-x)*(1-y)*sin(9*pi*x)*sin(9*pi*y))2

这是 Barry Lapthorn 在他题为“一个简单的 C# 遗传算法”的文章中使用的函数,该文章位于 CodeProject 网站上。该问题的最优解为 0.879,在 x=0.5 和 y=0.5 处,这是图中心最高的峰值。巧合的是,该图是使用 SciLab 绘制的,这是一个免费的数值计算软件包。

如何使用克隆选择模型来解决这个优化问题?嗯,如果我们把一个抗体看作一个潜在的解决方案(即一个具有 x-y 值的细胞对象),把适应度函数看作抗原,那么匹配或结合的程度就代表了解决方案的质量。如果我们从抗体解决方案的初始种群开始,并用它们测试适应度函数(抗原),那么具有最高亲和力(即最佳匹配)的抗体将被允许克隆和突变,以期找到更好的解决方案。

图 2. 测试函数(最高峰解决方案位于 x=0.5 和 y=0.5 处)。

因此,可以设计一个免疫算法如下:

  1. 生成抗体的初始种群。
  2. 执行克隆选择以生成高亲和力克隆并进行突变。
  3. 移除与抗原亲和力低于预定阈值的抗体。
  4. 计算系统中所有抗体之间的亲和力相互作用。
  5. 移除与其他抗体亲和力低于预定阈值的抗体。
  6. 将随机生成的抗体引入种群(多样性)。
  7. 重复步骤 2 至 6,直到满足停止条件。

算法

代码包含四个基本类。它们是:

  • 主窗体类,提供一个简单的 GUI
  • 免疫算法控制器类
  • 抗体类
  • 适应度函数类

代码已添加注释,因此应该很容易理解。我使用了 AISWeb(参见下方的链接)中找到的代码片段来开发克隆选择算子。Paul Andrews 贡献的代码示例尤其有用。

适应度函数类有一个名为 evaluateFunction()static 方法,该方法返回给定 x 和 y 输入值的适应度值。抗体类试图模拟生物抗体细胞。它包含用于自我克隆、查找与其他抗体亲和力以及进行基于亲和力的突变的方法。每个抗体代表一个候选解决方案,在本例中,它只是一个 x-y 值。免疫算法控制器类允许定义参数,并有一个名为 GoOptimise() 的方法,该方法创建抗体的初始种群并迭代求解,直到达到停止条件(最大代数)。

Using the Code

免疫算法生成的抗体(函数优化问题的候选解决方案)显示在一个文本框中。最佳抗体首先显示,并且应该很好地匹配该问题的要求解,如上所述,该解在 x=0.5 和 y=0.5 处的值为 0.879。免疫算法是一种非确定性算法,这意味着它在不同运行中会产生不同的结果。

参数设置有很多实验空间,目前在免疫算法控制器类中设置如下。有必要为从种群池中移除(抑制)抗体设置阈值(clonalSelectionThresholdremoveThreshold)。这些阈值的设置是通过反复试验得出的。名为 antibodyNumber 的参数决定了用于解决问题或在生物学意义上中和抗原的初始抗体数量。此参数已设置为 50。cloneNumber 参数设置了克隆选择期间生成的克隆数。基于亲和力的突变使用 mutationFactor 参数设置。x 和 y 值的约束通过 lowerBoundaryupperBoundary 参数施加。

  • antibodyNumber = 50;
  • cloneNumber = 20;
  • maxGens = 600;
  • mutationFactor = 80;
  • removeThreshold = 0.2;
  • clonalSelectionThreshold = 0.01;
  • diversity = 0.5;
  • lowerBoundary = 0.0;
  • upperBoundary = 1.0;

关注点

代码使用 SharpDevelop2.2 编写,但也可以使用 Microsoft Visual Studio Express 进行编译。在对象克隆方面遇到了一些初始编码困难,并且在使用源自 System.DateTime.Now.Ticks 的随机种子时遇到了编译错误。通过使用 ICloneable 接口解决了对象克隆问题,该接口要求编写一个 Clone() 方法。

摘要

网上有很多文章提供了比本文介绍更详细的人工免疫算法信息。下方提供了一些链接,但通过谷歌搜索“artificial immune system”(人工免疫系统)将能找到更多。本文说明了免疫算法的一些主要概念,包括克隆选择、亲和力成熟和抗体相互作用。

还有进一步研究的潜力。研究区分将被删除的抗体和未被删除的抗体,以及新型的克隆和突变算子,会很有趣。如果您想进一步探索免疫算法,我建议您的下一步是访问 AISWeb,请使用下面的链接。

链接

历史

  • 2008 年 7 月 - 首次发布
© . All rights reserved.