非线性规划中的遗传算法基础题
题目描述
考虑一个简单的非线性约束优化问题:
最小化 \(f(x) = (x_1 - 2)^2 + (x_2 - 1)^2\)
满足约束:
\(g_1(x) = x_1 + x_2 - 2 \leq 0\)
\(g_2(x) = x_1^2 - x_2 \leq 0\)
其中 \(x = (x_1, x_2)\) 是二维决策变量。
解题过程循序渐进讲解
遗传算法是一种模拟自然进化过程的元启发式优化算法。它不依赖于梯度信息,适用于处理复杂、非凸、不可微的优化问题。其核心流程包括编码、初始化、选择、交叉、变异和适应度评估。
第一步:编码与初始化
-
编码:将连续变量 \(x_1\) 和 \(x_2\) 编码为二进制字符串(染色体)。假设每个变量的定义域为 \([-5, 5]\),我们使用10位二进制数表示一个变量,精度为 \((5-(-5)) / (2^{10}-1) \approx 0.01\)。一个染色体(个体)由20位二进制数组成,前10位代表 \(x_1\),后10位代表 \(x_2\)。
- 例如,二进制串
0000000000 0000000000解码为 \(x_1 = -5, x_2 = -5\)。 - 解码公式:\(x = lower + \frac{(upper - lower)}{(2^L - 1)} \times decimal\_value\),其中 \(L\) 是二进制串长度(10),\(decimal\_value\) 是二进制串对应的十进制整数。
- 例如,二进制串
-
初始化种群:随机生成 \(N\) 个这样的20位二进制字符串,构成初始种群。设种群大小 \(N = 50\)。
第二步:适应度函数设计
遗传算法通常求解最大化问题。由于原问题是最小化 \(f(x)\),我们需要将其转换为适应度函数 \(Fitness(x)\)。同时,必须处理约束条件。这里采用罚函数法将约束问题转化为无约束问题。
- 定义罚函数:\(Penalty(x) = \alpha \times [max(0, g_1(x))^2 + max(0, g_2(x))^2]\),其中 \(\alpha\) 是罚因子(设 \(\alpha = 100\)),这是一个较大的正数,用于惩罚违反约束的个体。
- 定义适应度函数:\(Fitness(x) = -[f(x) + Penalty(x)]\)。
- 对于可行解(满足所有约束),\(Penalty(x) = 0\),\(Fitness(x) = -f(x)\)。因为 \(f(x) \geq 0\),所以 \(-f(x) \leq 0\)。我们的目标是使适应度越大越好,即 \(-f(x)\) 越大越好,这等价于 \(f(x)\) 越小越好。
- 对于不可行解,\(Penalty(x) > 0\),会显著降低其适应度,使其在进化中被淘汰的概率增大。
第三步:选择操作
选择操作的目的是从当前种群中选出适应性强的个体,作为父代进行繁殖。这里采用轮盘赌选择法。
- 计算每个个体 \(i\) 的适应度 \(F_i\)。
- 计算每个个体被选中的概率:\(p_i = \frac{F_i - F_{min}}{\sum_{j=1}^{N}(F_j - F_{min})}\)。这里减去种群最小适应度 \(F_{min}\) 是为了避免负的适应度值影响概率计算。如果所有适应度都为非负,可直接用 \(p_i = F_i / \sum F_j\)。
- 计算累积概率 \(q_i = \sum_{j=1}^{i} p_j\)。
- 生成一个在 \([0, 1]\) 均匀分布的随机数 \(r\)。
- 选择第一个满足 \(q_i \geq r\) 的个体。
- 重复步骤4和5共 \(N\) 次,选出 \(N\) 个父代个体(允许重复选择,即适应度高的个体可能被选中多次)。
第四步:交叉操作
交叉操作模拟生物杂交,是产生新个体的主要方法。这里采用单点交叉。
- 将上一步选出的 \(N\) 个父代个体随机两两配对。
- 对每一对父代染色体,以预设的交叉概率 \(p_c\)(设 \(p_c = 0.8\))决定是否进行交叉。
- 如果进行交叉,随机选择一个交叉点(1到19之间的整数)。将两条染色体在交叉点处切断,并交换交叉点之后的部分,生成两条新的子代染色体。
- 例如,父代1:
0101 | 1010,父代2:1100 | 0101,交叉点在4。子代1:0101 0101,子代2:1100 1010。
- 例如,父代1:
- 如果不进行交叉,则子代直接复制父代。
第五步:变异操作
变异操作以很小的概率改变基因,引入种群多样性,有助于跳出局部最优。这里采用基本位变异。
- 对上一步得到的所有子代染色体,遍历其上的每一个二进制位(基因)。
- 对每一个基因,以预设的变异概率 \(p_m\)(设 \(p_m = 0.01\))决定是否变异。
- 如果发生变异,则将该基因位取反(0变1,或1变0)。
第六步:新一代种群与终止条件
- 经过选择、交叉、变异后,得到的新个体集合构成新一代种群。
- 终止条件判断:重复步骤二到五,构成一次迭代(一代)。常见的终止条件包括:
- 达到最大迭代次数(例如,500代)。
- 连续多代最优个体的适应度不再显著提高。
- 找到了满足精度要求的解。
- 当满足终止条件时,算法停止。将历代种群中适应度最高的个体解码,得到的最优解 \(x^*\) 即为算法的近似解。
算法总结
遗传算法通过模拟“初始化种群 -> 评估适应度 -> 选择 -> 交叉 -> 变异”的循环过程,使种群朝着适应度更高的方向进化。对于本例,通过多次迭代,算法有望找到一个位于可行域内且使目标函数 \(f(x)\) 接近最小的点。理论最优解可通过其他方法验证,大约在 \(x^* \approx (1.0, 1.0)\) 附近,此时 \(f(x^*) \approx 1.0\)。遗传算法的优势在于其全局搜索能力,但参数(如种群大小、交叉率、变异率)的选择对性能影响较大,且收敛速度可能较慢。