예제 #1
0
recStyle = 'xovdp'  # 采用两点交叉
mutStyle = 'mutbin'  # 采用二进制染色体的变异算子
Lind = 64  # 计算染色体长度
pc = 0.9  # 交叉概率
pm = 1 / Lind  # 变异概率
obj_trace = np.zeros((MAXGEN, 2))  # 定义目标函数值记录器
var_trace = np.zeros((MAXGEN, Lind))  # 染色体记录器,记录历代最优个体的染色体
"""=========================开始遗传算法进化========================"""
start_time = time.time()  # 开始计时
Chrom = ea.crtpc(Encoding, NIND, FieldD)  # 生成种群染色体矩阵

help(ea.ranking)

for gen in range(MAXGEN):

    Phen = ea.bs2real(Chrom, FieldD)  # 对种群进行解码(二进制转十进制)
    ObjV, CV = aim(Phen)  # 求种群个体的目标函数值
    FitnV = ea.ranking(maxormins * ObjV, CV)  # 根据目标函数大小分配适应度值
    # 记录
    best_ind = np.argmax(FitnV)  # 计算当代最优个体的序号
    obj_trace[gen, 0] = np.sum(ObjV) / ObjV.shape[0]  # 记录当代种群的目标函数均值
    obj_trace[gen, 1] = ObjV[best_ind]  # 记录当代种群最优个体目标函数值
    var_trace[gen, :] = Chrom[best_ind, :]  # 记录当代种群最优个体的染色体

    SelCh = Chrom[ea.selecting(selectStyle, FitnV, NIND - 1), :]  # 选择
    SelCh = ea.recombin(recStyle, SelCh, pc)  # 重组
    SelCh = ea.mutate(mutStyle, Encoding, SelCh, pm)  # 变异
    # 把父代精英个体与子代的染色体进行合并,得到新一代种群
    Chrom = np.vstack([var_trace[gen, :], SelCh])

    print('第', gen, '代', '用时:', time.time() - start_time, '秒')
예제 #2
0
ranges = np.vstack([x1]).T  # 生成自变量的范围矩阵
borders = np.vstack([b1]).T  # 生成自变量的边界矩阵
"""=========================遗传算法参数设置========================="""
NIND = 40
# 种群个体数目
MAXGEN = 25
# 最大遗传代数
FieldD = ea.crtfld(Encoding, varTypes, ranges, borders, precisions, codes,
                   scales)  # 调用函数创建区域描述器
Lind = int(np.sum(FieldD[0, :]))  # 计算编码后的染色体长度
obj_trace = np.zeros((MAXGEN, 2))  # 定义目标函数值记录器
var_trace = np.zeros((MAXGEN, Lind))  # 定义染色体记录器,记录每一代最优个体的染色体
"""=========================开始遗传算法进化========================"""
start_time = time.time()  # 开始计时
Chrom = ea.crtbp(NIND, Lind)  # 生成种群染色体矩阵
variable = ea.bs2real(Chrom, FieldD)  # 对初始种群进行解码
ObjV = aim(variable)  # 计算初始种群个体的目标函数值
best_ind = np.argmax(ObjV)  # 计算当代最优个体的序号
# 开始进化
for gen in range(MAXGEN):
    FitnV = ea.ranking(-ObjV)  # 根据目标函数大小分配适应度值(由于遵循目标最小化约定,因此最大化问题要对目标函数值乘上-1)
    SelCh = Chrom[ea.selecting('rws', FitnV, NIND - 1), :]  # 选择,采用'rws'轮盘赌选择
    SelCh = ea.recombin('xovsp', SelCh, 0.7)  # 重组(采用两点交叉方式,交叉概率为0.7)
    SelCh = ea.mutbin(Encoding, SelCh)  # 二进制种群变异
    # 把父代精英个体与子代合并
    Chrom = np.vstack([Chrom[best_ind, :], SelCh])
    variable = ea.bs2real(Chrom, FieldD)  # 对育种种群进行解码(二进制转十进制)
    ObjV = aim(variable)  # 求育种个体的目标函数值
    # 记录
    best_ind = np.argmax(ObjV)  # 计算当代最优个体的序号
    obj_trace[gen, 0] = np.sum(ObjV) / NIND  # 记录当代种群的目标函数均值
