【遗传算法】新版geatpy解决0-1规划问题

问题描述来源于:https://www.cnblogs.com/zhonghouyue/p/10581337.html

在遗传算法中,作者用到了geatpy,但是版本太老,现在不能直接用。希望对学习者能有所帮助。

本人在新版本下修改代码如下:

class MyProblem(ea.Problem): # 继承Problem父类
    def __init__(self):
        name = '0-1 Pro' # 初始化name(函数名称, 可以随意设置)
        M = 1 # 初始化M(目标维数)
        maxormins = [-1] # 初始化目标最小最大化标记列表, 1: min; -1: max
        Dim = 7 # 初始化Dim(决策变量维数)
        varTypes = [1] * Dim # 初始化决策变量类型, 0: 连续; 1: 离散
        lb = [0]*Dim # 决策变量下界
        ub = [1]*Dim # 决策变量上界
        lbin = [1]*Dim # 决策变量下边界
        ubin = [1]*Dim # 决策变量上边界
        # 调用父类构造方法完成实例化
        ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin)

    def aimFunc(self, pop): # 目标函数, pop为传入的种群对象
        Vars = pop.Phen # 得到决策变量矩阵
        x1 = Vars[:, [0]] # 取出第一列得到所有个体的x1组成的列向量
        x2 = Vars[:, [1]]
        x3 = Vars[:, [2]]
        x4 = Vars[:, [3]]
        x5 = Vars[:, [4]]
        x6 = Vars[:, [5]]
        x7 = Vars[:, [6]]
        f = 11*x1+9*x2+29*x3+9*x4+21*x5+31*x6+22*x7

        # 约束条件
        idx1 = np.where(10*x1+8*x2+20*x3+5*x4+13*x5+22*x6+10*x7 > 60)[0]
        idx2 = np.where(x1 + x2+ x3 > 2)[0]
        idx3 = np.where(-x4 -x5 > -1)[0]
        idx4 = np.where(-x6 -x7 > -1)[0]
        # 采用惩罚方法1
        f[idx1] = -1
        f[idx2] = -1
        f[idx3] = -1
        f[idx4] = -1
        # 计算目标函数值, 赋值给pop种群对象的ObjV属性
        pop.ObjV = f
"""===============================实例化问题对象==========================="""
problem = MyProblem() # 生成问题对象
"""=================================种群设置==============================="""
Encoding = 'BG'       # 编码方式
NIND = 50             # 种群规模
Field = ea.crtfld(Encoding, problem.varTypes, problem.ranges, problem.borders) # 创建区域描述器
population = ea.Population(Encoding, Field, NIND) # 实例化种群对象(此时种群还没被初始化,仅仅是完成种群对象的实例化)
"""===============================算法参数设置============================="""
myAlgorithm = ea.soea_SEGA_templet(problem, population) # 实例化一个算法模板对象
myAlgorithm.MAXGEN = 25 # 最大进化代数
"""==========================调用算法模板进行种群进化======================="""
[population, obj_trace, var_trace] = myAlgorithm.run() # 执行算法模板
population.save() # 把最后一代种群的信息保存到文件中
# 输出结果
best_gen = np.argmin(problem.maxormins * obj_trace[:, 1]) # 记录最优种群个体是在哪一代
best_ObjV = obj_trace[best_gen, 1]
print('最优的目标函数值为:%s'%(best_ObjV))
print('最优的控制变量值为:')
for i in range(var_trace.shape[1]):
    print(var_trace[best_gen, i])
print('有效进化代数:%s'%(obj_trace.shape[0]))
print('最优的一代是第 %s 代'%(best_gen + 1))
print('评价次数:%s'%(myAlgorithm.evalsNum))
print('时间已过 %s 秒'%(myAlgorithm.passTime))

【遗传算法】新版geatpy解决0-1规划问题_第1张图片

种群信息导出完毕。
最优的目标函数值为:94.0
最优的控制变量值为:
1.0
0.0
0.0
1.0
1.0
1.0
1.0
有效进化代数:25
最优的一代是第 3 代
评价次数:1250
时间已过 0.01997208595275879 秒

你可能感兴趣的:(数学建模)