遗传算法求解无约束单目标优化问题变量x1、x2的python代码
时间: 2023-09-09 11:14:32 浏览: 187
以下是一个遗传算法求解无约束单目标优化问题(包含两个变量x1和x2)的Python代码示例:
```python
import random
# 定义目标函数
def fitness(x1, x2):
return (x1 - 2)**2 + (x2 + 3)**2
# 遗传算法参数设置
pop_size = 50 # 种群大小
num_generations = 100 # 迭代次数
mutation_rate = 0.1 # 变异率
crossover_rate = 0.8 # 交叉率
# 生成初始种群
population = []
for i in range(pop_size):
x1 = random.uniform(-10, 10)
x2 = random.uniform(-10, 10)
population.append((x1, x2))
# 遗传算法主循环
for generation in range(num_generations):
# 计算适应度并排序
fitness_scores = [(fitness(x1, x2), x1, x2) for (x1, x2) in population]
fitness_scores.sort(reverse=True)
# 输出当前最优解
print("Generation {}: Best fitness = {:.4f}, Best solution = ({:.4f}, {:.4f})".format(generation, fitness_scores[0][0], fitness_scores[0][1], fitness_scores[0][2]))
# 选择
elite_size = int(pop_size * 0.2) # 精英数量
parents = [(x1, x2) for (_, x1, x2) in fitness_scores[:elite_size]] # 选择精英父母
for i in range(pop_size - elite_size):
parent1 = random.choice(parents)
parent2 = random.choice(parents)
# 交叉
if random.random() < crossover_rate:
x1_child = (parent1[0] + parent2[0]) / 2
x2_child = (parent1[1] + parent2[1]) / 2
else:
x1_child = parent1[0]
x2_child = parent1[1]
# 变异
if random.random() < mutation_rate:
x1_child += random.gauss(0, 1)
x2_child += random.gauss(0, 1)
population[i + elite_size] = (x1_child, x2_child)
# 输出最终结果
fitness_scores = [(fitness(x1, x2), x1, x2) for (x1, x2) in population]
fitness_scores.sort(reverse=True)
print("Final solution: ({:.4f}, {:.4f}), fitness = {:.4f}".format(fitness_scores[0][1], fitness_scores[0][2], fitness_scores[0][0]))
```
在这个代码中,我们首先定义了目标函数 `fitness(x1, x2)`,然后设置了遗传算法的参数,包括种群大小、迭代次数、变异率和交叉率。接着我们生成了初始种群,然后开始遗传算法的主循环。在每一次迭代中,我们计算了种群中每个个体的适应度,并对它们进行排序,然后输出当前最优解。接着进行选择、交叉和变异操作,生成下一代种群,直到迭代次数达到设定值为止。最后输出最终的最优解。
需要注意的是,由于这个问题包含两个变量,因此在代码中需要相应地进行修改,包括生成初始种群、计算适应度、选择、交叉和变异操作等。
阅读全文