import matplotlib.pyplot as plt import math import random import numpy as np pop_size = 50 # 种群数量 PC=0.6 # 交叉概率 PM=0.1 #变异概率 X_max=10 #最大值 X_min=0 #最小值 DNA_SIZE=10 #DNA长度与保留位数有关,2**10 当前保留3位小数点 N_GENERATIONS=100 """ 求解的目标表达式为: y = 10 * math.sin(5 * x) + 7 * math.cos(4 * x) x=[0,5] """ def aim(x):return 10*x#np.sin(5*x)+7*np.cos(4*x) def f1(pop): return pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) *(X_max-X_min)/ float(2**DNA_SIZE-1) +X_min def f2(pred): return pred + 1e-3 - np.min(pred) def f3(pop, fitness): idx = np.random.choice(np.arange(pop_size), size=pop_size, replace=True,p=fitness/fitness.sum()) return pop[idx] def f4(parent, pop): if np.random.rand() < PC: i_ = np.random.randint(0, pop_size, size=1) cross_points = np.random.randint(0, 2, size=DNA_SIZE).astype(np.bool) parent[cross_points] = pop[i_, cross_points] return parent def f5(child,pm): for point in range(DNA_SIZE): if np.random.rand() < pm: child[point] = 1 if child[point] == 0 else 0 return child pop = np.random.randint(2, size=(pop_size, DNA_SIZE)) for i in range(N_GENERATIONS): #解码 X_value= ? #获取目标函数值 F_values = ? #获取适应值 fitness = ? if(i==0): max=np.max(F_values) max_DNA = pop[np.argmax(F_values), :] if(max<np.max(F_values)): max=np.max(F_values) max_DNA=pop[np.argmax(F_values), :] if (i % 10 == 0): print("Most fitted value and X: \n", np.max(F_values), decode(pop[np.argmax(F_values), :])) #选择 pop = ? pop_copy = pop.copy() #交叉 变异 for parent in pop: child = ? child = ? parent[:] = child print("目标函数最大值为:",max) print("其DNA值为:",max_DNA) print("其X值为:",decode(max_DNA))
时间: 2024-02-03 15:03:04 浏览: 132
import numpy as np import matplotlib.pyplot as plt import math
根据上下文推测,需要补全的是代码中的几个函数和变量的值,具体如下:
1. 解码函数 `decode()`,可以根据DNA序列计算出对应的x值。假设DNA序列中的每一位代表x值的二进制小数点后一位,那么可以使用如下代码实现:
```python
def decode(pop):
return f1(pop).round(3)
```
2. 目标函数值 `F_values`,可以使用 `aim()` 函数计算,即:
```python
F_values = aim(X_value)
```
3. 适应值 `fitness`,可以根据目标函数值计算,这里使用了 `f2()` 函数对目标函数值进行处理,代码如下:
```python
fitness = f2(F_values)
```
4. 选择函数 `f3()`,可以使用轮盘赌选择算法来实现,代码如下:
```python
pop = f3(pop_copy, fitness)
```
5. 交叉和变异函数 `f4()` 和 `f5()`,可以使用单点交叉和单点变异算法来实现,代码如下:
```python
for parent in pop:
child = parent.copy()
child = f4(child, pop)
child = f5(child, PM)
parent[:] = child
```
阅读全文