# 种群个体数目
MAXGEN = 70
# 最大遗传代数
GGAP = 0.9
# 代沟:说明子代与父代的重复率为0.1
PM = 1
#整条染色体的变异概率(每一位的变异概率=pm/染色体长度)
selectStyle = 'sus'  #采用随机抽样选择
recStyle = 'xovdp'  #采用两点交叉
mutStyle = 'mutbin'  #采用二进制染色体的变异算子
"""=========================开始遗传算法进化========================"""
FieldD = ga.crtfld(encoding, varTypes, ranges, borders, precisions, codes,
                   scales)  # 调用函数创建区域描述器
Lind = int(np.sum(FieldD[0, :]))  # 计算编码后的染色体长度
Chrom = ga.crtpc(encoding, NIND, FieldD)  # 根据区域描述器生成二进制种群
variable = ga.bs2real(Chrom, FieldD)  #对初始种群进行解码
ObjV = aim(variable)  # 计算初始种群个体的目标函数值
pop_trace = (np.zeros((MAXGEN, 2)) * np.nan)  # 定义进化记录器,初始值为nan
ind_trace = (np.zeros(
    (MAXGEN, Lind)) * np.nan)  # 定义种群最优个体记录器,记录每一代最优个体的染色体,初始值为nan
# 开始进化!!
for gen in range(MAXGEN):
    FitnV = ga.ranking(-ObjV)  # 根据目标函数大小分配适应度值(由于遵循目标最小化约定,因此最大化问题要对目标函数值乘上-1)
    SelCh = Chrom[ga.selecting(selectStyle, FitnV,
                               NIND - 1)]  # 选择,采用'sus'随机抽样选择
    SelCh = ga.recombin(recStyle, SelCh, GGAP)  # 重组(采用单点交叉方式,交叉概率为0.7)
    SelCh = ga.mutate(mutStyle, encoding, SelCh, PM)  # 二进制种群变异
    variable = ga.bs2real(Chrom, FieldD)  # 对育种种群进行解码(二进制转十进制)
    ObjVSel = aim(variable)  # 求育种个体的目标函数值
    # 记录
    best_ind = np.argmax(ObjV)  # 计算当代最优个体的序号
