ホームページ  >  記事  >  バックエンド開発  >  Python 遺伝的アルゴリズム Geatpy ツールボックスの簡単な紹介

Python 遺伝的アルゴリズム Geatpy ツールボックスの簡単な紹介

WBOY
WBOY転載
2022-09-09 13:38:562347ブラウズ

[関連する推奨事項: Python3 ビデオ チュートリアル ]

1. 遺伝的アルゴリズムとは何ですか?

遺伝的アルゴリズムは、生物学の遺伝学と自然選択のメカニズムをシミュレートすることによって人工的に構築された検索アルゴリズムの一種であり、ある意味、生物進化プロセスの数学的シミュレーションです。生物学的集団の生存プロセスは一般にダーウィンの進化論に従い、集団内の個体は環境に適応する能力に基づいて自然に選択または排除されます。進化の過程の結果は個体の構造に反映され、その染色体には複数の遺伝子が含まれており、表現型と遺伝子型の間の対応する関係は、個体の外部特性と内部メカニズムの間の論理的関係を反映しています。個体間の交雑や突然変異を経て自然環境に適応する。生物学的染色体は、数学的またはコンピューター的に数字の列として表され、依然として染色体と呼ばれ、個体とも呼ばれます。適応性は、染色体に対応する数値によって測定されます。染色体の選択または削除は、直面している問題に基づいています。最大値を見つけます。または最小限。

2. 遺伝的アルゴリズム ライブラリ Geatpy

2.1 遺伝的アルゴリズム ツールボックス Geatpy パラメーターの概要

API 公式リファレンス ドキュメント

population パラメータ[重要な属性: Chrom、Phen、Objv、CV、FitnV]

  • sizes: int - 人口サイズ、つまり、人口の個体数。
  • ChromNum: int - 染色体の数、つまり各個人が持つ染色体の数。
  • エンコーディング: str - 染色体エンコーディング方式、'BG': バイナリ/グレー エンコーディング、'RI': 実数整数エンコーディング、つまり実数と整数の混合エンコーディング、'P': 順列エンコーディング
  • Field : 配列 - デコード行列
  • Chrom : 配列 - 人口染色体行列。各行は個人の染色体に対応します。
  • Lind : int - 集団の染色体長。
  • ObjV: 配列 - 母集団の目的関数値行列、各行は個人の目的関数値に対応、各列はターゲットに対応
  • FitnV: 配列 - 母集団の個人適応度の列ベクトル、それぞれ要素は個人の適応度に対応し、最小適応度は 0
  • CV: 配列 - CV (Constraint Violation Value) は、制約条件の違反の程度を定量的に記述するために使用される行列です。制約
  • Phen: 配列 - 集団表現型行列 (つまり、解読後の集団の各染色体によって表される決定変数で構成される行列) に対応します。
  • 制約が CV マトリックスを介した実現可能性ルールに基づいて設定されている場合、不等式制約は ≤ である必要があり、等式制約は abs() に渡す必要があります (これは、より大きな値が得られるという原則に従うためです)値が小さいほど適応度は小さくなります)

    ##ea.問題.
  • init() lbin と ubin (決定変数範囲境界行列) は、範囲間隔の開始と終了を表し、1 が閉じた 0 が開いた間隔です。

Geatpy 結果パラメータの紹介

success: True または False は、アルゴリズムが正常に解決されたかどうかを示します。

stopMsg: アルゴリズムを停止する理由を格納する文字列。

optPop: アルゴリズムの解決結果を格納する母集団オブジェクト。実行可能な解決策がない場合は、optPop.sizes=0 になります。 optPop.Phen は決定変数行列、optPop.ObjV は目的関数値行列です。

lastPop: アルゴリズムの進化が完了した後の最後の世代の母集団オブジェクト。

Vars: optPop.Phen と同じです。これが最適な解決策です。実行可能な解決策がない場合は、Vars=None となります。

ObjV: optPop.ObjV に等しい。これは、最適解に対応する目的関数の値です。実行可能な解決策がない場合は、ObjV=None となります。

CV: optPop.CV に等しい。これは、最適解に対応する制約違反度行列です。実行可能な解決策がない場合は、CV=None となります。

startTime: プログラムの実行開始時刻。

endTime: プログラムの実行終了時刻。

executeTime: アルゴリズムにかかった時間。

nfev: アルゴリズム評価の数

gd: (多目的最適化が行われ、理論的な最適解が与えられた場合にのみ使用可能) GD インデックス値。

igd: (多目的最適化が行われ、理論的な最適解が与えられた場合にのみ利用可能) IGD 指標値。

hv: (多目的最適化の場合のみ) HV インジケーターの値。

spacing: (複数目的最適化の場合のみ) 間隔インジケーターの値。

3. ベスト プラクティス

