Example #1
0
    def initChrom(self, NIND=None):
        """
        描述: 初始化种群染色体矩阵,NIND为所需要的个体数,并返回一个新的种群对象。
        NIND可缺省,不缺省时,种群在初始化染色体矩阵前会把种群规模调整为NIND。
        """

        if NIND is not None:
            self.sizes = NIND  # 重新设置种群规模
        self.Chrom = ea.crtpc(self.Encoding, self.sizes, self.Field)  # 生成染色体矩阵
        self.ObjV = None
        self.FitnV = np.ones((self.sizes, 1))
        self.CV = np.zeros((self.sizes, 1))
        self.Phen = self.decoding()  # 解码
Example #2
0
    def initChrom(self, NIND=None):
        """
        描述: 初始化种群染色体矩阵,NIND为所需要的个体数。
        NIND可缺省,不缺省时,种群在初始化染色体矩阵前会把种群规模调整为NIND。
        
        """

        if NIND is not None:
            self.sizes = NIND  # 重新设置种群规模
        self.Chrom = ea.crtpc(self.Encoding, self.sizes, self.Field)  # 生成染色体矩阵
        self.Lind = self.Chrom.shape[1]  # 计算染色体的长度
        self.ObjV = None
        self.FitnV = None
        self.CV = None
Example #3
0
    def initChrom(self, NIND=None):
        """
        描述: 初始化种群染色体矩阵,NIND为所需要的个体数。
        NIND可缺省,不缺省时,种群在初始化染色体矩阵前会把种群规模调整为NIND。
        """

        if NIND is not None:
            self.sizes = NIND  # 重新设置种群规模
        # 遍历各染色体矩阵进行初始化
        for i in range(self.ChromNum):
            self.Chroms[i] = ea.crtpc(self.Encodings[i], self.sizes,
                                      self.Fields[i])  # 生成染色体矩阵
        self.ObjV = None
        self.FitnV = np.ones((self.sizes, 1))
        self.CV = np.zeros((self.sizes, 1))
        self.Phen = self.decoding()  # 解码
Example #4
0
    def initChrom(self, NIND=None):
        """
        描述: 初始化种群染色体矩阵,NIND为所需要的个体数。
        NIND可缺省,不缺省时,种群在初始化染色体矩阵前会把种群规模调整为NIND。
        
        """

        if NIND is not None:
            self.sizes = NIND  # 重新设置种群规模
        # 遍历各染色体矩阵进行初始化
        for i in range(self.ChromNum):
            self.Chroms[i] = ea.crtpc(self.Encodings[i], self.sizes,
                                      self.Fields[i])  # 生成染色体矩阵
            self.Linds.append(self.Chroms[i].shape[1])  # 计算染色体的长度
        self.ObjV = None
        self.FitnV = np.ones((self.sizes, 1))  # 默认适应度全为1
        self.CV = None
Example #5
0
    def initChrom(self, NIND=None):
        """
        描述: 初始化种群染色体矩阵。

        输入参数:
            NIND : int - (可选参数)用于修改种群规模。
                         当其不缺省时,种群在初始化染色体矩阵前会把种群规模调整为NIND。

        输出参数:
            无输出参数。

        """

        if NIND is not None:
            self.sizes = NIND  # 重新设置种群规模
        self.Chrom = ea.crtpc(self.Encoding, self.sizes, self.Field)  # 生成染色体矩阵
        self.Lind = self.Chrom.shape[1]  # 计算染色体的长度
        self.ObjV = None
        self.FitnV = None
        self.CV = None
Example #6
0
NIND = 100
# 种群个体数目
Encoding = 'BG'
MAXGEN = 70  # 最大遗传代数
maxormins = [-1]  # 列表元素为1则表示对应的目标函数是最小化,元素为-1则表示对应的目标函数是最大化
selectStyle = 'rws'  # 采用轮盘赌选择
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), :]  # 选择
NIND = 700
# 种群个体数目
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)  # 求育种个体的目标函数值
    # 记录
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, '秒')
Example #9
0
FieldD = ea.crtfld(Encoding, varTypess, ranges, borders, precisions, codes,
                   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]
Example #10
0
import numpy as np
from geatpy import crtpc
from geatpy import bs2ri

# help(crtpc)
Nind = 4  # 种群规模
Encoding = 'RI'  # 实整数编码
FieldDR = np.array([
    [-3.1, -2, 0, 3],  # 下界
    [4.2, 2, 1, 5],  # 上界
    [0, 0, 1, 1]
])  # 0-连续  1-离散
Chrom = crtpc(Encoding, Nind, FieldDR)
print(Chrom)

# 使用二进制编码染色体
Nind = 4
Encoding = 'BG'
FieldD = np.array([
    [3, 2],  # 各决策变量编码后所占二进制位数--与决策变量范围以及精度相关,染色体长度为求和所得
    [0, 0],  # 下界
    [7, 3],  # 上界
    [1, 1],  # 编码方式 0--二进制  1--格雷码
    [0, 0],  # 是否采用对数刻度 0--算术刻度 1--对数刻度
    [1, 1],  # 范围是否包含下界 0--不含 1--包含
    [1, 1],  # 范围是否包含上界 0--不含 1--包含
    [0, 0]
])  # 0--连续 1--离散
Chrom = crtpc(Encoding, Nind, FieldD)
print(Chrom)