西安网站建设哪家公司好,网站备案幕布照片尺寸,企业营销策划书模板,常州建设工程信息网站Python优化算法—遗传算法一、前言二、安装三、遗传算法3.1 自定义函数3.2 遗传算法进行整数规划3.3 遗传算法用于旅行商问题3.4 使用遗传算法进行曲线拟合一、前言
优化算法#xff0c;尤其是启发式的仿生智能算法在最近很火#xff0c;它适用于解决管理学#xff0c;运筹…
Python优化算法—遗传算法一、前言二、安装三、遗传算法3.1 自定义函数3.2 遗传算法进行整数规划3.3 遗传算法用于旅行商问题3.4 使用遗传算法进行曲线拟合一、前言
优化算法尤其是启发式的仿生智能算法在最近很火它适用于解决管理学运筹学统计学里面的一些优化问题。比如线性规划整数规划动态规划非线性约束规划甚至是超参数搜索等等方向的问题。
但是一般的优化算法还是matlab里面用的多Python相关代码较少。
我在参考了一些文章的代码和模块之后决定学习scikit-opt这个模块。这个优化算法模块对新手很友好代码简洁上手简单。而且代码和官方文档是中国人写的还有很多案例学起来就没什么压力。
缺点是包装的算法种类目前还不算多只有七种差分进化算法、遗传算法、粒子群算法、模拟退火算法、蚁群算法、鱼群算法、免疫优化算法
本次带来的是数学建模里面经常使用的遗传算法的使用演示。
二、安装
首先安装模块在cmd里面或者anaconda prompt里面输入
pip install scikit-opt对于当前开发人员版本
git clone gitgithub.com:guofei9987/scikit-opt.git
cd scikit-opt
pip install .三、遗传算法
3.1 自定义函数
UDF用户定义函数现已推出
例如您刚刚制定了一种新型函数。现在你的函数是这样的 f0.5sin2(x12x22)−0.510.001(x12x22)f 0.5 \frac{sin^2(x_1^2 x_2^2) - 0.5}{1 0.001 (x_1^2 x_2^2)} f0.510.001(x12x22)sin2(x12x22)−0.5
该函数有大量的局部最小值具有很强的冲击力在(0,0) 处的全局最小值值为 0。
import numpy as np
def schaffer(p):x1, x2 px np.square(x1) np.square(x2)return 0.5 (np.square(np.sin(x)) - 0.5) / np.square(1 0.001 * x)导入和构建 ga 遗传算法
from sko.GA import GA
ga GA(funcschaffer, n_dim 2, size_pop 100, max_iter 800, prob_mut 0.001, lb [-1, -1], ub [1, 1], precision 1e-7)
best_x, best_y ga.run()
print(best_x:, best_x, \n, best_y:, best_y)运行结果为 可以看到基本找到了全局最小值和对应的x 。
画出迭代次数的图
import pandas as pd
import matplotlib.pyplot as plt
Y_history pd.DataFrame(ga.all_history_Y)
fig, ax plt.subplots(2, 1)
ax[0].plot(Y_history.index, Y_history.values, ., color red)
Y_history.min(axis 1).cummin().plot(kind line)
plt.show()GA算法的参数详解
输入参数
输入参数默认值参数的意义func-目标函数n_dim-目标函数的维度size_pop50种群规模max_iter200最大迭代次数prob_mut0.001变异概率lb-1每个自变量的最小值ub1每个自变量的最大值constraint_eq空元组等式约束constraint_ueq空元组不等式约束precision1e-7精确度int / float或者它们组成的列表
输出参数
GA GA_TSP
输出参数参数的意义ga.generation_best_X每一代的最优函数值对应的输入值ga.generation_best_Y每一代的最优函数值ga.all_history_FitV每一代的每个个体的适应度ga.all_history_Y每一代每个个体的函数值
3.2 遗传算法进行整数规划
在多维优化时想让哪个变量限制为整数就设定 precision 为 整数 即可。
例如我想让我的自定义函数的某些变量限制为整数浮点数分别是整数整数浮点数那么就设定 precision[1, 1, 1e-7]
例子如下
from sko.GA import GA
demo_func lambda x: (x[0] - 1) ** 2 (x[1] - 0.05) ** 2 x[2] ** 2
ga GA(func demo_func, n_dim 3, max_iter 500, lb [-1, -1, -1], ub [5, 1, 1], precision [1,1,1e-7])
best_x, best_y ga.run()
print(best_x:, best_x, \n, best_y:, best_y)可以看到第一个、第二个变量都是整数第三个就是浮点数了 。
3.3 遗传算法用于旅行商问题
商旅问题(TSP)就是路径规划的问题比如有很多城市你都要跑一遍那么先去哪个城市再去哪个城市可以让你的总路程最小。
实际问题需要一个城市坐标数据比如你的出发点位置为0,0第一个城市离位置为x1,y1x_1,y_1x1,y1,第二个为x2,y2x_2,y_2x2,y2…这里没有实际数据就直接随机生成了。
import numpy as np
from scipy import spatial
import matplotlib.pyplot as plt
num_points 50
points_coordinate np.random.rand(num_points, 2) # generate coordinate of points
points_coordinate这里定义的是50个城市每个城市的坐标都在是上图随机生成的矩阵。
然后我们把它变成类似相关系数里面的矩阵
distance_matrix spatial.distance.cdist(points_coordinate, points_coordinate, metriceuclidean)
distance_matrix.shape(50, 50)这个矩阵就能得出每个城市之间的距离算上自己和自己的距离0总共有2500个数。
定义问题
def cal_total_distance(routine):num_points, routine.shapereturn sum([distance_matrix[routine[i % num_points], routine[(i 1) % num_points]] for i in range(num_points)])求解问题
from sko.GA import GA_TSP
ga_tsp GA_TSP(func cal_total_distance, n_dim num_points, size_pop 50, max_iter 500, prob_mut 1)
best_points, best_distance ga_tsp.run()我们展示一下结果
best_distance画图查看计算出来的路径还有迭代次数和y的关系
fig, ax plt.subplots(1, 2,figsize (12, 8))
best_points_ np.concatenate([best_points, [best_points[0]]])
best_points_coordinate points_coordinate[best_points_, :]
ax[0].plot(best_points_coordinate[:, 0], best_points_coordinate[:, 1], o-r)
ax[1].plot(ga_tsp.generation_best_Y)
plt.show()3.4 使用遗传算法进行曲线拟合
构建数据集
import numpy as np
import matplotlib.pyplot as plt
from sko.GA import GA
x_true np.linspace(-1.2, 1.2, 30)
y_true x_true ** 3 - x_true 0.4 * np.random.rand(30)
plt.plot(x_true, y_true, o)构建的数据是yx3−x0.4yx^3-x0.4yx3−x0.4然后加上了随机扰动项。如图 定义需要拟合的函数三次函数然后将残差作为目标函数去求解
def f_fun(x, a, b, c, d):return a * x ** 3 b * x ** 2 c * x d #三次函数def obj_fun(p):a, b, c, d presiduals np.square(f_fun(x_true, a, b, c, d) - y_true).sum()return residuals求解
ga GA(func obj_fun, n_dim 4, size_pop 100, max_iter 500, lb [-2] * 4, ub [2] * 4)
best_params, residuals ga.run()
print(best_x:, best_params, \n, best_y:, residuals)可以看到拟合出来的方程为y0.9656x3−0.0065x2−1.0162x0.2162y0.9656x^{3}-0.0065x^{2}-1.0162x0.2162y0.9656x3−0.0065x2−1.0162x0.2162
画出拟合线:
y_predict f_fun(x_true, *best_params)
fig, ax plt.subplots()
ax.plot(x_true, y_true, o)
ax.plot(x_true, y_predict, -)
plt.show()