Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions global.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"sdk": {
"version": "6.0.400"
"version": "8"
}
}
}
85 changes: 85 additions & 0 deletions src/GeneticSharp.Domain/OperatorsStrategy/IslandModelStrategy.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
using System.Collections.Generic;
using System.Linq;

namespace GeneticSharp
{
public class IslandModelStrategy : OperatorsStrategyBase
{
private double _migrationProbability; // Probability of a chromosome migrating to another island
private int _islandCount; // Number of islands (subpopulations)
private Dictionary<IChromosome, int> _islandMapping = new Dictionary<IChromosome, int>(); // Tracks which island each chromosome belongs to

public IslandModelStrategy(int islandCount, double migrationProbability = 0.1)
{
_islandCount = islandCount;
_migrationProbability = migrationProbability;
}

public override IList<IChromosome> Cross(IPopulation population, ICrossover crossover, float crossoverProbability, IList<IChromosome> parents)
{
// Asignar islas a los cromosomas si no tienen una
int i = 0;
foreach (var p in parents)
{
if (!_islandMapping.ContainsKey(p))
{
_islandMapping[p] = (RandomizationProvider.Current.GetDouble() < _migrationProbability)
? RandomizationProvider.Current.GetInt(0, _islandCount) // Migrar a una isla aleatoria
: i++ % _islandCount; // Asignar de manera cíclica
}
}

// Migrar cromosomas a otras islas
foreach (var c in parents)
{
if(RandomizationProvider.Current.GetDouble() < _migrationProbability)
_islandMapping[c] = RandomizationProvider.Current.GetInt(0, _islandCount);
}

var offspring = new List<IChromosome>();

// Agrupar padres por isla y hacer crossover dentro de cada isla
foreach (var island in parents.GroupBy(r => _islandMapping[r]))
{
var islandParents = island.OrderBy(r => RandomizationProvider.Current.GetDouble()).ToList();

// Verificar si hay suficientes padres para hacer cruces
if (islandParents.Count < crossover.ParentsNumber)
{
continue; // O podrías duplicar padres para completar el grupo
}

// Hacer cruces
for (int j = 0; j <= islandParents.Count - crossover.ParentsNumber; j += crossover.ParentsNumber)
{
var children = SelectParentsAndCross(population, crossover, crossoverProbability, islandParents, j);
if (children != null)
{
// Asignar hijos a la misma isla de sus padres
foreach (var c in children)
_islandMapping[c] = island.Key;
offspring.AddRange(children);
}
}
}

// Borrar los elementos de islandMapping que ya no están en la población
var allChromosomes = new HashSet<IChromosome>(parents.Concat(offspring).Concat(population.CurrentGeneration.Chromosomes));
var toDelete = _islandMapping.Keys.Except(allChromosomes).ToList();
foreach (var c in toDelete)
_islandMapping.Remove(c);

return offspring;
}


public override void Mutate(IMutation mutation, float mutationProbability, IList<IChromosome> chromosomes)
{
// Apply mutation to each chromosome individually
foreach (var c in chromosomes)
{
mutation.Mutate(c, mutationProbability);
}
}
}
}
11 changes: 9 additions & 2 deletions src/GeneticSharp.Domain/Selections/TournamentSelection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ protected override IList<IChromosome> PerformSelectChromosomes(int number, Gener
var candidates = generation.Chromosomes.ToList();
var selected = new List<IChromosome>();

while (selected.Count < number)
while (selected.Count < number && Size <= candidates.Count)
{
var randomIndexes = RandomizationProvider.Current.GetUniqueInts(Size, 0, candidates.Count);
var tournamentWinner = candidates.Where((c, i) => randomIndexes.Contains(i)).OrderByDescending(c => c.Fitness).First();
Expand All @@ -98,7 +98,14 @@ protected override IList<IChromosome> PerformSelectChromosomes(int number, Gener
}
}

return selected;
while(selected.Count < number && candidates.Any())
{
var canditate = candidates.First().Clone();
selected.Add(canditate);
candidates.Remove(canditate);
}

return selected;
}
}
}