4. 小明的機器人
namespace Q4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
double sign(double f)
{
return f >= 0 ? 1 : -1;
}
private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
openFileDialog1.ShowDialog();
textBox1.Text = File.ReadAllText(openFileDialog1.FileName);
}
List<double> W;
private void button1_Click(object sender, EventArgs e)
{
List<List<double>> xs = [];
List<double> y = [];
foreach (var item in textBox1.Text.Split("\r\n"))
{
var data = item.Split("\t").Select(double.Parse).ToList();
xs.Add(data[0..3]);
y.Add(data[3]);
}
int N = 0;
int iter = int.Parse(textBox2.Text);
var w = textBox4.Text.Split(";").Select(double.Parse).ToList();
double ita = double.Parse(textBox3.Text);
while (N < iter)
{
double E = 0;
for (int k = 0; k < xs.Count; k++)
{
List<double> x = xs[k];
var m = ita * (y[k] - sign(ff(x, w)));
w = w.Select((e, i) => x[i] * m + e).ToList();
E += 0.5 * Math.Pow(Math.Abs(y[k] - sign(x[k])), 2);
}
if (E == 0)
{
break;
}
N++;
}
W = w;
textBox5.Text = string.Join(" ; ", w.Select(e => $"{e:f2}"));
}
double ff(List<double> x, List<double> w)
{
return w.Select((e, i) => e * x[i]).Sum();
}
private void button2_Click(object sender, EventArgs e)
{
var d = textBox6.Text.Split(';').Select(double.Parse).ToList();
var s = sign(ff(d, W));
label9.Text = $"機器人向: {s} ({(s == -1 ? "右" : "左")})";
}
}
}
Last updated