double[] polycofs = new double[2]; //mx + b #endregion Fields #region Constructors public Linear(RBFCurve curve) { m_curve = curve; }
/// <summary> /// evenly spaced /// </summary> /// <param name="rows"></param> /// <param name="columns"></param> /// <param name="max"></param> /// <param name="min"></param> /// <returns></returns> //public List<double[]> GetMeshPointsInX(int rows, int columns, double[] max, double[] min) //{ // List<double[]> vals = new List<double[]>(); // double deltax = max[0] - min[0]; // double deltay = max[1] - min[1]; // int i, j; // double x, y; // for (i = 0; i < rows; i++) // { // y = (double)i / (double)(rows - 1) * deltay + min[1]; // for (j = 0; j < columns; j++) // { // x = (double)j / (double)(columns - 1) * deltax + min[0]; // double[] p = new double[3] { x, y, 0 }; // Value(ref p); // vals.Add(p); // } // } // return vals; //} /// <summary> /// unevenly spaced /// </summary> /// <param name="rows"></param> /// <param name="columns"></param> /// <param name="max"></param> /// <param name="min"></param> /// <returns></returns> public List<double[]> GetMeshPointsInXUneven(int rows, int columns, double[] max, double[] min) { List<double[]> vals = new List<double[]>(); double deltax = max[0] - min[0]; double deltay = max[1] - min[1]; int i, j; double y, sx; List<double[]> points = new List<double[]>(); points.Add(new double[] { 0, 0 }); points.Add(new double[] { 1.0, 0.5 }); points.Add(new double[] { 8.0, 5.0 }); points.Add(new double[] { 10.0, 10.0 }); RBFCurve rbf = new RBFCurve(null, "shaper", points, new RBFBasis.ThinPlateSpline(null), new RBFPolynomials.Linear(null), 0.0); shaper Shape = ((double value) => { double[] pnt = new double[] { 10.0*value, 0 }; rbf.Value(ref pnt); return pnt[1]/10.0; }); if (m_threaded) { try { int start, end; meshArray.Clear(); for (i = 0; i < meshThreadcount; i++) { meshDoneEvents[i] = new ManualResetEvent(false); start = (rows * i) / meshThreadcount; end = ((i + 1) * rows) / meshThreadcount; MeshThread mt = new MeshThread(this, rows, start, end, columns, deltax, deltay, min, null, meshDoneEvents[i], Shape, null); meshArray.Add(mt); ThreadPool.QueueUserWorkItem(mt.ThreadPoolCallback, i); } // Wait for all threads in pool to calculate. foreach (var e in meshDoneEvents) e.WaitOne(); meshArray.ForEach(delegate(MeshThread m) { vals.AddRange(m.Result); }); } catch (Exception e) { string message = e.Message; } } else { for (i = 0; i < rows; i++) { y = (double)i / (double)(rows - 1) * deltay + min[1]; for (j = 0; j < columns; j++) { //x = (double)j / (double)(columns - 1) * deltax + min[0]; sx = Shape((double)j / (double)(columns - 1)) * deltax + min[0]; double[] p = new double[3] { sx, y, 0 }; Value(ref p); vals.Add(p); } } } return vals; }
private Linear(NsNode curve, double[] cofs) { if (!(curve is RBFCurve)) throw new Exception("Linera Polynomial Parent must be a RBF Curve"); else m_curve = curve as RBFCurve; cofs.CopyTo(polycofs, 0); }
private void SetPlots(int p, List<double[]> fitPoints) { object plot = new object(); object curve = new object(); IBasisFunction basis = new RBFBasis.ThinPlateSpline(null); switch (Basis) { case BasisType.Cubic: basis = new RBFBasis.PolyHarmonic3(null); break; case BasisType.Gaussian: basis = new RBFBasis.Gaussian(null); break; case BasisType.Line: basis = new RBFBasis.CustomBasis(null, 0, 0, 1, 0); break; case BasisType.Parabolic: basis = new RBFBasis.ThinPlateSpline2(null); break; case BasisType.CubicParabolic: if (p % 2 == 0) basis = new RBFBasis.PolyHarmonic3(null); else basis = new RBFBasis.CustomBasis(null, 1, 1, -1, 0); break; } switch (p) { case 1: plot = plotSurface2D1; //basis = new RBFBasis.Exponential(null); p1Curve = new RBFCurve(null, "RBF " + p, fitPoints, basis, new RBFPolynomials.Linear(null), 0.0); curve = p1Curve; break; case 2: plot = plotSurface2D2; //basis = new RBFBasis.Exponential(null); p2Curve = new RBFCurve(null, "RBF " + p, fitPoints, basis, new RBFPolynomials.Linear(null), 0.0); curve = p2Curve; break; case 3: plot = plotSurface2D3; //basis = new RBFBasis.Exponential(null); p3Curve = new RBFCurve(null, "RBF " + p, fitPoints, basis, new RBFPolynomials.Linear(null), 0.0); curve = p3Curve; break; case 4: plot = plotSurface2D4; //basis = new RBFBasis.Exponential(null); p4Curve = new RBFCurve(null, "RBF " + p, fitPoints, basis, new RBFPolynomials.Linear(null), 0.0); curve = p4Curve; break; case 5: plot = plotSurface2D5; //basis = new RBFBasis.Exponential(null); p5Curve = new RBFCurve(null, "RBF " + p, fitPoints, basis, new RBFPolynomials.Linear(null), 0.0); curve = p5Curve; break; case 6: plot = plotSurface2D6; // basis = new RBFBasis.Exponential(null); p6Curve = new RBFCurve(null, "RBF " + p, fitPoints, basis, new RBFPolynomials.Linear(null), 0.0); curve = p6Curve; break; } if (Max[0] < fitPoints.Max(pt => pt[0])) Max[0] = fitPoints.Max(pt => pt[0]); if (Max[1] < fitPoints.Max(pt => pt[1])) Max[1] = fitPoints.Max(pt => pt[1]); if (Min[0] > fitPoints.Min(pt => pt[0])) Min[0] = fitPoints.Min(pt => pt[0]); if (Min[1] > fitPoints.Min(pt => pt[1])) Min[1] = fitPoints.Min(pt => pt[1]); NPlot.Windows.PlotSurface2D plotter = (NPlot.Windows.PlotSurface2D)plot; RBFCurve RBF = (RBFCurve)curve; //RBF = new RBFCurve(null, "RBF " + p, fitPoints, basis, new RBFPolynomials.Linear(null), 0.0); plotter.Clear(); plotter.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed; //Add a background grid for better chart readability. NPlot.Grid grid = new NPlot.Grid(); grid.VerticalGridType = NPlot.Grid.GridType.Coarse; grid.HorizontalGridType = NPlot.Grid.GridType.Coarse; grid.MinorGridPen = new Pen(Color.Blue, 1.0f); grid.MajorGridPen = new Pen(Color.LightGray, 1.0f); plotter.Add(grid); int length = fitPoints.Count * 5; //Create a step plot instance for the balance chart. LinePlot speed = new LinePlot(); PointPlot pplot = new PointPlot(); speed.Pen = new Pen(Color.Blue, 1); //Create the lists from which to pull data. List<Int32> countaxis = new List<Int32>(); List<Int32> Pplotcountaxis = new List<Int32>(); List<decimal> speedlist = new List<decimal>(); for (int i = 0; i < length; i++) countaxis.Add(i); for (int i = 0; i < fitPoints.Count; i++) Pplotcountaxis.Add((int)fitPoints[i][0]); //Populate the balanceAmount list double[] pnt; List<decimal> pointsList = fitPoints.ConvertAll(new Converter<double[], decimal>((double[] dd) => { return Convert.ToDecimal(dd[1]); })); for (int i = 0; i < length; i++) { pnt = new double[] { (double)i, 0 }; RBF.Value(ref pnt); speedlist.Add(Convert.ToDecimal(pnt[1])); } //foreach (double value in pent.Speeds) //{ // speedlist.Add(Convert.ToDecimal(value) / 1200); //} pplot.AbscissaData = Pplotcountaxis; pplot.DataSource = pointsList; speed.AbscissaData = countaxis; speed.DataSource = speedlist; //Add stepBalance to plotSurfaceBalance. plotter.Add(speed); plotter.Add(pplot); //Balance plot general settings. plotter.ShowCoordinates = true; //plotter.YAxis1.WorldMax = 10; //plotter.YAxis1.WorldMin = 0; //this.YAxis1. plotter.AutoScaleAutoGeneratedAxes = true; plotter.AddAxesConstraint(new AxesConstraint.AxisPosition(NPlot.PlotSurface2D.YAxisPosition.Left, 60)); //Label Label1 = new Label(); //Label1.Font = new Font(Label1.Font, FontStyle.Bold); //plotter.YAxis1. plotter.YAxis1.Label = "Y"; plotter.YAxis1.LabelFont = new Font(this.Font, FontStyle.Bold); plotter.YAxis1.LabelOffsetAbsolute = true; plotter.XAxis1.Label = "X"; plotter.XAxis1.LabelFont = new Font(this.Font, FontStyle.Bold); plotter.YAxis1.LabelOffset = 40; plotter.XAxis1.HideTickText = false; plotter.Padding = 5; plotter.RightMenu = NPlot.Windows.PlotSurface2D.DefaultContextMenu; plotter.AddInteraction(new NPlot.Windows.PlotSurface2D.Interactions.AxisDrag(false)); plotter.AddInteraction(new NPlot.Windows.PlotSurface2D.Interactions.HorizontalDrag()); plotter.AddInteraction(new NPlot.Windows.PlotSurface2D.Interactions.VerticalDrag()); plotter.Title = basis.Label; plotter.TitleFont = new Font(this.Font, FontStyle.Bold); //} //Refresh surfaces. plotter.Refresh(); }
void p1BRW_ProgressChanged(object sender, ProgressChangedEventArgs e) { if (p1BRW.CancellationPending == true) Algo.Stop(); m_progBar.Value = e.ProgressPercentage; if (e.UserState == null) return; List<int> bestChromo = (List<int>)e.UserState; if (bestChromo.Count > 0) { List<double[]> GAPnts = new List<double[]>(); double[] result = EvalChromosome(ref bestChromo, ref GAPnts); object curve = new object(); object plot = new object(); for (int j = 0; j < 1; j++) { switch (j + 1) { case 1: curve = p1Curve; plot = plotSurface2D1; break; case 2: curve = p2Curve; plot = plotSurface2D2; break; case 3: curve = p3Curve; plot = plotSurface2D3; break; case 4: curve = p4Curve; plot = plotSurface2D4; break; case 5: curve = p5Curve; plot = plotSurface2D5; break; case 6: curve = p6Curve; plot = plotSurface2D6; break; } RBFCurve oldRBF = curve as RBFCurve; CustomBasis GeneticBasis = new CustomBasis(16.383 / 2.0 - result[0], 16.383 / 2.0 - result[1], 16.383 / 2.0 - result[2], 16.383 / 2.0 - result[3]); //List<double[]> fitpoints = new List<double[]>(oldRBF.OriginalFitPoints); List<double[]> fitpoints = new List<double[]>(GAPnts); if (RemoveExtraFitPoints) { fitpoints.RemoveAt(1); fitpoints.RemoveAt(2); } RBFCurve GaRBF = new RBFCurve(null, "GA RBF", fitpoints, GeneticBasis, new Linear(null), 0.0); NPlot.Windows.PlotSurface2D plotter = (NPlot.Windows.PlotSurface2D)plot; plotter.Clear(); plotter.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed; //Add a background grid for better chart readability. NPlot.Grid grid = new NPlot.Grid(); grid.VerticalGridType = NPlot.Grid.GridType.Coarse; grid.HorizontalGridType = NPlot.Grid.GridType.Coarse; grid.MinorGridPen = new Pen(Color.Blue, 1.0f); grid.MajorGridPen = new Pen(Color.LightGray, 1.0f); plotter.Add(grid); int length = oldRBF.FitPoints.Count * 5; //Create a step plot instance for the balance chart. LinePlot speed = new LinePlot(); LinePlot speed2 = new LinePlot(); PointPlot pplot = new PointPlot(); PointPlot pplot2 = new PointPlot(); pplot2.Marker = new Marker(Marker.MarkerType.Cross1, 10, System.Drawing.Color.Red); speed.Pen = new Pen(Color.Blue, 1); //Create the lists from which to pull data. List<Int32> countaxis = new List<Int32>(); List<Int32> Pplotcountaxis = new List<Int32>(); List<Int32> Pplotcountaxis2 = new List<Int32>(); List<decimal> speedlist = new List<decimal>(); List<decimal> speedlist2 = new List<decimal>(); for (int i = 0; i < length; i++) countaxis.Add(i); for (int i = 0; i < oldRBF.FitPoints.Count; i++) Pplotcountaxis.Add((int)oldRBF.OriginalFitPoints[i][0]); for (int i = 0; i < GaRBF.FitPoints.Count; i++) Pplotcountaxis2.Add((int)GaRBF.OriginalFitPoints[i][0]); //Populate the balanceAmount list double[] pnt; List<decimal> pointsList = oldRBF.OriginalFitPoints.ConvertAll(new Converter<double[], decimal>((double[] dd) => { return Convert.ToDecimal(dd[1]); })); List<decimal> pointsList2 = GaRBF.OriginalFitPoints.ConvertAll(new Converter<double[], decimal>((double[] dd) => { return Convert.ToDecimal(dd[1]); })); for (int i = 0; i < length; i++) { pnt = new double[] { (double)i, 0 }; oldRBF.Value(ref pnt); speedlist.Add(Convert.ToDecimal(pnt[1])); pnt = new double[] { (double)i, 0 }; GaRBF.Value(ref pnt); speedlist2.Add(Convert.ToDecimal(pnt[1])); } pplot.AbscissaData = Pplotcountaxis; pplot.DataSource = pointsList; pplot2.AbscissaData = Pplotcountaxis2; pplot2.DataSource = pointsList2; speed.AbscissaData = countaxis; speed.DataSource = speedlist; speed2.AbscissaData = countaxis; speed2.DataSource = speedlist2; //Add stepBalance to plotSurfaceBalance. plotter.Add(speed); plotter.Add(speed2); plotter.Add(pplot); plotter.Add(pplot2); //Balance plot general settings. plotter.ShowCoordinates = true; plotter.AutoScaleAutoGeneratedAxes = true; plotter.AddAxesConstraint(new AxesConstraint.AxisPosition(NPlot.PlotSurface2D.YAxisPosition.Left, 60)); plotter.YAxis1.Label = "Y"; plotter.YAxis1.LabelFont = new Font(this.Font, FontStyle.Bold); plotter.YAxis1.LabelOffsetAbsolute = true; plotter.XAxis1.Label = "X"; plotter.XAxis1.LabelFont = new Font(this.Font, FontStyle.Bold); plotter.YAxis1.LabelOffset = 40; plotter.XAxis1.HideTickText = false; plotter.Padding = 5; plotter.RightMenu = NPlot.Windows.PlotSurface2D.DefaultContextMenu; plotter.AddInteraction(new NPlot.Windows.PlotSurface2D.Interactions.AxisDrag(false)); plotter.AddInteraction(new NPlot.Windows.PlotSurface2D.Interactions.HorizontalDrag()); plotter.AddInteraction(new NPlot.Windows.PlotSurface2D.Interactions.VerticalDrag()); plotter.Title = GeneticBasis.ToString(); plotter.TitleFont = new Font(this.Font, FontStyle.Bold); //} //Refresh surfaces. plotter.Refresh(); } Application.DoEvents(); } }
public Form1() { InitializeComponent(); SetupWorkers(); InitializePlots(); InstatiatePlotData(); stat = ((string message) => { m_status.Text = message; }); Eval = new Evaluator((ref List<int> binaryCoded, ref List<int> bestChromo) => { if (binaryCoded.Count == 0) return 0; double error = 0; List<double[]> gaPnts = new List<double[]>(); double[] result = EvalChromosome(ref binaryCoded, ref gaPnts); CustomBasis GeneticBasis = new CustomBasis(16.383 / 2.0 - result[0], 16.383 / 2.0 - result[1], 16.383 / 2.0 - result[2], 16.383 / 2.0 - result[3]); double[] pnt1, pnt2, dx1, dx2; object curve = new object(); object plot = new object(); for (int j = 0; j < 1; j++) { switch (j + 1) { case 1: curve = p1Curve; plot = plotSurface2D1; break; case 2: curve = p2Curve; plot = plotSurface2D2; break; case 3: curve = p3Curve; plot = plotSurface2D3; break; case 4: curve = p4Curve; plot = plotSurface2D4; break; case 5: curve = p5Curve; plot = plotSurface2D5; break; case 6: curve = p6Curve; plot = plotSurface2D6; break; } RBFCurve oldRBF = curve as RBFCurve; //List<double[]> fitpoints = new List<double[]>(oldRBF.OriginalFitPoints); List<double[]> fitpoints = new List<double[]>(gaPnts); if (RemoveExtraFitPoints) { fitpoints.RemoveAt(1); fitpoints.RemoveAt(2); } RBFCurve GaRBF = new RBFCurve(null, "GA RBF", fitpoints, GeneticBasis, new Linear(null), 0.0); for (int i = 0; i < 30; i++) { dx1 = new double[2]; dx2 = new double[2]; pnt1 = new double[] { (double)i, 0 }; pnt2 = new double[] { (double)i, 0 }; GaRBF.First(ref pnt1, ref dx1); oldRBF.First(ref pnt2, ref dx2); error += Math.Pow(pnt1[1] - pnt2[1], 2); error += Math.Pow(Math.Pow(dx2[0] - dx1[0], 2) + Math.Pow(dx2[1] - dx1[1], 2), 2); } //int count = 0; double pntError = 1000; gaPnts.ForEach((pnt) => { dx1 = new double[2]; dx2 = new double[2]; pnt2 = new double[] { pnt[0], pnt[1] }; GaRBF.First(ref pnt, ref dx1); oldRBF.First(ref pnt, ref dx2); error += 10 * Math.Pow(pnt2[1] - pnt[1], 2); //error += Math.Pow(Math.Pow(dx2[0] - dx1[0], 2) + Math.Pow(dx2[1] - dx1[1], 2), 2); }); //gaPnts.ForEach((pnt) => // { // if (oldRBF.OriginalFitPoints.Find((Oldpnt) => { return Oldpnt[0] == pnt[0] && Oldpnt[1] == pnt[1]; }) != null) // count++; // else // error *= 4; // }); //if(count != 0) // pntError /= ((double)count / 5.0) * 1000.0; error += pntError; } return Math.Pow(error, -1); }); }