private void SetNeighbours(ref AlgorithmParameters parameters, int i) { parameters.Neighbour.Add(i, new List <int>()); var neighbours = parameters.E.Where(x => x.From == i).Select(x => x.To); parameters.Neighbour[i].AddRange(neighbours); }
private void ClearAll() { _parameters = null; W = new List <int>(); V = new List <int>(); Path = new List <int>(); }
public double Calculate(int v_i, int v_j, AlgorithmParameters parameters) { parameters.SetLambda(); return((parameters.Configuration.Beta / parameters.Configuration.Q) * (parameters.D[v_i, v_j] / parameters.Delta[v_i, v_j]) * (parameters.Configuration.E_max / (parameters.E_nergy[v_j] * parameters.Lambda[v_j])) * (1 + (parameters.Configuration.Gamma * parameters.Tao[v_j]))); }
private AlgorithmParameters CreateParameters(Configuration configuration, Instance instance) { var parameters = new AlgorithmParameters(instance, configuration); for (int i = 0; i < instance.V_size + 1; i++) { parameters.p[i] = (_randomGenerator.NextDouble() / 2) + 0.5; parameters.E_nergy[i] = configuration.E_max; parameters.Tao[i] = _randomGenerator.NextDouble(); SetDisctance(ref parameters, i, instance); SetNeighbours(ref parameters, i); } return(parameters); }
public List <int> FindPath(AlgorithmParameters parameters) { ClearAll(); _parameters = parameters; Initialize(); do { int v_j = GetVj(); var v_i_List = new List <int>(); foreach (var node in _parameters.E.Where(x => (x.To == v_j)).ToList()) { v_i_List.Add(node.From); } foreach (var v_i in v_i_List) { var c = _costCalculator.Calculate(v_i, v_j, _parameters); var x = L[v_j] + c; G[v_j] = (M[v_j] - c) * parameters.Configuration.Q; if (L[v_i] > x) { M[v_i] = M[v_j] * _parameters.p[v_i]; if ((M[v_i] - c) < 0) { Console.WriteLine($"Utility function at node {v_i}"); _parameters.E.Remove(_parameters.E.Where(node => (node.From == v_i && node.To == v_j)).FirstOrDefault()); _parameters.E.Remove(_parameters.E.Where(node => (node.From == v_j && node.To == v_i)).FirstOrDefault()); } else { L[v_i] = x; Previous[v_i] = v_j; } } } } while (!W.Contains(vs) && WHasNeighbour()); BuildPath(); var welfare = _costCalculator.CalculateWelfare(vs, vq, G, Path); result = new Result { Path = Path, Welfare = welfare }; return(Path); }
private void SetDisctance(ref AlgorithmParameters parameters, int i, Instance instance) { for (int j = 0; j < instance.V_size + 1; j++) { parameters.D[i, j] = Math.Sqrt(Math.Pow(instance.Coordinates[j].X - instance.Coordinates[i].X, 2) + Math.Pow(instance.Coordinates[j].Y - instance.Coordinates[i].Y, 2)); if (parameters.D[i, j] < parameters.Configuration.R && i != j) { parameters.Delta[i, j] = 1; parameters.E.Add(new Node { From = i, To = j, }); } else { parameters.Delta[i, j] = 0; } } }