tsukuba-websci / MPS-TOM-Urnmodel

Iwahashi, Okabe and Suda's experiments for MPS-TOM 2023
MIT License
2 stars 0 forks source link

[Feature]: GAをグリッドサーチに対応させる #33

Closed krmr73 closed 1 year ago

krmr73 commented 1 year ago

Feature description

グリッドサーチする場合は出力先を変更するようにする。 最適な個体のrho, nu, recentness, frequency, objective, population_size, mutation_rate, cross_rateの情報を出力する。

Motivation

個体数、交叉率、突然変異率の最適なパラメータを調べ、最適なパラメータで本実験を行いたいため。

Additional context

現在考えている仕様は以下の通りである。

Okabe-Junya commented 1 year ago

@krmr73

これ、ドメイン知識持っている自分がやった方が流石に早そうなので、引き取ります

Okabe-Junya commented 1 year ago

先に考えたいこと

  1. どのパラメータを,どれくらいの粒度で探索したいか(e.g. mutation_rateを0.01刻みで...)
  2. (再掲)出力先どうするのか問題.個人的には ga/results/grid_search/<target_data> 以下にパラメタ名を含んだ jsonファイルでもダンプすれば良いと思う

その他

既存のコードを活用できそう.例えば,jsonとしてダンプする関数などは既にある.

https://github.com/tsukuba-websci/MPS-TOM-Urnmodel/blob/ccef26d4fd1cd6134177cf52d1cedc3a3163bca9/ga/io_utils.py#L53-L75

また,main.py にこれ以上機能を持たせたくない && スパゲッティになるので,grid_search.py を作り,それを実行するようにした方が良さそう

Okabe-Junya commented 1 year ago

非公開だが,jsonダンプが完了した後,最適なファイルを探すスクリプトも既にあったりする

import json
import os
import sys

def main():
    """最適なパラメタだったファイルを探す"""
    best_fname = ""
    best_score = float("inf")

    worst_fname = ""
    worst_score = float("-inf")

    target_data = sys.argv[1]
    respath = f"./results/grid_search_{target_data}/rate_"

    for rate in [0.01, 0.02, 0.03, 0.04, 0.05]:
        fpath = respath + str(rate)
        for file in os.listdir(fpath):
            if file.endswith(".json"):
                fname = os.path.join(fpath, file)
                with open(fname) as f:
                    res = json.load(f)
                    if res["best_fitness"] < best_score:
                        best_score = res["best_fitness"]
                        best_fname = fname
                    if res["best_fitness"] > worst_score:
                        worst_score = res["best_fitness"]
                        worst_fname = fname

    print("Best file: ", best_fname)
    print("Best score: ", best_score)
    print()
    print("Worst file: ", worst_fname)
    print("Worst score: ", worst_score)

if __name__ == "__main__":
    main()