我们使用scikit-opt工具箱来实现遗传算法:https://github.com/guofei9987/scikit-opt
下载后,我们只需要其中的ga.py文件
首先,定义一个目标函数
def demo_func2(p):
x, y, z = p
return -(x ** 2 + y ** 2 + z ** 2)
我们想用遗传算法找出目标函数的最大值,这样做:
func是你的目标函数
lb是每个变量搜索的最小界
ub是每个变量搜索区域的最大界
general_best,func_general_best,FitV_history=ga.ga(func=demo_func2, lb=[-1, -10, -5], ub=[2, 10, 2])
print('best_x:',general_best)
print('best_y:',func_general_best)
ga.plot_FitV(FitV_history)
TSP问题(Travelling Salesman Problem, 旅行商问题)
定义你的目标函数
先读入城市坐标和城市间距离(这里用随机方法生成,以作为demo)
import numpy as np
num_points = 8
points = range(num_points)
points_coordinate = np.random.rand(num_points, 2)
distance_matrix = np.zeros(shape=(num_points, num_points))
for i in range(num_points):
for j in range(num_points):
distance_matrix[i][j] = np.linalg.norm(points_coordinate[i] - points_coordinate[j], ord=2)
print('distance_matrix is: \n', distance_matrix)
def cal_total_distance(points):
num_points, = points.shape
total_distance = 0
for i in range(num_points - 1):
total_distance += distance_matrix[points[i], points[i + 1]]
total_distance += distance_matrix[points[i + 1], points[0]]
return total_distance
使用遗传算法
from GA import GA_TSP
ga_tsp = GA_TSP(func=cal_total_distance, points=points, pop=50, max_iter=200, Pm=0.001)
best_points, best_distance = ga_tsp.fit()
画出结果
fig, ax = plt.subplots(1, 1)
best_points_ = np.concatenate([best_points, [best_points[0]]])
best_points_coordinate = points_coordinate[best_points_, :]
ax.plot(best_points_coordinate[:, 0], best_points_coordinate[:, 1],'o-r')
plt.show()