2. 分堆問題

數學bad

using System.Runtime.InteropServices;

namespace Q2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }


        private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
            var data = File.ReadAllText(openFileDialog1.FileName).Split("\r\n")
                            .Select(r => r.Split(' ').Select(double.Parse).ToList()).ToList();
            textBox1.Text = "";
            for (int i = 1; i < data.Count; i++)
            {
                textBox1.Text += (i - 1) + "\t" + string.Join("\t", data[i]);
                if (i != data.Count - 1) textBox1.Text += "\r\n";
            }
        }

        Random rd = new Random();
        private void button2_Click(object sender, EventArgs e)
        {
            var data = textBox1.Text.Split("\r\n").Select(r => r.Split('\t').Skip(1).Select(double.Parse).ToList()).ToList();

            double uh = data.Select(r => r[1]).Average();
            double uw = data.Select(r => r[0]).Average();
            double oh = data.Select(r => Math.Pow(r[1] - uh, 2)).Average();
            double ow = data.Select(r => Math.Pow(r[0] - uw, 2)).Average();

            double[] nhi = data.Select(r => (r[1] - uh) / oh).ToArray();
            double[] nwi = data.Select(r => (r[0] - uw) / ow).ToArray();


            List<List<int>> groups = new List<List<int>>();
            for (int i = 0; i < 3; i++)
            {
                groups.Add([]);
            }
            for (int i = 0; i < data.Count; i++)
            {
                if (i < 3)
                {
                    groups[i].Add(i);
                }
                else
                {
                    groups[rd.Next(3)].Add(i);
                }
            }

            for (int t = 0; t < 200; t++)
            {
                var ujwi = groups.Select(r => r.Select(v => data[v][0]).Average()).ToList();
                var ujhi = groups.Select(r => r.Select(v => data[v][1]).Average()).ToList();
                List<List<int>> re = [];
                for (int i = 0; i < 3; i++)
                {
                    re.Add([]);
                }

                for (int i = 0; i < groups.Count; i++)
                {
                    List<int>? s = groups[i];
                    s.ForEach(r =>
                            {
                                //var djih = Math.Sqrt(Math.Pow(data[r][1] - ujhi[i], 2));
                                //var djiw = Math.Sqrt(Math.Pow(data[r][0] - ujwi[i], 2));

                                var minGroup = -1;
                                var minDist = double.MaxValue;
                                for (int k = 0; k < 3; k++)
                                {
                                    var d = Math.Sqrt(Math.Pow(data[r][1] - ujhi[k], 2) + Math.Pow(data[r][0] - ujwi[k], 2));
                                    if (d < minDist)
                                    {
                                        minDist = d;
                                        minGroup = k;
                                    }
                                }

                                re[minGroup].Add(r);
                            });
                }

                var same = true;
                for (int i = 0; i < groups.Count; i++)
                {
                    List<int>? item = groups[i];
                    if (item.Count != re[i].Count)
                    {
                        same = false;
                        break;
                    }
                    for (int i1 = 0; i1 < item.Count; i1++)
                    {
                        int j = item[i1];
                        if ((j != re[i][i1]))
                        {
                            same = false;
                            break;
                        }
                    }
                    if (!same) break;
                }

                if (same) break;
                groups = re;
            }

            Dictionary<int, int> map = [];
            for (int i = 0; i < groups.Count; i++)
            {
                List<int>? item = groups[i];
                foreach (var item1 in item)
                {
                    map[item1] = i;
                }
            }

            textBox2.Text = "";
            textBox3.Text = "";
            textBox4.Text = "";
            textBox5.Text = "";
            for (int i = 0; i < data.Count; i++)
            {
                var r = map[i];
                textBox2.Text += "第" + i + "筆屬於第" + r + "堆\r\n";
                (new[] { textBox3, textBox4, textBox5 }[r]).Text +=
                    i + "\t" + data[i][0] + "\t" + data[i][1]+"\r\n";
            }
        }

        private void label4_Click(object sender, EventArgs e)
        {

        }
    }
}

Last updated