public static void tools() { Dictionary <string, string> tools = new Dictionary <string, string>(); tools.Add("添加因素点", "ga.addspotui()"); tools.Add("删除因素点", "ga.delspotui()"); tools.Add("确定样本点数", "ppsp.nsamples()"); tools.Add("运行分析", "ppsp.run()"); tools.Add("重置分析", "ga.resetgrid()"); tools.Add("重置网格", "ga.readygrid()"); tools.Add("关闭网格", "ga.hidegrid()"); PyCmd.toolbox("工具箱", tools); GridAnalysis.init(); }
public static void pickpoints() { UserInput.pause("即将进行分等定级。"); int levelCount = Gui.InputBox("级别数量", "5").TryParseToInt32(); var values = GridAnalysis.valuecache.Values.OrderBy(x => x).ToList(); List <List <double> > grades = null; List <double> borderValues = null; if (UserInput.option("选择分等定级算法。", "值域均分法", "动态聚类法") == 0) { double max = values.Max(); double min = values.Min(); double delta = (max - min) / levelCount; borderValues = Enumerable.Range(0, levelCount).Select(i => min + i * delta).ToList(); borderValues.Add(max + 0.001 * delta); grades = borderValues.PairwiseSelect((x, y) => values.Where(z => x <= z && z < y).ToList()).ToList(); GradeTheme gt = new GradeTheme("value", borderValues); MapControl.Current.GridLayer.ApplyColorTheme(gt); } else { var steps = Enumerable.Range(0, 5).ToList(); steps.Add(1000); foreach (var step in steps) { var result = Dreambuild.Mathematics.DynamicGrading.Perform(values, levelCount, step); grades = result.Item1; borderValues = result.Item2; GradeTheme gt = new GradeTheme("value", borderValues); MapControl.Current.GridLayer.ApplyColorTheme(gt); UserInput.pause(string.Format("已进行第 {0} 步聚类。", result.Item3)); } } UserInput.pause("即将确定样本容量。"); int totalSampleCount = Gui.InputBox("总样本点数", "100").TryParseToInt32(); var Es = grades.Select(x => x.StandardDeviation()).ToList(); var Hs = grades.Select(x => x.Sum()).ToList(); var EHs = Es.Zip(Hs, (e, h) => e * h).ToList(); double EHSum = EHs.Sum(); var proportions = EHs.Select(x => x / EHSum).ToList(); var sampleCounts = proportions.Select(x => (int)Math.Ceiling(x * totalSampleCount)).ToArray(); var symbolValues = borderValues.PairwiseSelect((x, y) => (x + y) / 2).ToArray(); UserInput.pause(string.Format("各级别样本点数:{0}\n各级别标志分值:{1}", string.Join(", ", sampleCounts), string.Join(", ", symbolValues.Select(x => x.ToString("0.00")).ToArray()))); UserInput.pause("即将开始选点。"); if (UserInput.option("选择选点算法。", "多重因素法", "单一因素法") == 0) { Random rand = new Random(0); Enumerable.Range(0, levelCount).ForEach(i => { var cells = GridAnalysis.valuecache.Where(z => borderValues[i] <= z.Value && z.Value < borderValues[i + 1]).Select(z => z.Key).ToList(); var searches = Enumerable.Range(0, 1000).Select(x => { var pts = Enumerable.Range(0, sampleCounts[i]).Select(j => cells[rand.Next(0, cells.Count - 1)]).ToList(); return(System.Tuple.Create(pts, GridAnalysis.evaluate(pts, symbolValues[i]))); }).ToList(); var target = searches.First(x => x.Item2 == searches.Min(y => y.Item2)); target.Item1.ForEach(p => GridAnalysis.markcell(p)); }); } else { Enumerable.Range(0, levelCount).ForEach(i => { var cells = GridAnalysis.valuecache.Where(z => borderValues[i] <= z.Value && z.Value < borderValues[i + 1]).Select(z => z.Key).ToList(); var targets = cells.OrderBy(p => Math.Abs(GridAnalysis.valuecache[p] - symbolValues[i])).Take(sampleCounts[i]).ToList(); targets.ForEach(p => GridAnalysis.markcell(p)); }); } }
public static void run() { GridAnalysis.clearmark(); GridAnalysis.readygrid(); PPSP.pickpoints(); }