private static Boolean Eval(List <int> vecin, List <int> sol, Rucsac r) { if (CheckIsValid(vecin, r) == true) { if (r.Fitnes(vecin) > r.Fitnes(sol)) { return(true); } } return(false); }
private static List <int> RepairSolution(List <int> sol, Rucsac r) { while (CheckIsValid(sol, r) == false) { Random rnd = new Random(); int indice = rnd.Next(0, r.NumarObiecte); while (sol[indice] == 0) { indice = rnd.Next(0, r.NumarObiecte); } sol[indice] = 0; } return(sol); }
private static List <int> SAHL(Rucsac r, int k) { List <int> solutie = GenerateRandomSearch(r.NumarObiecte, new Random()); List <int> best = new List <int>(r.NumarObiecte); int indice = 0; int contor = 0; solutie = RepairSolution(solutie, r); best = new List <int>(solutie); Console.WriteLine(r.GreutateTotalaASolutie(solutie)); Console.WriteLine("Valoare = " + r.Fitnes(solutie)); WriteSolutie(solutie); while (indice < k) { List <int> vecinSol = GetVecin(solutie, r.NumarObiecte); if (Eval(vecinSol, solutie, r) == true) { solutie = new List <int>(vecinSol); Console.WriteLine("\nSe schimba solutie\n"); if (Eval(solutie, best, r) == true) { best = new List <int>(solutie); Console.WriteLine("\nSe schimba bestul\n"); } } else { contor++; } if (contor == r.NumarObiecte) { solutie = GenerateRandomSearch(r.NumarObiecte, new Random()); solutie = RepairSolution(solutie, r); contor = 0; } indice++; } return(best); }
static void Main(string[] args) { Rucsac rucsac = new Rucsac(); string path = Meniu(); string con = "y"; rucsac.CitesteDinFisier(path); while (con == "y") { Console.Write("k = "); int k = Convert.ToInt32(Console.ReadLine()); List <int> solFinal = SAHL(rucsac, k); int fitnes = rucsac.GreutateTotalaASolutie(solFinal); Console.WriteLine(fitnes); WriteSolutie(solFinal); WriteSolutieToFile(solFinal, fitnes); Console.WriteLine("Vrei sa mai rulezi inca o data? (y sau n)"); con = Console.ReadLine(); } }