3.1 コード例|パラメーター テンプレート

ソリューション セット:

header_regex = '|'.join(['{}'] * len(headers))
header_str = header_regex.format(*[str(key).center(width) for key, width in zip(headers, widths)])
print("=" * len(header_str))
            print(header_str)
            print("-" * len(header_str))

gen: 進化代数
eval: 評価の記録数
f\_opt: 現代最適個体の目的関数値
f \ _max =現代人口の最大関数値有向非巡回グラフ

コード [最短パス] 1: geatpy ライブラリを使用する

import numpy as np
import geatpy as ea
class MyProblem(ea.Problem):  # 继承Problem父类
    def __init__(self):
        name = 'Shortest_Path'  # 初始化name(函数名称,可以随意设置)
        M = 1  # 初始化M(目标维数)
        maxormins = [1]  # 初始化maxormins(目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标)
        Dim = 10  # 初始化Dim(决策变量维数)
        varTypes = [1] * Dim  # 初始化varTypes(决策变量的类型,元素为0表示对应的变量是连续的;1表示是离散的)
        lb = [0] * Dim  # 决策变量下界
        ub = [9] * Dim  # 决策变量上界
        lbin = [1] * Dim  # 决策变量下边界 1表示闭合区间,0表示开区间
        ubin = [1] * Dim  # 决策变量上边界
        # 调用父类构造方法完成实例化
        ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin)
        # 设置每一个结点下一步可达的结点(结点从1开始数,因此列表nodes的第0号元素设为空列表表示无意义)
        self.nodes = [[], [2, 3], [3, 4, 5], [5, 6], [7, 8], [4, 6], [7, 9], [8, 9], [9, 10], [10]]
        # 设置有向图中各条边的权重
        self.weights = {'(1, 2)': 36, '(1, 3)': 27, '(2, 4)': 18, '(2, 5)': 20, '(2, 3)': 13, '(3, 5)': 12,
                        '(3, 6)': 23,
                        '(4, 7)': 11, '(4, 8)': 32, '(5, 4)': 16, '(5, 6)': 30, '(6, 7)': 12, '(6, 9)': 38,
                        '(7, 8)': 20,
                        '(7, 9)': 32, '(8, 9)': 15, '(8, 10)': 24, '(9, 10)': 13}
    def decode(self, priority):  # 将优先级编码的染色体解码得到一条从节点1到节点10的可行路径
        edges = []  # 存储边
        path = [1]  # 结点1是路径起点
        while not path[-1] == 10:  # 开始从起点走到终点
            currentNode = path[-1]  # 得到当前所在的结点编号
            nextNodes = self.nodes[currentNode]  # 获取下一步可达的结点组成的列表
            chooseNode = nextNodes[np.argmax(
                priority[np.array(nextNodes) - 1])]  # 从NextNodes中选择优先级更高的结点作为下一步要访问的结点,因为结点从1数起,而下标从0数起,因此要减去1
            path.append(chooseNode)
            edges.append((currentNode, chooseNode))
        return path, edges
    def aimFunc(self, pop):  # 目标函数
        pop.ObjV = np.zeros((pop.sizes, 1))  # 初始化ObjV
        for i in range(pop.sizes):  # 遍历种群的每个个体,分别计算各个个体的目标函数值
            priority = pop.Phen[i, :]
            path, edges = self.decode(priority)  # 将优先级编码的染色体解码得到访问路径及经过的边
            pathLen = 0
            for edge in edges:
                key = str(edge)  # 根据路径得到键值,以便根据键值找到路径对应的长度
                if not key in self.weights:
                    raise RuntimeError("Error in aimFunc: The path is invalid. (当前路径是无效的。)", path)
                pathLen += self.weights[key]  # 将该段路径长度加入
            pop.ObjV[i] = pathLen  # 计算目标函数值,赋值给pop种群对象的ObjV属性
## 执行脚本
if __name__ == "__main__":
    # 实例化问题对象
    problem = MyProblem()
    # 构建算法
    algorithm = ea.soea_EGA_templet(problem,
                                    ea.Population(Encoding='RI', NIND=4),
                                    MAXGEN=10,  # 最大进化代数
                                    logTras=1)  # 表示每隔多少代记录一次日志信息
    # 求解
    res = ea.optimize(algorithm, verbose=True, drawing=1, outputMsg=False, drawLog=False, saveFlag=True,
                      dirName='result')
    print('最短路程为:%s' % (res['ObjV'][0][0]))
    print('最佳路线为:')
    best_journey, edges = problem.decode(res['Vars'][0])
    for i in range(len(best_journey)):
        print(int(best_journey[i]), end=' ')
    print()
[関連する推奨事項:

Python3 ビデオ チュートリアル]

以上がPython 遺伝的アルゴリズム Geatpy ツールボックスの簡単な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。