Skip to content

Commit

Permalink
Merge pull request #35 from jbytecode/main
Browse files Browse the repository at this point in the history
refactoring the code
  • Loading branch information
jbytecode authored Aug 9, 2024
2 parents f5abed2 + ac3ab00 commit 749774d
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 110 deletions.
108 changes: 17 additions & 91 deletions cga/individual.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from numpy import random
import random as rd
import numpy as np


class Individual:
Expand Down Expand Up @@ -45,14 +46,13 @@ def __init__(self, gen_type="Binary", ch_size=0):
self.neighbors_positions = None
self.neighbors = None

def randomize(self):
def randomize(self, mins = [], maxs = []):
"""
Randomly initialize the chromosome based on the genome type.
Returns
-------
list
The randomly generated chromosome.
Function mutates the original chromosome of the individual and returns it.
Raises
------
Expand All @@ -63,102 +63,28 @@ def randomize(self):
# # CountSat, Fms, Mmdp, OneMax, Ecc, Maxcut20_01, Maxcut20_09, Maxcut100
self.chromosome = [random.randint(2) for i in range(self.ch_size)]

# Peak
# self.chromosome = [[random.randint(2) for g in range(self.ch_size)] for h in range(self.ch_size)]

elif self.gen_type == "Permutation":
# # Tsp
self.chromosome = list(rd.sample(range(1, 15), self.ch_size))
elif self.gen_type == "Real":
# # Ackley
# self.chromosome = [round(rd.uniform(-32.768, 32.768), 3) for i in range(self.ch_size)]

# # Bohachevsky
# self.chromosome = [random.randint(-15.0, 16.0)for i in range(self.ch_size)]

# # Fms
# self.chromosome = [round(rd.uniform(-6.4, 6.35), 3) for i in range(self.ch_size)]

# # Griewank
# self.chromosome = [round(rd.uniform(-600, 600), 3) for i in range(self.ch_size)]

# # Holzman
# self.chromosome = [round(rd.uniform(-10, 10), 3) for i in range(self.ch_size)]

# # Rastrigin
# self.chromosome = [round(rd.uniform(-5.12, 5.13), 2) for i in range(self.ch_size)]

# # Rosenbrock
# self.chromosome = [random.randint(-5.0, 11.0) for i in range(self.ch_size)]

# # Schaffer and Schaffer2
# self.chromosome = [round(rd.uniform(-100, 100), 3) for i in range(self.ch_size)]

# # Matyas
# self.chromosome = [round(rd.uniform(-10, 10), 3) for i in range(self.ch_size)]

# # Bentcigar
# self.chromosome = [round(rd.uniform(-100, 100), 3) for i in range(self.ch_size)]

# # Sumofdifferentpowers
# self.chromosome = [round(rd.uniform(-10.0, 10.0), 3) for i in range(self.ch_size)]

# # Powell
# self.chromosome = [round(rd.uniform(-4.0, 5.0), 3) for i in range(self.ch_size)]

# # Rothellipsoid
# self.chromosome = [round(rd.uniform(-100, 100), 3) for i in range(self.ch_size)]

# # Chichinadze
# self.chromosome = [round(rd.uniform(-30, 30), 5) for i in range(self.ch_size)]

# # Levy
# self.chromosome = [round(rd.uniform(-10.0, 10.0), 2) for i in range(self.ch_size)]

# # Zettle
# self.chromosome = [round(rd.uniform(-5.0, 5.0), 4) for i in range(self.ch_size)]

# # Dropwave
# self.chromosome = [round(rd.uniform(-5.12, 5.12), 3) for i in range(self.ch_size)]
elif self.gen_type == "Permutation":
# The random.permutation permutes from 0 to n - 1, however
# the library requires permutations 1 to n by design. That's why
# we add 1 to all values.
self.chromosome = list(np.random.permutation(self.ch_size) + 1)

# # StyblinskiTang
self.chromosome = [round(rd.uniform(-5.0, 5.0), 6) for i in range(self.ch_size)]
elif self.gen_type == "Real":
# when the genome type is Real, the chrosomes should be initialized
# by using given range of values, possibly using arguments.
# If arguments are not passed, the range is assumed to be [-1, 1].
if len(mins) == 0:
self.chromosome = [rd.uniform(-1, 1) for i in range(self.ch_size)]
else:
assert len(mins) == len(maxs) == self.ch_size
self.chromosome = [rd.uniform(mins[i], maxs[i]) for i in range(self.ch_size)]

# # Threehumps
# self.chromosome = [round(rd.uniform(-5.0, 5.0), 3) for i in range(self.ch_size)]

# # Zakharov
# self.chromosome = [round(rd.uniform(-5.0, 10.0), 3) for i in range(self.ch_size)]

# # Schwefel
# self.chromosome = [round(rd.uniform(-500.0, 500.0), 3) for i in range(self.ch_size)]

# # Sphere
# self.chromosome = [round(rd.uniform(-5.12, 5.12), 3) for i in range(self.ch_size)]

# # Pow
# self.chromosome = [round(rd.uniform(-5.0, 15.0), 2) for i in range(self.ch_size)]

else:
raise NotImplementedError(self.gen_type + " not implemented yet.")
return self.chromosome

def generate_candidate(self, vector: list) -> list:
"""
Generate a candidate chromosome based on the given probability vector.
Parameters
----------
vector : list of float
The probability vector used to generate the candidate chromosome.
Returns
-------
list
The generated candidate chromosome as a list of 0s and 1s.
"""
ind = [1 if random.rand() < p else 0 for p in vector]
return ind

def getneighbors_positions(self) -> list:
"""
Expand Down
6 changes: 1 addition & 5 deletions cga/optimizer_ccga.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,9 +219,5 @@ def generate_candidate(vector: List[float]) -> List[int]:
List[int]
Generated chromosome based on the vector probabilities.
"""
ind = []
for p in vector:
ind.append(
1) if random.rand() < p else ind.append(0)

ind = [1 if random.rand() < p else 0 for p in vector]
return ind
23 changes: 9 additions & 14 deletions cga/tests/test_individual.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,19 +36,23 @@ def test_randomize_permutation():
"""
Test the randomization of the chromosome for a permutation genome type.
"""
ind = Individual(gen_type="Permutation", ch_size=10)
chsize = 10
ind = Individual(gen_type="Permutation", ch_size=chsize)
ind.randomize()
assert len(ind.chromosome) == 10
assert set(ind.chromosome).issubset(set(range(1, 15)))
assert len(ind.chromosome) == chsize
for i in range(1, chsize+1):
assert i in ind.chromosome

assert len(set(ind.chromosome)) == len(ind.chromosome)

def test_randomize_real_valued():
"""
Test the randomization of the chromosome for a real-valued genome type.
"""
ind = Individual(gen_type="Real", ch_size=10)
chsize = 10
ind = Individual(gen_type="Real", ch_size=chsize)
ind.randomize()
assert len(ind.chromosome) == 10
assert len(ind.chromosome) == chsize
assert all(isinstance(gene, float) for gene in ind.chromosome)

def test_illegal_genome_type():
Expand All @@ -61,15 +65,6 @@ def test_illegal_genome_type():
# Passes the test if an exception is raised
assert True

def test_generate_candidate():
"""
Test the generation of a candidate chromosome based on a given probability vector.
"""
ind = Individual(gen_type="Binary", ch_size=10)
vector = [0.5] * 10
candidate = ind.generate_candidate(vector)
assert len(candidate) == 10
assert all(gene in [0, 1] for gene in candidate)

def test_get_set_neighbors_positions():
"""
Expand Down

0 comments on commit 749774d

Please sign in to comment.