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)