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