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(); }
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(); } }
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); }
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); }
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); }