Решение задач безусловной и условной оптимизации методом переменного многогранника Нелдера-Мида - C#
Формулировка задачи:
Помогите написать программу на C# для решения задач безусловной и условной оптимизации методом переменного многогранника Нелдера-Мида
Решение задачи: «Решение задач безусловной и условной оптимизации методом переменного многогранника Нелдера-Мида»
textual
Листинг программы
public Form2()
{
InitializeComponent();
}
private void button1_Click_1(object sender, EventArgs e)
{
double fxl, fxh, fxn, fcentr, fo, fr, fs, f1, f2, f3;
double a, q, w, r, t, p, z, c, О±, ОІ, Оі, Пѓ, Оµ;
О± = Convert.ToDouble(textBox27.Text);
ОІ = Convert.ToDouble(textBox28.Text);
Оі = Convert.ToDouble(textBox29.Text);
Оµ = Convert.ToDouble(textBox30.Text);
double[] s = new double[2];
double[] xl = new double[2];
double[] xh = new double[2];
double[] xn = new double[2];
double[] centrt = new double[2];
double[] ot = new double[2];
double[] ra = new double[2];
double[] m = new double[2];
double[] m2 = new double[2];
double[] m3 = new double[2];
xl[0] = Convert.ToDouble(textBox11.Text); // способ задания масивов и обращение к элементу масива
xl[1] = Convert.ToDouble(textBox10.Text);
a = Convert.ToDouble(textBox1.Text);
w = Convert.ToDouble(textBox3.Text);
p = Convert.ToDouble(textBox4.Text);
t = Convert.ToDouble(textBox5.Text);
z = Convert.ToDouble(textBox8.Text);
c = Convert.ToDouble(textBox9.Text);
xn[0] = Convert.ToDouble(textBox6.Text);
xn[1] = Convert.ToDouble(textBox2.Text);
xh[0] = Convert.ToDouble(textBox13.Text);
xh[1] = Convert.ToDouble(textBox12.Text);
fxl = 0;
fxn = 0;
fxh = 0;
two:
m = xl;
m2 = xn;
m3 = xh;
q = m[0];
r = m[1];
f1 = a * Math.Pow((q - w), z) + p * Math.Pow((r - t), c);// Math.Pow( число, степень)
q = m2[0];
r = m2[1];
f2 = a * Math.Pow((q - w), z) + p * Math.Pow((r - t), c);
q = m3[0];
r = m3[1];
f3 = a * Math.Pow((q - w), z) + p * Math.Pow((r - t), c);
if (f1 > f2 & f2 > f3) { xl = m3; xn = m2; xh = m; fxl = f3; fxn = f2; fxh = f1; textBox18.Text = fxl.ToString(); textBox17.Text = fxh.ToString(); textBox16.Text = fxn.ToString(); }
else
{
if (f1 > f3 & f3 > f2) { xl = m2; xn = m3; xh = m; fxl = f2; fxn = f3; fxh = f1; textBox18.Text = fxl.ToString(); textBox17.Text = fxh.ToString(); textBox16.Text = fxn.ToString(); }
else
{
if (f2 > f1 & f1 > f3) { xl = m3; xn = m; xh = m2; fxl = f3; fxn = f1; fxh = f2; textBox18.Text = fxl.ToString(); textBox17.Text = fxh.ToString(); textBox16.Text = fxn.ToString(); }
else
{
if (f2 > f3 & f3 > f1) { xl = m; xn = m3; xh = m2; fxl = f1; fxn = f3; fxh = f2; textBox18.Text = fxl.ToString(); textBox17.Text = fxh.ToString(); textBox16.Text = fxn.ToString(); }
else
{
if (f3 > f1 & f1 > f2) { xl = m2; xn = m; xh = m3; fxl = f2; fxn = f1; fxh = f3; textBox18.Text = fxl.ToString(); textBox17.Text = fxh.ToString(); textBox16.Text = fxn.ToString(); }
else { if (f3 > f2 & f2 > f1) { xl = m; xn = m2; xh = m3; fxl = f1; fxn = f2; fxh = f3; textBox18.Text = fxl.ToString(); textBox17.Text = fxh.ToString(); textBox16.Text = fxn.ToString(); } }
}
}
}
};
centrt[0] = (xl[0] + xn[0]) / 2;
centrt[1] = (xl[1] + xn[1]) / 2;
q = centrt[0];
r = centrt[1];
fcentr = a * Math.Pow((q - w), z) + p * Math.Pow((r - t), c);
Пѓ = Math.Pow((Math.Pow((fxl - fcentr + fxh - fcentr + fxn - fcentr), 2) / 3), 0.5);
if (Пѓ <= Оµ) { xl[0] = Math.Round(xl[0], 3); textBox33.Text = xl[0].ToString(); xl[1] = Math.Round(xl[1], 3); textBox32.Text = xl[1].ToString(); }
else
{// Выполнить отражение
ot[0] = centrt[0] + О± * (centrt[0] - xh[0]); ot[1] = centrt[1] + О± * (centrt[1] - xh[1]);
q = ot[0];
r = ot[1];
fo = a * Math.Pow((q - w), z) + p * Math.Pow((r - t), c);
if (fo <= fxl)
{//Выполним растяжение
ra[0] = centrt[0] + Оі * (ot[0] - centrt[0]); ra[1] = centrt[1] + Оі * (ot[1] - centrt[1]);
q = ra[0];
r = ra[1];
fr = a * Math.Pow((q - w), z) + p * Math.Pow((r - t), c);
if (fr < fxl) { xh = ra; goto two; } else { if (fr >= fxl) { xh = ot; fxh = fo; goto two; } }
}
else
{
if (fxn < fo & fo <= fxh)
{ //оператор сжатия
s[0] = centrt[0] + ОІ * (xh[0] - centrt[0]); s[1] = centrt[1] + ОІ * (xh[1] - centrt[1]); xh[0] = s[0]; xh[1] = s[1];
q = s[0];
r = s[1];
fs = a * Math.Pow((q - w), z) + p * Math.Pow((r - t), c);
fxh = fs; goto two;
}
else { if (fxl < fo & fo <= fxn) { xh = ot; fxh = fo; goto two; } else { if (fo > fxh) { m[0] = xl[0] + 0.5 * (m[0] - xl[0]); m[1] = xl[1] + 0.5 * (m[1] - xl[1]); m2[0] = xl[0] + 0.5 * (m2[0] - xl[0]); m2[1] = xl[1] + 0.5 * (m2[1] - xl[1]); m3[0] = xl[0] + 0.5 * (m3[0] - xl[0]); m3[1] = xl[1] + 0.5 * (m3[1] - xl[1]); goto two; } } }
};
}
label1.Text = "it's work";
}
private void button2_Click(object sender, EventArgs e)
{
Close();
}