Пример #1
0
        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>();
 }
Пример #3
0
 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])));
 }
Пример #4
0
        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);
        }
Пример #6
0
 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;
         }
     }
 }