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