使用遗传算法求解非线性优化问题

科技   2024-09-09 20:02   德国  

我们在平时遇到的业务问题,很多目标函数、约束函数都是非线性的。本文介绍使用一个遗传算法包来解决这些复杂的模型求极值的问题。

导入包


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




































运筹OR帷幄
致力于成为全球最大的运筹学中文线上社区
 最新文章