0
点赞
收藏
分享

微信扫一扫

遗传算法Geatpy

哈哈镜6567 2022-02-12 阅读 55
import numpy as np
import geatpy as ea
import random

data=[100,50,50,150,150,20,20,20,15,15,25,25,20,80,50,50,200,50,150,40,150,20,40,20,100,40,40,100,50,50]
drop=[79879.56,308.4,1622.16,25522.99,25437.74,15.11,192.49,949.76,233.68,289.97,213.47,1064.9,425.72,8383.93,8845.67,1093.5,345.32,115.44,
      5244.92,126937.86,412.26,71185.43,13.25,232.44,116.78,23453.1,5085.09,171.56,905.92,5478,3808.46,228209.42]
water=random.sample(data,5)
rate=random.sample(drop,5)
list1=[]
for i in range(len(drop)):
    for j in range(5):
        if rate[j]==drop[i]:
         list1.append(i)
print(rate)
class MyProblem(ea.Problem):  # 继承Problem父类
    def __init__(self):
        name = ' '  # 初始化name(函数名称,可以随意设置)
        M = 2  # 初始化M(目标维数)
        maxormins = [-1] * M  # 初始化maxormins(目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标)
        Dim = 5 # 初始化Dim(决策变量维数)
        varTypes = [0] * Dim  # 初始化varTypes(决策变量的类型,0:实数;1:整数)
        lb = [0] * Dim  # 决策变量下界
        ub = [1] * Dim  # 决策变量上界
        lbin = [0] * Dim  # 决策变量下边界
        ubin = [1] * Dim  # 决策变量上边界
        # 调用父类构造方法完成实例化
        ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin)

    def aimFunc(self, pop):  # 目标函数
        Vars = pop.Phen  # 得到决策变量矩阵 基因表现型矩阵
        ObjV1 = -(5*180+2*(data[list1[0]]+data[list1[1]]+data[list1[2]]+data[list1[3]]+data[list1[4]])-((1-Vars[:, 0])*rate[0]*0.05*3+(1-Vars[:,1])*rate[1]*0.05*3+(1-Vars[:,2])*rate[2]*0.05*3+(1-Vars[:,3])*rate[3]*0.05*3+(1-Vars[:,4])*rate[4]*0.05*3)*2)
        #gx = 1 + 9 * np.sum(Vars[:, 1:43], 1)
        ObjV2 =(Vars[:,0]+Vars[:,1]+Vars[:,2]+Vars[:,3]+Vars[:,4])*0.2
        pop.ObjV = np.array([ObjV1, ObjV2]).T  # 把结果赋值给ObjV
        print(pop.ObjV)
        print('----------------------')
        print(Vars[:,0])
        print('----------------------')
        print(Vars[:, 1])
        print('----------------------')
        print(Vars[:, 2])
        print('----------------------')
        print(Vars[:, 3])
        print('----------------------')
        print(Vars[:, 4])
        print('---------------------')

    # def aimFunc(self,pop):
    #     Vars=pop.Phen
    #     ObjV1=Vars[:0]
    #
    # def calReferObjV(self):  # 计算全局最优解作为目标函数参考值
    #     N = 10000  # 生成10000个参考点
    #     ObjV1 = np.linspace(50, 1000, N)
    #     ObjV2 = np.linspace(0, 50, N)
    #     globalBestObjV = np.array([ObjV1, ObjV2]).T
    #
    #     return globalBestObjV
"""================================实例化问题对象============================="""
problem = MyProblem()  # 生成问题对象
"""==================================种群设置================================"""
Encoding = 'RI'  # 编码方式
NIND = 100# 种群规模
Field = ea.crtfld(Encoding, problem.varTypes, problem.ranges, problem.borders)  # 创建区域描述器
population = ea.Population(Encoding, Field, NIND)  # 实例化种群对象(此时种群还没被初始化,仅仅是完成种群对象的实例化)
"""================================算法参数设置==============================="""
myAlgorithm = ea.moea_NSGA2_templet(problem, population)  # 实例化一个算法模板对象`
myAlgorithm.MAXGEN = 300  # 最大进化代数
myAlgorithm.logTras = 1  # 设置每多少代记录日志,若设置成0则表示不记录日志
myAlgorithm.verbose = True  # 设置是否打印输出日志信息
myAlgorithm.drawing = 1  # 设置绘图方式(0:不绘图;1:绘制结果图;2:绘制目标空间过程动画;3:绘制决策空间过程动画)
"""==========================调用算法模板进行种群进化=========================
调用run执行算法模板,得到帕累托最优解集NDSet以及最后一代种群。NDSet是一个种群类Population的对象。
NDSet.ObjV为最优解个体的目标函数值;NDSet.Phen为对应的决策变量值。
"""
[NDSet, population] = myAlgorithm.run()  # 执行算法模板,得到非支配种群以及最后一代种群
NDSet.save()  # 把非支配种群的信息保存到文件中
"""==================================输出结果=============================="""
print('用时:%f 秒' % myAlgorithm.passTime)
print('评价次数:%d 次' % myAlgorithm.evalsNum)
print('非支配个体数:%d 个' % NDSet.sizes) if NDSet.sizes != 0 else print('没有找到可行解!')
if myAlgorithm.log is not None and NDSet.sizes != 0:
    print('GD', myAlgorithm.log['gd'][-1])
    print('IGD', myAlgorithm.log['igd'][-1])
    print('HV', myAlgorithm.log['hv'][-1])
    print('Spacing', myAlgorithm.log['spacing'][-1])
    """=========================进化过程指标追踪分析========================="""
    metricName = [['igd'], ['hv']]
    Metrics = np.array([myAlgorithm.log[metricName[i][0]] for i in range(len(metricName))]).T
    # 绘制指标追踪分析图
    ea.trcplot(Metrics, labels=metricName, titles=metricName)



在这里插入图片描述

举报

相关推荐

0 条评论