public Cromossomo crossover(Cromossomo other) { /* TODO: Alterar essa função para o seguinte funcionamento * Clonar cromossomo this - Done * Sortear dois dia e um horário (para cada dia) do crossomo this - Done * Verificar no cromossomo other as disciplinas e respectivos professores ministrando nos horários sorteados - Done * Setar no cromossomo this as disciplinas e professores equivalentes do cromossomo other - Done * Setar no cromossomo this as disciplinas que foram retiradas (dos horários sorteados) nas que foram setadas nos horários sorteados (troca equivalente) - Done * */ _valor = 0; Cromossomo result = (Cromossomo)this.Clone(); for (int i = 0; i < result.cursos.Count; i++) { for (int j = 0; j < result.cursos[i].periodos.Count; j++) { for (int k = 0; k < result.cursos[i].periodos[j].turmas.Count; k++) { crossoverTurma(result.cursos[i].periodos[j].turmas[k], other.cursos[i].periodos[j].turmas[k]); crossoverTurma(result.cursos[i].periodos[j].turmas[k], other.cursos[i].periodos[j].turmas[k]); } } } return(result); }
public List <DAO.Curso> getBestCromossomo() { if (cromossomos == null || cromossomos.Count == 0) { return(null); } Cromossomo melhor = cromossomos[0]; for (int i = 1; i < cromossomos.Count; i++) { if (cromossomos[i].valor > melhor.valor) { melhor = cromossomos[i]; } } return(melhor.cursos); }
public object Clone() { Cromossomo cromossomo = new Cromossomo(); cromossomo._valor = this._valor; cromossomo.cursos = new List <DAO.Curso>(); foreach (DAO.Curso item in this.cursos) { cromossomo.cursos.Add(item == null ? null : (DAO.Curso)item.Clone()); } cromossomo.professores = new List <DAO.Professor>(); foreach (DAO.Professor item in this.professores) { cromossomo.professores.Add(item == null ? null : (DAO.Professor)item.Clone()); } cromossomo.disciplinas = new Sorteio.Disciplinas(cromossomo.professores); return(cromossomo); }
//* Criar gerações sorteando cromossomos pela classe Sorteio.Cromossomo //* Sortear membros para exclusão (inverter roleta viciada) //* Por fator de probabilidade de mutação //FIM!!!!!!!!!!! public void selecaoNatural(int qtdGeracoes) { frmLoad.finalizarQuandoCompletar = false; frmLoad.Caption = "Cruzando resultados..."; Sorteio.Cromossomos sortCromossomo = new Sorteio.Cromossomos(cromossomos); for (int i = 0; i < qtdGeracoes; i++) { //System.Threading.Thread.Sleep(1); Random rand = new Random(); int r = rand.Next(1, 10); if (r <= 8) //80% de chances de cruzamento { sortCromossomo.definirFaixas(Sorteio.Cromossomos.Prioridade.MaiorValor); Cromossomo pai = sortCromossomo.sortear(); Cromossomo mae = sortCromossomo.sortear(pai); Cromossomo filho = pai.crossover(mae); sortCromossomo.definirFaixas(Sorteio.Cromossomos.Prioridade.MenorValor); Cromossomo bastardo = sortCromossomo.sortear(); cromossomos.Add(filho); cromossomos.Remove(bastardo); } else //20% de chances de mutação { sortCromossomo.definirFaixas(Sorteio.Cromossomos.Prioridade.Igualitaria); Cromossomo parker = sortCromossomo.sortear(); parker.mutar(); } frmLoad.addProgress(1); } }