Beispiel #1
0
    def decoding(self):
        """
        描述: 种群染色体解码。
        """

        if self.Encoding == 'BG':  # 此时Field实际上为FieldD
            Phen = ea.bs2ri(self.Chrom, self.Field)  # 把二进制转化为实整数
        elif self.Encoding == 'RI' or self.Encoding == 'P':
            Phen = self.Chrom.copy()
        else:
            raise RuntimeError(
                'error in Population.decoding: Encoding must be '
                'BG'
                ' or '
                'RI'
                ' or '
                'P'
                '. (编码设置有误,Encoding必须为'
                'BG'
                ', '
                'RI'
                ' 或 '
                'P'
                '。)')
        return Phen
Beispiel #2
0
    def decoding(self):
        """
        描述: 种群染色体解码。
        """

        Phen = np.ones((self.sizes, 0))  # 初始化一个空的矩阵
        # 遍历各染色体矩阵进行解码
        for i in range(self.ChromNum):
            if self.Encodings[i] == 'BG':  # 此时Field实际上为FieldD
                tempPhen = ea.bs2ri(self.Chroms[i],
                                    self.Fields[i])  # 把二进制转化为实整数
            elif self.Encodings[i] == 'RI' or self.Encodings[i] == 'P':
                tempPhen = self.Chroms[i].copy()
            else:
                raise RuntimeError(
                    'error in PsyPopulation.decoding: Encoding must be '
                    'BG'
                    ' or '
                    'RI'
                    ' or '
                    'P'
                    '. (编码设置有误,Encoding必须为'
                    'BG'
                    ', '
                    'RI'
                    ' 或 '
                    'P'
                    '。)')
            Phen = np.hstack([Phen, tempPhen])
        return Phen
Beispiel #3
0
# 种群个体数目
MAXGEN = 200
# 最大遗传代数
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.bs2ri(Chrom, FieldD)  # 对初始种群进行解码
CV = np.zeros(
    (NIND, 1))  # 初始化一个CV矩阵(此时因为未确定个体是否满足约束条件,因此初始化元素为0,暂认为所有个体是可行解个体)
ObjV, CV = aimfunc(variable, CV)  # 计算初始种群个体的目标函数值
FitnV = ea.ranking(maxormins * ObjV, CV)  # 根据目标函数大小分配适应度值
best_ind = np.argmax(FitnV)  # 计算当代最优个体的序号
# 开始进化
for gen in range(MAXGEN):
    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, :].astype(int), SelCh])
    Phen = ea.bs2ri(Chrom, FieldD)  # 对种群进行解码(二进制转十进制)
    ObjV, CV = aimfunc(Phen, CV)  # 求种群个体的目标函数值
    FitnV = ea.ranking(maxormins * ObjV, CV)  # 根据目标函数大小分配适应度值
Beispiel #4
0
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)

# 解码,将二进制编码的矩阵转化为实数
help(bs2ri)
Phen = bs2ri(Chrom, FieldD)
print('表现型矩阵 = \n', Phen)


def aim(Phen):
    x = Phen[:, [0]]
    y = Phen[:, [1]]
    CV = np.abs(x + y - 3)
    f = x + y
    return f, CV


ObjV, CV = aim(Phen)
print('目标函数矩阵:\n', ObjV)
print('CV矩阵:\n', CV)