2014-09-19 7 views
0

Я хочу заменить элемент «Мутате» из списка, взяв другой случайный элемент из другого списка.замена элемента в списке C#

private int elitism = 20; 
private int population = 1; 
private int chance = 100; 
private Random rand = new Random(); 
private List<HeroStats> allHeroes = new List<HeroStats>(); 
private List<Team> allTeams = new List<Team>(); 

Если я создаю команду и мутировать, он должен заменить 1 случайный элемент из этой текущей команды, но если я использую YHE Mutation метод, замена не происходит; Я получаю ту же команду

public void Mutation() 
{ 
    // compute how many individuals will 100% survive 
    int goodResults= population * elitism/100; 
    int index; 
    int position; 
    HeroStats old_hero, new_hero; 
    Team new_team; 

    for (int i = goodResults; i < allTeams.Count(); i++) 
    { 
     if (rand.Next(0, 100) < chance) 
     { 
      new_team = allTeams.ElementAt(i); 
      index = allTeams.IndexOf(new_team); 
      // select random hero within the team , a team having 5 heros 
      position = rand.Next(0, 4); 
      //RetrieveHero(int x) is a method which returns the hero from position x within a team 
      old_hero = new_team.RetrieveHero(position); 
      // get a new hero from the hero-list 
      new_hero = allHeroes.ElementAt(rand.Next(0, 101)); 
      // associate the new value to the genome 
      new_team.Remove(old_hero); 
      new_team.Add(new_hero); 
      allTeams[index] = new_team; 
     } 
    } 
} 

В качестве примера: рассмотрим команды а = [1 2 3 4 5]
После team a претерпевает мутацию, она могла бы выглядеть следующим образом
команды а = [1, 2, 3, 4, R] или команда a = [1, P, 3, 4, 5] или команда a = [1, 2, 3, 99, 5]
Почему мой код ведет себя так странно?

+0

Каков ожидаемый результат или что вы получаете, что заставляет его действовать так странно? – dbarnes

+0

Что именно это делает, заставляет вас думать, что это действует странно? – omni

+0

Я протестировал его, создав только 1 команду, распечатав ее, используя метод в этой команде и снова напечатав новую команду, ничего не меняет –

ответ

0

мне удалось обойти эту проблему путем добавления метода внутри Team класса:

public void ReplaceHero(HeroStats hero,HeroStats new_Hero) 
     { 
      for (int i = 0; i < 5;i++) 
       if (team.ElementAt(i).Equals(hero)) 
       { 
        team.Remove(hero); 
        team.Add(new_Hero); 
       } 
     } 

Если есть какие-либо улучшения, что я мог сделать, я был бы очень признателен, чтобы узнать о них.

Смежные вопросы