예제 #4
0
def main():
    """============================变量设置============================"""
    x1 = [50, 100]  # 第一个决策变量范围
    x2 = [50, 100]  # 第二个决策变量范围
    x3 = [50, 100]
    x4 = [50, 100]
    x5 = [50, 100]
    x6 = [50, 100]
    x7 = [50, 100]
    x8 = [50, 100]
    x9 = [50, 100]
    x10 = [50, 100]

    b1 = [1, 1]  # 第一个决策变量边界,1表示包含范围的边界,0表示不包含
    b2 = [1, 1]  # 第二个决策变量边界,1表示包含范围的边界,0表示不包含
    b3 = [1, 1]
    b4 = [1, 1]
    b5 = [1, 1]
    b6 = [1, 1]
    b7 = [1, 1]
    b8 = [1, 1]
    b9 = [1, 1]
    b10 = [1, 1]

    ranges = np.vstack([x1, x2, x3, x4, x5, x6, x7, x8, x9,
                        x10]).T  # 生成自变量的范围矩阵,使得第一行为所有决策变量的下界,第二行为上界
    borders = np.vstack([b1, b2, b3, b4, b5, b6, b7, b8, b9,
                         b10]).T  # 生成自变量的边界矩阵
    varTypes = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])  # 决策变量的类型,0表示连续,1表示离散
    """==========================染色体编码设置========================="""
    Encoding = 'BG'  # 'BG'表示采用二进制/格雷编码
    codes = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]  # 决策变量的编码方式,设置两个0表示两个决策变量均使用二进制编码
    precisions = [4, 4, 4, 4, 4, 4, 4, 4, 4,
                  4]  # 决策变量的编码精度,表示二进制编码串解码后能表示的决策变量的精度可达到小数点后6位
    scales = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]  # 0表示采用算术刻度,1表示采用对数刻度
    FieldD = ea.crtfld(Encoding, varTypes, ranges, borders, precisions, codes,
                       scales)  # 调用函数创建译码矩阵
    """=========================遗传算法参数设置========================"""
    NIND = 30  # 种群个体数目
    MAXGEN = 30  # 最大遗传代数
    maxormins = [1]  # 列表元素为1则表示对应的目标函数是最小化,元素为-1则表示对应的目标函数是最大化
    selectStyle = 'rws'  # 采用轮盘赌选择
    recStyle = 'xovdp'  # 采用两点交叉
    mutStyle = 'mutbin'  # 采用二进制染色体的变异算子
    pc = 0.7  # 交叉概率
    pm = 1  # 整条染色体的变异概率(每一位的变异概率=pm/染色体长度)
    Lind = int(np.sum(FieldD[0, :]))  # 计算染色体长度
    obj_trace = np.zeros((MAXGEN, 2))  # 定义目标函数值记录器
    var_trace = np.zeros((MAXGEN, Lind))  # 染色体记录器,记录历代最优个体的染色体
    """=========================开始遗传算法进化========================"""
    start_time = time.time()  # 开始计时
    Chrom = ea.crtpc(Encoding, NIND, FieldD)  # 生成种群染色体矩阵
    variable = ea.bs2real(Chrom, FieldD)  # 对初始种群进行解码
    ObjV = minfun(variable)  # 计算初始种群个体的目标函数值
    FitnV = ea.ranking(maxormins * ObjV)  # 根据目标函数大小分配适应度值
    best_ind = np.argmax(FitnV)  # 计算当代最优个体的序号
    # 开始进化
    for gen in range(MAXGEN):
        print(gen)
        SelCh = Chrom[ea.selecting(selectStyle, FitnV, NIND - 1), :]  # 选择
        SelCh = ea.recombin(recStyle, SelCh, pc)  # 重组
        SelCh = ea.mutate(mutStyle, Encoding, SelCh, pm)  # 变异
        # 把父代精英个体与子代的染色体进行合并,得到新一代种群
        Chrom = np.vstack([Chrom[best_ind, :], SelCh])
        Phen = ea.bs2real(Chrom, FieldD)  # 对种群进行解码(二进制转十进制)
        print(Phen)
        ObjV = minfun(Phen)  # 求种群个体的目标函数值
        FitnV = ea.ranking(maxormins * ObjV)  # 根据目标函数大小分配适应度值
        # 记录
        best_ind = np.argmax(FitnV)  # 计算当代最优个体的序号
        obj_trace[gen, 0] = np.sum(ObjV) / ObjV.shape[0]  # 记录当代种群的目标函数均值
        obj_trace[gen, 1] = ObjV[best_ind]  # 记录当代种群最优个体目标函数值
        var_trace[gen, :] = Chrom[best_ind, :]  # 记录当代种群最优个体的染色体
        print(best_ind)
    # 进化完成
    end_time = time.time()  # 结束计时
    ea.trcplot(obj_trace, [['种群个体平均目标函数值', '种群最优个体目标函数值']])  # 绘制图像
    """============================输出结果============================"""
    best_gen = np.argmin(obj_trace[:, [1]])
    print('最优解的目标函数值:', obj_trace[best_gen, 1])
    variable = ea.bs2real(var_trace[[best_gen], :],
                          FieldD)  # 解码得到表现型(即对应的决策变量值)
    print('最优解的决策变量值为:')
    print(variable)
    print('用时:', end_time - start_time, '秒')
예제 #5
0
                   scales)

NIND = 20
MAXGEN = 100
maxorins = np.array([1])
selectStyle = 'sus'
recStyle = 'xovdp'
mutStyle = 'mutbin'
Lind = int(np.sum(FieldD[0, :]))
pc = 0.9
pm = 1 / Lind
obj_trace = np.zeros((MAXGEN, 2))
var_trace = np.zeros((MAXGEN, Lind))
start_time = time.time()
Chrom = ea.crtpc(Encoding, NIND, FieldD)
variable = ea.bs2real(Chrom, FieldD)
ObjV = aim(variable)
best_ind = np.argmin(ObjV)

