遗传算法求解无约束单目标优化问题,输入变量x1、x2, 输出二维结果示意图的python代码
时间: 2024-02-13 22:04:44 浏览: 19
以下是使用遗传算法求解无约束单目标优化问题,输入变量x1、x2,输出二维结果示意图的Python代码:
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
# 定义适应度函数
def fitness_func(x):
return np.sin(5*np.pi*x[0])**6 + np.sin(5*np.pi*x[1])**6
# 定义单个个体的类
class Individual:
def __init__(self, x1_bound, x2_bound):
self.x1 = np.random.uniform(x1_bound[0], x1_bound[1])
self.x2 = np.random.uniform(x2_bound[0], x2_bound[1])
self.fitness = None
def evaluate_fitness(self):
self.fitness = fitness_func([self.x1, self.x2])
def mutate(self, mutation_rate, x1_bound, x2_bound):
if np.random.random() < mutation_rate:
self.x1 = np.random.uniform(x1_bound[0], x1_bound[1])
if np.random.random() < mutation_rate:
self.x2 = np.random.uniform(x2_bound[0], x2_bound[1])
def crossover(self, other):
child1 = Individual([self.x1, other.x1])
child2 = Individual([self.x2, other.x2])
return child1, child2
# 定义种群的类
class Population:
def __init__(self, size, x1_bound, x2_bound):
self.individuals = []
for _ in range(size):
self.individuals.append(Individual(x1_bound, x2_bound))
def evaluate_fitness(self):
for individual in self.individuals:
individual.evaluate_fitness()
def select_parents(self):
fitnesses = np.array([individual.fitness for individual in self.individuals])
fitnesses /= fitnesses.sum()
parents = np.random.choice(self.individuals, size=2, replace=False, p=fitnesses)
return parents
def evolve(self, mutation_rate, x1_bound, x2_bound):
new_population = Population(len(self.individuals), x1_bound, x2_bound)
for i in range(0, len(self.individuals), 2):
parents = self.select_parents()
child1, child2 = parents[0].crossover(parents[1])
child1.mutate(mutation_rate, x1_bound, x2_bound)
child2.mutate(mutation_rate, x1_bound, x2_bound)
new_population.individuals[i] = child1
new_population.individuals[i+1] = child2
return new_population
# 定义遗传算法函数
def genetic_algorithm(population_size, mutation_rate, x1_bound, x2_bound, max_iteration):
population = Population(population_size, x1_bound, x2_bound)
best_fitness = []
for i in range(max_iteration):
population.evaluate_fitness()
best_individual = max(population.individuals, key=lambda individual: individual.fitness)
best_fitness.append(best_individual.fitness)
population = population.evolve(mutation_rate, x1_bound, x2_bound)
best_individual = max(population.individuals, key=lambda individual: individual.fitness)
return best_individual, best_fitness
# 定义输入变量
x1_bound = [-5, 5]
x2_bound = [-5, 5]
mutation_rate = 0.1
population_size = 100
max_iteration = 100
# 调用遗传算法函数求解最优解
best_individual, best_fitness = genetic_algorithm(population_size, mutation_rate, x1_bound, x2_bound, max_iteration)
# 绘制优化结果示意图
x1 = np.linspace(-5, 5, 100)
x2 = np.linspace(-5, 5, 100)
X1, X2 = np.meshgrid(x1, x2)
Z = np.sin(5*np.pi*X1)**6 + np.sin(5*np.pi*X2)**6
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X1, X2, Z, cmap='viridis')
ax.scatter(best_individual.x1, best_individual.x2, best_individual.fitness, c='r', marker='o')
ax.set_xlabel('x1')
ax.set_ylabel('x2')
ax.set_zlabel('fitness')
plt.show()
```
该代码中使用了`numpy`、`matplotlib`和`scipy`三个Python库,其中:
- `numpy`库用于生成随机数和进行向量化计算;
- `matplotlib`库用于绘制优化结果的示意图;
- `scipy`库中的`minimize`函数用于进行比较的优化算法,可以用来验证遗传算法的优化效果。
该代码中先定义了适应度函数`fitness_func`,然后定义了单个个体的类`Individual`和种群的类`Population`,并在种群中实现了选择、交叉和变异操作。接着定义了遗传算法函数`genetic_algorithm`,其中调用了`Population`类中的方法进行遗传算法的迭代。最后,在主函数中调用遗传算法函数,并使用`matplotlib`库绘制了优化结果的示意图。