Имея начальный базис, составляем симплекс таблицу для нулевой итерации.
Итерация | Базисная переменная | Значение | у1 | у2 | у3 | у4 | у5 |
0 | у3 | 8 | 1 | 2 | 1 | 0 | 0 |
У4 | 12 | 4 | 1 | 0 | 1 | 0 | |
У5 | 7 | 2 | 1 | 0 | 0 | 1 | |
-f | 0 | 4 | 2 | 0 | 0 | 0 |
Вводим в базис у1 , а выводим из базиса у4.
Итерация | Базисная переменная | Значение | у1 | у2 | у3 | у4 | у5 |
1 | У3 | 5 | 0 | 1,75 | 1 | -0,25 | 0 |
У1 | 3 | 1 | 0,25 | 0 | 0,25 | 0 | |
У5 | 1 | 0 | 0,5 | 0 | -0,5 | 1 | |
-f | -12 | 0 | 1 | 0 | -1 | 0 |
Вводим в базис у2 , а выводим из базиса у5.
Итерация | Базисная переменная | Значение | у1 | у2 | у3 | у4 | у5 |
2 | У3 | 1,5 | 0 | 0 | 1 | -2 | -3,5 |
У1 | 2,5 | 1 | 0 | 0 | 0,5 | -0,5 | |
У2 | 2 | 0 | 1 | 0 | -1 | 2 | |
-f | -14 | 0 | 0 | 0 | 0 | -2 |
Т.к. f<0, то останавливаемся на второй итерации.
Исходя из графика ОДЗ, можно определить, что оптимальным решением является отрезок прямой
, входящий вОДЗ, проверим: 2,5*2+2=7.
x1 = 2,5, x2 = 2 f(x)=14.
Заключение
Целью данного курсового проекта было изучение методов оптимизации функции. Методов одномерной оптимизации: метод дихотомии, золотого сечения; многомерной безусловной оптимизации: покоординатный циклический спуск, метод Хука – Дживса, правильный симплекс, деформированный симплекс, а также методов условной оптимизации Метод преобразования целевой функции, метод штрафных функций, табличный симплекс – метод.
Список используемой литературы
1. А.Г.Трифонов. Постановка задачи оптимизации и численные методы ее решения;
2. Б. Банди. Методы оптимизации. Вводный курс., 1988;
3. Мендикенов К.К. Лекции
Приложение А
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace lab1
{
public partial class Form1 : Form
{
class global
{
private global() { }
public static double a = 0.64;
public static double b = 1.77;
public static double e = 0.0001;
public static double al = 0.00001;
public static double x = 0;
public static double y = 0;
public static int iter = 0;
}
public Form1()
{ InitializeComponent(); }
private void textBox1_TextChanged(object sender, EventArgs e)
{global.e = Convert.ToDouble(textBox1.Text); }
private void textBox2_TextChanged(object sender, EventArgs e)
{ global.al = Convert.ToDouble(textBox2.Text); }
public double F(double x)
{ return (Math.Pow((2.5 - x), 2) + 3.1 * x); }
public double Z(double x, double y)
{ return (2.5 * Math.Pow(x, 2) + 2 * x * y + 3.1 * Math.Pow(y, 2) -2* x-3*y); }
public double Dixotom()
{
global.iter = 1;
global.a = Convert.ToDouble(textBox4.Text);
global.b = Convert.ToDouble(textBox3.Text);
richTextBox1.Text = richTextBox1.Text+"a="+Convert.ToString(global.a)+"; b="+Convert.ToString(global.b)+(char)13;
while (true)
{
double x1 = (global.a+global.b)/2-global.al;
double x2 = (global.a + global.b) / 2 + global.al;
if (F(x1) < F(x2)) global.b = x2; else global.a = x1;
richTextBox1.Text = richTextBox1.Text + Convert.ToString(global.iter) + ") x1=" + Convert.ToString(x1) + "; x2=" + Convert.ToString(x2) + "; f(x1)=" + Convert.ToString(F(x1)) + "; f(x2)=" + Convert.ToString(F(x2)) + "; a=" + Convert.ToString(global.a) + "; b=" + Convert.ToString(global.b) + (char)13;
global.iter++;
if (Math.Abs(global.b - global.a) < global.e) break;
} return (global.a + global.b) / 2;
}
public double Zolot()
{ global.iter = 1;
global.a = Convert.ToDouble(textBox4.Text);
global.b = Convert.ToDouble(textBox3.Text);
richTextBox1.Text = richTextBox1.Text + "a=" + Convert.ToString(global.a) + "; b=" + Convert.ToString(global.b) + (char)13;
double x2 = global.a+0.618*(global.b - global.a) ;
double x1 = global.a + (1-0.618) * (global.b - global.a);
while (true)
{
if (Math.Abs(global.b - global.a) < global.e) break;
richTextBox1.Text = richTextBox1.Text + Convert.ToString(global.iter) + ") a=" + Convert.ToString(global.a) + "; b=" + Convert.ToString(global.b) + "; x1=" + Convert.ToString(x1) + "; x2=" + Convert.ToString(x2) + "; f(x1)=" + Convert.ToString(F(x1)) + "; f(x2)=" + Convert.ToString(F(x2)) + (char)13;
if (F(x2) > F(x1))
{ global.b = x2; x2 = x1; x1 = global.a + 0.372 * (global.b - global.a); }
else { global.a = x1; x1 = x2; x2 = global.a + 0.618 * (global.b - global.a); }
global.iter++;
}
return (global.a + global.b) / 2;
}
private void button1_Click(object sender, EventArgs e)
{ richTextBox1.Text = "";
global.al = Convert.ToDouble(textBox2.Text);
global.e = Convert.ToDouble(textBox1.Text);
if (radioButton1.Checked) global.x = Dixotom();
if (radioButton2.Checked) global.x = Zolot();
label2.Text = "Минимум: x*=" + Convert.ToString(global.x) + "; y(x*)=" + Convert.ToString(F(global.x)) + ", число итераций: "+Convert.ToString(global.iter-1);
}
public void Spusk(double x,double y)
{
while (true)//идем вправо
{ x = x + global.al; if (Z(x, y) > Z(x - global.al, y)) break; global.iter++;
richTextBox2.Text = richTextBox2.Text + Convert.ToString(global.iter)+ ") x=" + Convert.ToString(x) + "; y=" + Convert.ToString(y) + "; z(x,y)=" + Convert.ToString(Z(x, y)) + "; al=" + Convert.ToString(global.al) + (char)13;
x = x - global.al;//возвращаемся на неудачный шаг
while (true)//идем влево
{ x = x - global.al; if (Z(x, y) > Z(x + global.al, y)) break; global.iter++;
richTextBox2.Text = richTextBox2.Text + Convert.ToString(global.iter) + ") x=" + Convert.ToString(x) + "; y=" + Convert.ToString(y) + "; z(x,y)=" + Convert.ToString(Z(x, y)) + "; al=" + Convert.ToString(global.al) + (char)13; }
x = x + global.al;//возвращаемся на неудачный шаг
global.x=x; global.y=y;
SpuskV(x, y);
}
public void SpuskV(double x, double y)
{
while (true)//идем вверх
{ y = y + global.al; if (Z(x, y) > Z(x, y - global.al)) break; global.iter++;
richTextBox2.Text = richTextBox2.Text + Convert.ToString(global.iter) + ") x=" + Convert.ToString(x) + "; y=" + Convert.ToString(y) + "; z(x,y)=" + Convert.ToString(Z(x, y)) + "; al=" + Convert.ToString(global.al) + (char)13; }
y = y - global.al;//возвращаемся на неудачный шаг
while (true)//идем вниз
{ y = y - global.al; if (Z(x, y) > Z(x, y + global.al)) break; global.iter++;
richTextBox2.Text = richTextBox2.Text + Convert.ToString(global.iter) + ") x=" + Convert.ToString(x) + "; y=" + Convert.ToString(y) + "; z(x,y)=" + Convert.ToString(Z(x, y)) + "; al=" + Convert.ToString(global.al) + (char)13; }
y = y + global.al;//возвращаемся на неудачный шаг
global.x = x; global.y = y;
if (global.al/2 > global.e) { global.al = global.al / 2; Spusk(x, y); }
}
public void Hyg(double x, double y)
{ while (true)
{int min=Vibor(x, y);
if (min == 1) { x = x + 2 * global.e; y = y + 2 * global.e; if (Z(x - 2 * global.e, y - 2 * global.e) < Z(x, y)) break; }
if (min == 2) { x = x - 2 * global.e; y = y + 2 * global.e; if (Z(x + 2 * global.e, y - 2 * global.e) < Z(x, y)) break; }
if (min == 3) { x = x - 2 * global.e; y = y - 2 * global.e; if (Z(x + 2 * global.e, y + 2 * global.e) < Z(x, y)) break; }
if (min == 4) { x = x + 2 * global.e; y = y - 2 * global.e; if (Z(x - 2 * global.e, y + 2 * global.e) < Z(x, y)) break; }
global.iter++;
richTextBox2.Text = richTextBox2.Text + Convert.ToString(global.iter) + ") x=" + Convert.ToString(x) + "; y=" + Convert.ToString(y) + "; z(x,y)=" + Convert.ToString(Z(x, y)) +(char)13; }
global.x = x; global.y = y;
}
public int Vibor(double x, double y)
{ int min = 0;
if (Z(x + global.e, y + global.e) < Z(x, y)) min = 1;
if (Z(x + global.e, y - global.e) < Z(x, y)) min = 2;
if (Z(x - global.e, y - global.e) < Z(x, y)) min = 3;
if (Z(x - global.e, y + global.e) < Z(x, y)) min = 4;
return min; }
public void Sym(double x, double y)
{ double x0 = x; double y0 = y; double x1 = x0 + global.al; double y1 = y0;
double x2 = x0 + (global.al) / 2; double y2 = y0 + global.al * Math.Sin(60);
richTextBox2.Text = richTextBox2.Text + Convert.ToString(global.iter) + ") z(x0,y0)=" + Convert.ToString(Z(x0, y0)) + " z(x1,y1)=" + Convert.ToString(Z(x1, y1)) + " z(x2,y2)=" + Convert.ToString(Z(x2, y2)) + " al=" + Convert.ToString(global.al) + (char)13;
while (true)
{ //поиск наименьшего
double mx0 = x0; double my0 = y0; double mx1 = x1; double my1 = y1; double mx2 = x2; double my2 = y2;
double z1 = Z(mx0, my0); double z2 = Z(mx1, my1); double z3 = Z(mx2, my2);
if ((z1 < z2) && (z2 < z3) && (z3 > z1)) { x0 = mx0; x1 = mx1; x2 = mx2; y0 = my0; y1 = my1; y2 = my2; }
if ((z1 < z2) && (z2 > z3) && (z3 > z1)) { x0 = mx0; x1 = mx2; x2 = mx1; y0 = my0; y1 = my2; y2 = my1; }
if ((z1 > z2) && (z2 < z3) && (z3 < z1)) { x0 = mx1; x1 = mx2; x2 = mx0; y0 = my1; y1 = my2; y2 = my0; }
if ((z1 > z2) && (z2 < z3) && (z3 > z1)) { x0 = mx1; x1 = mx0; x2 = mx2; y0 = my1; y1 = my0; y2 = my2; }
if ((z1 < z2) && (z2 > z3) && (z3 < z1)) { x0 = mx2; x1 = mx0; x2 = mx1; y0 = my2; y1 = my0; y2 = my1; }
if ((z1 > z2) && (z2 > z3) && (z3 < z1)) { x0 = mx2; x1 = mx1; x2 = mx0; y0 = my2; y1 = my1; y2 = my0; }
//проверка на выход
if (global.al <= global.e) break;
while (true)
{ //отражение относительно 3
double kx= (x0+x1)-x2; double ky = (y0 + y1) - y2;
if (Z(x2, y2) > Z(kx, ky)) { x2 = kx; y2 = ky; global.iter++; break; }
//отражение относительно 2
kx = (x0 + x2) - x1; ky = (y0 + y2) - y1;
if (Z(x1, y1) > Z(kx, ky)) { x1 = kx; y1 = ky; global.iter++; break; }
//отражение относительно 1
kx = (x1 + x2) - x0; ky = (y1 + y2) - y0;
if (Z(x0, y0) > Z(kx, ky)) { x0 = kx; y0 = ky; global.iter++; break; }
//уменьшаем треугольник
global.al = global.al / 2;
x1 = (x0 + x1) / 2; y1 = (y0 + y1) / 2;
x2 = (x0 + x2) / 2; y2 = (y0 + y2) / 2;
}
richTextBox2.Text = richTextBox2.Text + Convert.ToString(global.iter) + ") x0=" + Convert.ToString(x0) + " x1=" + Convert.ToString(x1) + " x2=" + Convert.ToString(x2) + "; y0=" + Convert.ToString(y0) + " y1=" + Convert.ToString(y1) + " y2=" + Convert.ToString(y2) + " z(x0,y0)=" + Convert.ToString(Z(x0, y0)) + " z(x1,y1)=" + Convert.ToString(Z(x1, y1)) + " z(x2,y2)=" + Convert.ToString(Z(x2, y2)) + " al=" + Convert.ToString(global.al) + (char)13; }
global.x = x0; global.y = y0; }
private void button2_Click(object sender, EventArgs e)
{ global.iter = 0;
global.al = Convert.ToDouble(textBox7.Text);
global.e = Convert.ToDouble(textBox8.Text);
if (radioButton4.Checked) {Spusk(Convert.ToDouble(textBox6.Text),Convert.ToDouble(textBox5.Text)); }
if (radioButton3.Checked)
Hyg(Convert.ToDouble(textBox6.Text), Convert.ToDouble(textBox5.Text));
if (radioButton5.Checked) Sym(Convert.ToDouble(textBox6.Text), Convert.ToDouble(textBox5.Text));
label9.Text = "Минимум: (" + Convert.ToString(global.x) + ";" + Convert.ToString(global.y) + " f(x,y)=" + Convert.ToString(Z(global.x, global.y)) + "), число итераций: " + Convert.ToString(global.iter); } }}
Приложение Б
procedure TForm1.Button1Click(Sender: TObject);
begin
a:=false;
l:=0.05;
al:=1; e:=0.01; gm:=2; bt:=0.5;
x:=1.16166; y:= 1.15185;
iter:=0;
xl:= x; yl:= y; xg:= xl + l; yg:= yl;
xh:= xl + l / 2; yh:= yl + l * Sin(60);
Sym(x,y);
ZZ(x,y); //считаем значение функции в найденной точке
end;
procedure TForm1.Sym(x,y:real);
label
ext,B;
begin
//поиск наименьшего
B: mx0:= xl; my0:= yl; mx1:= xg; my1:= yg; mx2:= xh; my2:= yh;
ZZ(mx0, my0); z1:=z; ZZ(mx1, my1); z2:=z; ZZ(mx2, my2); z3:=z;
if ((z1 < z2) and (z2 < z3) and (z3 > z1)) then begin xl:= mx0; xg:= mx1; xh:= mx2; yl:= my0; yg:= my1; yh:= my2; end;
if ((z1 < z2) and (z2 > z3) and (z3 > z1)) then begin xl:= mx0; xg:= mx2; xh:= mx1; yl:= my0; yg:= my2; yh:= my1; end;
if ((z1 > z2) and (z2 < z3) and (z3 < z1)) then begin xl:= mx1; xg:= mx2; xh:= mx0; yl:= my1; yg:= my2; yh:= my0; end;
if ((z1 > z2) and (z2 < z3) and (z3 > z1)) then begin xl:= mx1; xg:= mx0; xh:= mx2; yl:= my1; yg:= my0; yh:= my2; end;
if ((z1 < z2) and (z2 > z3) and (z3 < z1)) then begin xl:= mx2; xg:= mx0; xh:= mx1; yl:= my2; yg:= my0; yh:= my1; end;
if ((z1 > z2) and (z2 > z3) and (z3 < z1)) then begin xl:= mx2; xg:= mx1; xh:= mx0; yl:= my2; yg:= my1; yh:= my0; end;
Richedit1.Lines.Add(IntToStr(iter));
Richedit1.Lines.Add(FloatToStr(xl)+' '+FloatToStr(yl)+' '+FloatToStr(zl));
Richedit1.Lines.Add(FloatToStr(xg)+' '+FloatToStr(yg)+' '+FloatToStr(zg));
Richedit1.Lines.Add(FloatToStr(xh)+' '+FloatToStr(yh)+' '+FloatToStr(zh));
Richedit1.Lines.Add('');
x0:=(xl+xg)/2; y0:=(yl+yg)/2;
xr:=(1+al)*x0-al*xh; yr:=(1+al)*y0-al*yh;
ZZ(xl,yl); zl:=z; ZZ(xg,yg); zg:=Z; ZZ(xh,yh); zh:=z; ZZ(xr,yr); zr:=z;