Пример #1
0
        public void calculate()
        {
            int             regQuantity        = rm.mapOfTemperatureRegulators.Count();                              //Количество регуляторов
            int             sensQuantity       = sm.mapOfTemperatureSensors.Count();                                 //Количество сенсоров
            Matrix <double> weightCoefficients = Matrix <double> .Build.DenseDiagonal(sensQuantity, regQuantity, 0); //How sensors are effected by regulators(degrees/degrees)

            int i = 0, j = 0;                                                                                        //Counters

            foreach (Location sensLoc in sm.mapOfTemperatureSensors.Keys)                                            //Weight Coefficients counting
            {
                foreach (Location regLoc in rm.mapOfTemperatureRegulators.Keys)
                {
                    double r = Math.Sqrt(Math.Pow((sensLoc.x - regLoc.x), 2) + Math.Pow((sensLoc.y - regLoc.y), 2));
                    weightCoefficients[i, j] = 1 / (r + 0.5);//Why 0.5? Because.
                    j++;
                }
                i++;
                j = 0;
            }
            ParamValues.Corridor neededValues = gp.getTemperature();                                 //Corridor
            double          averageValue      = (neededValues.minValue + neededValues.maxValue) / 2; //Average Value
            Vector <double> regValues = Vector <double> .Build.Dense(regQuantity);                   //X vector

            Vector <double> sensValues = Vector <double> .Build.Dense(sensQuantity);                 //Вектор Y

            Vector <double> H                 = Vector <double> .Build.Dense(regQuantity, 5);        //Step

            regValues = HookJivsMethod(regValues, sensValues, weightCoefficients, H, 2.5, 0.1, averageValue, neededValues);

            /*if (powerValues == null) powerValues = new double[rm.mapOfTemperatureRegulators.Count];
             * for (int i = 0; i < powerValues.Length; i++) powerValues[i] = 0;*/
            powerValues = regValues.ToArray();
        }
Пример #2
0
 public void tickUpdate(int time, ParamValues.Corridor ac, ParamValues.Corridor l,
                        ParamValues.Corridor temp, ParamValues.Corridor w)
 {
     view.setTime(time);
     view.setAcidity(ac.minValue.ToString() + "-" + ac.maxValue.ToString());
     view.setLight(l.minValue.ToString() + "-" + l.maxValue.ToString());
     view.setTemperature(temp.minValue.ToString() + "-" + temp.maxValue.ToString());
     view.setWetness(w.minValue.ToString() + "-" + w.maxValue.ToString());
     if (view.isAciditySelected())
     {
         acidityAllocation();
     }
     if (view.isLightSelected())
     {
         lightAllocation();
     }
     if (view.isTemperatureSelected())
     {
         temperatureAllocation();
     }
     if (view.isWetnessSelected())
     {
         wetnessAllocation();
     }
     if (view.isSensorSelected())
     {
         sensorAllocation();
     }
 }
Пример #3
0
        private double TaskFunction(Vector <double> X, Vector <double> Y, Matrix <double> A, double averageValue, ParamValues.Corridor neededValues)
        {
            double f = 0;

            Y = A * X + Vector <double> .Build.Dense(recievedValues);

            for (int i = 0; i < Y.Count; i++)
            {
                f += (averageValue - Y[i]) * (averageValue - Y[i]);
                if (Y[i] > neededValues.maxValue || Y[i] < neededValues.maxValue)
                {
                    f += 100000;
                }
            }
            return(f);
        }
Пример #4
0
        private Vector <double> HookJivsMethod(Vector <double> X0, Vector <double> Y, Matrix <double> A, Vector <double> H, double l, double eps, double averageValue, ParamValues.Corridor neededValues)
        {
            double          delta = H.Norm(2);
            Vector <double> Xb    = Vector <double> .Build.DenseOfVector(X0);

            while (true)
            {
                Vector <double> Xs = CoordSearch(Xb, Y, H, A, averageValue, neededValues);
                if (Xs.Equals(Xb))
                {
                    H /= 10; delta /= 10; //Ліміт блізка *)
                    if (delta < eps)
                    {
                        break;
                    }
                    else
                    {
                        continue;
                    }
                }
                ;
                while (true)
                {
                    Vector <double> Xp = Xb + (Xs - Xb) * 2.5;                                 // Рух уздоўж яра*)
                    Vector <double> Xq = CoordSearch(Xp, Y, H, A, averageValue, neededValues); // Каардынатны спуск *)
                    if (TaskFunction(Xs, Y, A, averageValue, neededValues) <= TaskFunction(Xq, Y, A, averageValue, neededValues))
                    {
                        Xb = Xs; break;// Шукаць будзем новае Xs *)
                    }
                    else
                    {
                        Xb = Xs; Xs = Xq; continue;//(*Шукаць будзем новае Xp *)
                    };
                }
                ;
            }
            ;
            return(Xb);
        }
Пример #5
0
        private Vector <double> CoordSearch(Vector <double> X, Vector <double> Y, Vector <double> H, Matrix <double> A, double averageValue, ParamValues.Corridor neededValues)
        {
            double          z    = TaskFunction(X, Y, A, averageValue, neededValues);
            Vector <double> Xnew = Vector <double> .Build.DenseOfVector(X);

            for (int i = 0; i < X.Count; i++)
            {
                Xnew[i] += H[i];
                if (z < TaskFunction(Xnew, Y, A, averageValue, neededValues))
                {
                    Xnew[i] = X[i] - H[i];
                }
                if (z < TaskFunction(Xnew, Y, A, averageValue, neededValues))
                {
                    Xnew[i] = X[i];
                }
            }
            return(Xnew);
        }