機械学習と深層学習 Pythonによるシミュレーション の第3章の蟻コロニー最適化法のコード aco.py
について、 わかりやすく書き換えてみました。
環境
- Python 3.6.5 Anaconda
コード
書籍にあったコードもそうですが、どれだけ施行を繰り返しても一定値にはなりません。 というのも、必ず一定の割合でランダムに経路を選択するからです。
変数名をわかりやすくしてみたり、関数の引数としていらなさそうなものを除外してみたりしています。 関数walk
にはm_step
を渡さなくても計算できるので、引数を最低限のものにしています。 ただしこれは、データ量が多かったり施行回数が多いと足枷になることもあります。 リストを内部で毎回作るよりは、引数で渡したものを変更する方がメモリ効率としてはいいはずなので。 ループも product
を使っていますが、 for
を階層的に書いた方が速いはずです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
import math import random import copy from itertools import product Q = 3 RHO = 0.8 EPSILON = 0.15 SEED = 32767 def update_pheromone(cost, pheromone, ant_step): # diminish pheromone for i, j in product(range(2), range(len(cost[0]))): pheromone[i][j] *= RHO total_path_length = 0.0 for m in range(len(ant_step)): path_length = 0.0 for i in range(len(cost[0])): path_length += cost[ant_step[m][i]][i] for i in range(len(cost[0])): pheromone[ant_step[m][i]][i] += Q * (1.0 / (path_length * path_length)) total_path_length += path_length print(total_path_length / len(ant_step)) def walk(pheromone, ant_count): step = len(pheromone[0]) ant_step = [ [-1 for i in range(step)] for j in range(ant_count) ] for m, s in product(range(ant_count), range(step)): if random.random() < EPSILON or abs(pheromone[0][s] - pheromone[1][s]) < 0.1: ant_step[m][s] = random.randint(0, 1) else: if pheromone[0][s] > pheromone[1][s]: ant_step[m][s] = 0 else: ant_step[m][s] = 1 print(ant_step) return ant_step def solve(step, number_of_ant, iteration_count): cost = [[j for i in range(step)] for j in [1, 5]] pheromone = [[0.0 for i in range(step)] for j in range(2)] ant_step = [ [0 for i in range(step)] for j in range(number_of_ant) ] random.seed(SEED) for i in range(iteration_count): print(i) print(pheromone) ant_step = walk(pheromone, number_of_ant) update_pheromone(cost, pheromone, ant_step) print(i) print(pheromone) if "__main__" == __name__: solve(10, 20, 50) |