我们在平时遇到的业务问题,很多目标函数、约束函数都是非线性的。本文介绍使用一个遗传算法包来解决这些复杂的模型求极值的问题。
导入包
import numpy as np
from geneticalgorithm import geneticalgorithm as ga
业务问题转化成数学模型
假设我们的个业务问题转化成数学模型如下:
def f(x):
pen = 0
if not -x[0] +2*x[0]*x[1] <= 8:
pen = np.inf
if not 2*x[0] + x[1] <= 14:
pen = np.inf
if not 2*x[0] - x[1] <= 10:
pen = np.inf
return -(x[0]+x[1]*x[0]) + pen
varbounds = np.array([[0,10],[0,10]])
vartype = np.array([['int'],['real']])
设置遗传算法的参数
algorithm_param = {'max_num_iteration': 300,\
'population_size':100,\
'mutation_probability':0.1,\
'elit_ratio': 0.01,\
'crossover_probability': 0.5,\
'parents_portion': 0.3,\
'crossover_type':'uniform',\
'max_iteration_without_improv':None}
@ max_num_iteration:算法最大迭代次数。
@ population_size:种群数量。
@ mutation_probability:确定每个单独溶液中每个基因的几率,替换为随机值。默认值为 0.1(即 10%)。
@elit_ration:确定人口中的精英人数。默认值为 0.01(即 1%)。例如,当人口规模为 100 且 elit_ratio 为 0.01 那么人口中就有一个精英。如果此参数设置为零,则 geneticalgorithm 实现了标准的遗传算法,而不是精英主义的 GA。
@ crossover_probability:交叉系数。
@ parents_portion:由上一代成员(又名父母)填补的人口比例; 默认值为 0.3(即人口的 30%)
@crossover_type:交叉变异方式。有三个选项,包括one_point;two_point和均匀的交叉功能; 默认值为 Uniform Crossover
@ max_iteration_without_improv:如果算法没有改进目标,在此参数确定的连续迭代次数上,则 GeneticAlgorithm 在达到max_num_iterations之前停下来并报告找到的最佳解决方案。默认为 None。
具体参数含义,可参考我前文介绍的遗传算法源码建模步骤,在本文不详细介绍。
模型求解
model = ga(function=f,\
dimension =2, \
variable_type_mixed=vartype, \
variable_boundaries=varbounds,\
algorithm_parameters=algorithm_param)
model.run()
在约束函数、目标函数在极其复杂的情形下,使用本文采用的方法会有不错的效果,可以省去复杂建模的麻烦。
完整代码
import numpy as np
from geneticalgorithm import geneticalgorithm as ga
def f(x):
pen = 0
if not -x[0] +2*x[0]*x[1] <= 8:
pen = np.inf
if not 2*x[0] + x[1] <= 14:
pen = np.inf
if not 2*x[0] - x[1] <= 10:
pen = np.inf
return -(x[0]+x[1]*x[0]) + pen
varbounds = np.array([[0,10],[0,10]])
vartype = np.array([['int'],['real']])
algorithm_param = {'max_num_iteration': 300,\
'population_size':100,\
'mutation_probability':0.1,\
'elit_ratio': 0.01,\
'crossover_probability': 0.5,\
'parents_portion': 0.3,\
'crossover_type':'uniform',\
'max_iteration_without_improv':None}
model = ga(function=f,\
dimension =2, \
variable_type_mixed=vartype, \
variable_boundaries=varbounds,\
algorithm_parameters=algorithm_param)
model.run()
微信公众号后台回复
加群:加入全球华人OR|AI|DS社区硕博微信学术群
资料:免费获得大量运筹学相关学习资料
人才库:加入运筹精英人才库,获得独家职位推荐
电子书:免费获取平台小编独家创作的优化理论、运筹实践和数据科学电子书,持续更新中ing...
加入我们:加入「运筹OR帷幄」,参与内容创作平台运营
知识星球:加入「运筹OR帷幄」数据算法社区,免费参与每周「领读计划」、「行业inTalk」、「OR会客厅」等直播活动,与数百位签约大V进行在线交流
文章须知
文章作者:用户007
微信编辑:疑疑
文章转载自『Python学习杂记』公众号,原文链接:使用遗传算法求解非线性优化问题
关注我们
FOLLOW US