for gen in range(MAXGEN):
    FitnV = ea.ranking(maxorins * ObjV)
    SelCh = Chrom[ea.selecting(selectStyle, FitnV, NIND - 1), :]
    SelCh = ea.recombin(recStyle, SelCh, pc)
    SelCh = ea.mutate(mutStyle, Encoding, SelCh, pm)
    Chrom = np.vstack([Chrom[best_ind, :], SelCh])
    Phen = ea.bs2real(Chrom, FieldD)
    ObjV = aim(Phen)
    best_ind = np.argmin(ObjV)
    obj_trace[gen, 0] = np.sum(ObjV) / ObjV.shape[0]
    obj_trace[gen, 1] = ObjV[best_ind]
    var_trace[gen, :] = Chrom[best_ind, :]
예제 #6
0
    precisions = [4]  # 变量的编码精度
    scales = [0]  # 采用算法刻度
    ranges = np.vstack([x1]).T  # 自变量范围矩阵
    borders = np.vstack([b1]).T  # 自变量边界矩阵
    """遗传算法参数设置"""
    NIND = 40  # 种群个体数目
    MAXGN = 25  # 最大遗传代数
    FieldD = ea.crtfld(Encoding, varTypes, ranges, borders, precisions, codes,
                       scales)  # 调用函数创建区域描述器
    Lind = int(np.sum(FieldD[0, :]))  # 计算编码后染色体长度
    obj_trace = np.zeros((MAXGN, 2))  # 定于目标函数值记录器
    var_trace = np.zeros((MAXGN, Lind))  # 定义染色体记录器, 记录每一代最优个体染色体
    """遗传算法进化"""
    start_time = time.time()
    Chrom = ea.crtbp(NIND, Lind)  # 生成种群染色体矩阵
    variable = ea.bs2real(Chrom, FieldD)  # 对初始种群编码
    ObjV = aim(variable)  # 计算初始种群个体目标函数值
    best_ind = np.argmax(ObjV)  # 计算当代最优个体序号

    # 开始进化
    for gen in range(MAXGN):
        FitnV = ea.ranking(-ObjV)  # 根据目标函数大小分配适应度
        Selch = Chrom[ea.selecting('rws', FitnV,
                                   NIND - 1), :]  # 选择,采用'rws'轮盘选择
        Selch = ea.recombin('xovsp', Selch, 0.7)  # 重组(两点交叉,交叉概率0.7)
        Selch = ea.mutbin(Encoding, Selch)  # 二进制种群变异
        # 父代子代合并
        Chrom = np.vstack([Chrom[best_ind, :], Selch])
        variable = ea.bs2real(Chrom, FieldD)  # 育种群体编码(2进制转10进制)
        ObjV = aim(variable)
        # 记录
