-
Notifications
You must be signed in to change notification settings - Fork 0
/
aco.py
103 lines (81 loc) · 3.78 KB
/
aco.py
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
# Load the iris dataset
iris = load_iris()
X, y = iris.data, iris.target
# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Define the fitness function to optimize
def fitness_function(features):
# Train a Decision Tree classifier on the selected features and calculate the accuracy on the test set
clf = DecisionTreeClassifier()
clf.fit(X_train[:, features], y_train)
accuracy = clf.score(X_test[:, features], y_test)
return accuracy
# Define the ACO algorithm
def aco_algorithm(pop_size, num_iterations, alpha, beta, evaporation_rate, pheromone_constant, q0, lower_bound, upper_bound, limit):
# Initialize the pheromone matrix
pheromone_matrix = np.ones((limit,))
# Initialize the best solution
best_solution = None
best_fitness = 0.0
# Run the algorithm for the specified number of iterations
for t in range(num_iterations):
# Initialize the ant solutions
ant_solutions = np.zeros((pop_size, limit))
ant_fitness_values = np.zeros((pop_size,))
# Construct the ant solutions
for i in range(pop_size):
# Initialize the ant solution
ant_solution = np.zeros((limit,))
# Set the starting feature
ant_solution[np.random.randint(limit)] = 1
# Construct the rest of the ant solution
for j in range(1, limit):
# Calculate the probability of selecting each feature
probabilities = pheromone_matrix * (ant_solution == 0) ** beta
probabilities /= np.sum(probabilities)
# Choose the next feature based on the probability
if np.random.uniform() < q0:
next_feature = np.argmax(probabilities)
else:
next_feature = np.random.choice(np.arange(limit), p=probabilities)
# Set the next feature
ant_solution[next_feature] = 1
# Add the ant solution to the ant solutions list
ant_solutions[i] = ant_solution
# Evaluate the ant solution
ant_fitness_values[i] = fitness_function(np.where(ant_solution == 1)[0])
# Update the best solution
if np.max(ant_fitness_values) > best_fitness:
best_solution = ant_solutions[np.argmax(ant_fitness_values)]
best_fitness = np.max(ant_fitness_values)
# Update the pheromone matrix
pheromone_matrix *= (1.0 - evaporation_rate)
for i in range(pop_size):
for j in range(limit):
if ant_solutions[i][j] == 1:
pheromone_matrix[j] += pheromone_constant / ant_fitness_values[i]
# Clip the pheromone matrix to the search space
pheromone_matrix = np.clip(pheromone_matrix, lower_bound, upper_bound)
# Print the best solution every 10 iterations
if t % 10 == 0:
print("Iteration {}: Best Fitness = {}".format(t, best_fitness))
# Select the features of the best solution
best_features = np.where(best_solution == 1)
return best_features[0]
#Run the ACO algorithm
pop_size = 10
num_iterations = 100
alpha = 1.0
beta = 2.0
evaporation_rate = 0.5
pheromone_constant = 1.0
q0 = 0.9
lower_bound = 0.0
upper_bound = 1.0
limit = X.shape[1]
best_features = aco_algorithm(pop_size, num_iterations, alpha, beta, evaporation_rate, pheromone_constant, q0, lower_bound, upper_bound, limit)
print("Best features selected: ", best_features)