//public List<Requisito> dependentes { get; set; } public Requisito(long id, long custo, long interesse = 0, Requisito pDependente = null) { this.id_requisito = id; this.custo = custo; this.valor_interesse = interesse; this.dependente = pDependente; }
public string Backtracking(long custo_release, List <Requisito> requisitos, List <Patrocinador> patrocinadores, StreamWriter _console) { long custo_atual = 0; Requisito r = null; try { if (custo_release >= custo_atual && requisitos.Count >= 0 && patrocinadores.Count >= 0) { foreach (Requisito release in requisitos) { foreach (Patrocinador p in patrocinadores) { #region Patrocinadores sem o atual List <Patrocinador> patrocinadores_sem_atual = patrocinadores.ToList(); patrocinadores_sem_atual.Remove(p); #endregion foreach (Patrocinador p2 in patrocinadores_sem_atual) { if (p.list_interesse_requi.Count > 0 && p2.list_interesse_requi.Count > 0) { // Processa a solução, ou seja, retorna o requisito de maior prioridade r = new Program().ProcessaSolucao(p, p2); if (r == null) { break; } // Remove o requisito que já foi atribuido a release das listas do patrocinador p.list_interesse_requi.RemoveAll(x => x.id_requisito == r.id_requisito); p2.list_interesse_requi.RemoveAll(x => x.id_requisito == r.id_requisito); } else { break; } } if (r != null) { if (custo_release >= custo_atual + r.custo) { // calcula o custo dos requisitos que já estão na release com o que esta sendo adicionado agora custo_atual = custo_atual + r.custo; // É "impresso" o requisito de retorno do backtraking, e realiza uma chamada recussiva para o // próprio método passando os parametros sem o requisito que já está na release string out_release = Backtracking(custo_release - custo_atual, requisitos, patrocinadores, _console); _console.Write(out_release); Console.Write(out_release); _console.Write(r.id_requisito.ToString() + " - "); return(r.id_requisito.ToString() + " - "); } } } } } return(null); } catch (Exception ex) { return("error"); } }