public static Placement Create(Task task, List<Vector2d> objects_sizes) { if (task != null) { Placement placement = new Placement(); placement.task = task; if (double.IsPositiveInfinity(task.RegionWidth)) placement.region_size.X = 0; else placement.region_size.X = task.RegionWidth; if (double.IsPositiveInfinity(task.RegionHeight)) placement.region_size.Y = 0; else placement.region_size.Y = task.RegionHeight; placement.objects_sizes = objects_sizes; placement.sort = new List<int>(); placement.objects_busy_numbers = new List<int>(); placement.objects_free_numbers = new List<int>(); placement.objects_busy_points = new List<Point2d>(); placement.objects_busy_square = 0; placement.object_function = double.NaN; return placement; } else return null; }
public FormTask() { InitializeComponent(); task = new Task(); cbTaskIndex.SelectedIndex = 0; }
private void miStatistic_Click(object sender, EventArgs e) { if (form_placement_opt != null && !form_placement_opt.IsDisposed) form_placement_opt.Close(); if (form_placement_last != null && !form_placement_last.IsDisposed) form_placement_last.Close(); Random rand = new Random(); FormTemp form_temp = new FormTemp() { Text = "Введите количество опытов:", Width = ClientSize.Width }; form_temp.ShowDialog(this); try { int count_of_oput = int.Parse(form_temp.String); StreamWriter sw = new StreamWriter(this.task.TaskIndex.ToString() + ".stc"); sw.Close(); for (int i_of_oput = 0; i_of_oput < count_of_oput; i_of_oput++) { // Количество итераций метода значимых переменных при одном размещении. int count_of_mzp = rand.Next(1, 10); // Количество всех итераций метода значимых переменных. int count_of_iteration = rand.Next(1, 10); // Количество объектов (не больше 50). int count_of_objects = rand.Next(1, 50); // Размеры объектов от 10 до 110. float min_of_objects = 100 * (float)rand.NextDouble() + 10; float max_of_objects = 100 * (float)rand.NextDouble() + min_of_objects; // Размеры области от 10 до 1000. float min_of_region = 1000 * (float)rand.NextDouble() + 10; float max_of_region = 1000 * (float)rand.NextDouble() + min_of_objects; Task task = new Task(); // Создание объектов. for (int i = 0; i < count_of_objects; i++) task.ObjectsSizesAdd(0, new Vector2d { X = (max_of_objects - min_of_objects) * rand.NextDouble() + min_of_objects, Y = (max_of_objects - min_of_objects) * rand.NextDouble() + min_of_objects }); task.TaskIndex = this.task.TaskIndex; task.RegionWidth = (max_of_region - min_of_region) * (float)rand.NextDouble() + min_of_region; task.RegionHeight = (max_of_region - min_of_region) * (float)rand.NextDouble() + min_of_region; // Поиск методом случайного поиска. for (int i = 0; i < (count_of_mzp + 1) * count_of_iteration; i++) task.Calculate(true); double opt = task.PlacementOpt.ObjectFunction; task.TaskIndex = task.TaskIndex; task.NumberOfUpgrade = count_of_mzp; // Поиск методом случайного поиска + методом значимых переменных. for (int i = 0; i < count_of_iteration; i++) task.Calculate(true); double opt_mzp = task.PlacementOpt.ObjectFunction; #region Сохранение статистики. if (opt != 0 && !double.IsInfinity(opt) && !double.IsNaN(opt) && opt_mzp != 0 && !double.IsInfinity(opt_mzp) && !double.IsNaN(opt_mzp)) { sw = new StreamWriter(task.TaskIndex.ToString() + ".stc", true); int op = 0; if (opt / opt_mzp - 1 > 0) op = 1; if (opt / opt_mzp - 1 < 0) op = -1; sw.WriteLine("{0} {1} {2} {3} {4}", i_of_oput, opt, opt_mzp, opt / opt_mzp - 1, op); sw.Close(); } else i_of_oput--; #endregion } MessageBox.Show(this, "Статистика сохранена в файле " + this.task.TaskIndex.ToString() + ".stc.", "Информация"); } catch { } }