예제 #7
0
def train_process(model, gt):
    def aim(Phen):
        # ld = Phen[:, [0]] # 取出第1列,得到所有个体的第1个自变量
        # gm = Phen[:, [1]] # 取出第2列,得到所有个体的第2个自变量
        fits = np.zeros((len(Phen),1))  # 所有个体的健康程度评估
        # print(Phen)
        for idx in range(len(Phen)):
            model.omiga = Phen[idx][1] 
            model.gamma = Phen[idx][0]
            # model.beta = Phen[idx][2]
            model.d = Phen[idx][2]
             
            model.deduce()
            # print(np.array(model.i * model.N))
            exam_day = int(Phen[idx][3])

            model_preds_i = model.i[exam_day:exam_day+len(gt)] * model.N
            gt_i = np.array(gt['confirmedCount'])
            model_preds_r = model.r[exam_day:exam_day+len(gt)] * model.N
            gt_r = np.array(gt['deadCount']+gt['curedCount'])

            infective_fitness = residual_square(model_preds_i,  gt_i)
            recov_fitness = residual_square(model_preds_r,  gt_r)
            
            fits[idx] = infective_fitness + recov_fitness
        # print(model_preds_i, gt_i)
        # print(fits)
        return fits
          

    # settings
    omiga = [0, 1]                   # 自变量范围
    gamma = [0, 1]
    # beta = [0, 1]
    d = [0, 100]
    exam_d = [10, 60]

    b1 = [0, 0]                  # 自变量边界, 1 表示包含边界, 0 表示不包含边界
    b2 = [0, 0]
    # b3 = [0, 0]
    b4 = [0, 0]
    b5 = [1, 1]
    varTypes = np.array([0, 0, 0, 0])       # 自变量的类型,0表示连续,1表示离散
    Encoding = 'BG'                # 'BG'表示采用二进制/格雷编码
    codes = [1, 1, 1, 1]                    # 变量的编码方式,2个变量均使用格雷编码
    precisions =[6, 6, 6, 6]                # 变量的编码精度
    scales = [0, 0, 0, 0]                   # 采用算术刻度
    ranges=np.vstack([gamma, omiga, d, exam_d]).T       # 生成自变量的范围矩阵
    borders=np.vstack([b2, b1, b4, b5]).T      # 生成自变量的边界矩阵

    
    # params of GA
    NIND = 400                     # 种群个体数目
    MAXGEN = 100                 # 最大遗传代数
    maxormins = [1]   # 最小化目标函数, 元素为-1表示最大化目标函数
    FieldD = ea.crtfld(Encoding,varTypes,
                        ranges, borders,precisions,codes,scales) # 调用函数创建区域描述器
    Lind = int(np.sum(FieldD[0, :]))          # 计算编码后的染色体长度
    obj_trace = np.zeros((MAXGEN, 2))         # 定义目标函数值记录器
    var_trace = np.zeros((MAXGEN, Lind))      # 定义染色体记录器,记录每一代最优个体的染色体


    start_time = time.time()                             # 开始计时
    Chrom = ea.crtbp(NIND, Lind)                         # 生成种群染色体矩阵
    variable = ea.bs2real(Chrom, FieldD)                 # 对初始种群进行解码
    ObjV = aim(variable)          # 计算初始种群个体的目标函数值
    best_ind = np.argmin(ObjV)                         # 计算当代最优个体的序号


    # 开始进化
    for gen in range(MAXGEN):
        
        FitnV = ea.ranking(maxormins * ObjV)               # 根据目标函数大小分配适应度值(由于遵循目标最小化约定,因此最大化问题要对目标函数值乘上-1)
        SelCh=Chrom[ea.selecting('rws', FitnV, NIND-1), :] # 选择,采用'rws'轮盘赌选择
        SelCh=ea.recombin('xovsp', SelCh, 0.7)           # 重组(采用两点交叉方式,交叉概率为0.7)
        SelCh=ea.mutbin(Encoding, SelCh)                 # 二进制种群变异
        # 把父代精英个体与子代合并
        Chrom = np.vstack([Chrom[best_ind, :], SelCh])
        variables = ea.bs2real(Chrom, FieldD)             # 对育种种群进行解码(二进制转十进制)
        ObjV = aim(variables)                             # 求育种个体的目标函数值
        # 记录
        best_ind = np.argmin(ObjV)                       # 计算当代最优个体的序号
        obj_trace[gen, 0] = np.sum(ObjV) / NIND          # 记录当代种群的目标函数均值
        obj_trace[gen, 1] = ObjV[best_ind]               # 记录当代种群最优个体目标函数值
        var_trace[gen, :] = Chrom[best_ind, :]           # 记录当代种群最优个体的变量值
    # 进化完成
    end_time = time.time() # 结束计时

    # 绘制图像
    ea.trcplot(obj_trace, [['种群个体平均目标函数值', '种群最优个体目标函数值']])

    best_gen = np.argmin(obj_trace[:, [1]])
    print('最优解的目标函数值: ', obj_trace[best_gen, 1])
    opt_variable = ea.bs2real(var_trace[[best_gen], :], FieldD)
    print('最优解的决策变量为:')
    for i in range(opt_variable.shape[1]):
        print(opt_variable[0, i])
    print('用时: ', end_time - start_time, '秒')
    
    model.omiga = opt_variable[0, 1]
    model.gamma = opt_variable[0, 0]
    # model.beta = opt_variable[0, 2]
    model.d = opt_variable[0, 2]
    model.deduce()
    model.draw_curves()

    return opt_variable[0]