close

Вход

Забыли?

вход по аккаунту

?

Отчет 4

код для вставкиСкачать
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
БАРАНОВИЧСКИЙ ГОСУДАРСВЕННЫЙ УНИВЕРСИТЕТ
ИНЖЕНЕРНЫЙ ФАКУЛЬТЕТ
КАФЕДРА ИНФОРМАЦИОННЫХ СИСТЕМ И ТЕХНОЛОГИЙ
Лабораторная работа №4
Вариант 1
По дисциплине: "Оптимизация проектных решений"
Тема: Метод Штрафных функций"
Выполнил: студент 4 курса,
Группы ИСТ-42
Борель Сергей
Проверила: преподаватель
Мазалевич О.Д.
Барановичи 2013
Лабораторная работа № 4
МЕТОД ШТРАФНЫХ ФУНКЦИЙ
Цель работы: Изучение метода штрафных функций для поиска условного экстремума при использовании локальных методов оптимизации.
Задание:
1. Для метода Хука-Дживса, реализованного в лабораторной работе № 3, разработать программу поиска экстремума с учетом ограничений, т.е. реализовать возможность генерации стартовой точки в недопустимой области решений.
2. Осуществить 3-4 запуска программы из различных точек с разным шагом. Окончание процесса поиска аналогично прекращению поиска в методе Хука-Дживса.
3. Нанести на график с линиями уровней стартовую точку, траекторию поиска и найденную точку с минимальным значением функции.
Результаты:
Решение:
namespace lab_3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public Graphics g;
double x1min, x2max, x1max, x2min;
double es, dh, x0, y0, result, it,t,h;
bool flag=true;
double[,] mas = new double[3, 100];
private float scale, scalex1, scalex2;
public void drawExt(double x1, double x2)
{
Pen pen2 = new Pen(System.Drawing.Brushes.Black, 2);
g.FillEllipse(System.Drawing.Brushes.Black, (float)(x1 * scale + scalex1 - 3), (float)(x2 * -scale - scalex2 - 3), (float)6, (float)6);
}
public double fun(double x, double y)
{
double results;
results = (Math.Pow((x - 2), 2)) + (Math.Pow((y - 1), 2));
return results;
}
private double ogr(double x1, double x2)
{
double y = 0;
if ((x1 - 2 * x2 + 1) <= 0) y = y + 3 * Math.Abs(x1 - 2 * x2 + 1);
if ((-0.25 * x1 * x1 - x2 * x2 + 1) <= 0) y = y + 3 * Math.Abs(-0.25 * x1 * x1 - x2 * x2 + 1);
return y;
}
private void Form1_Load(object sender, EventArgs e)
{
textBox1.Text = "-1";
textBox2.Text = "-1";
textBox3.Text = "4";
textBox4.Text = "4";
textBox5.Text = "0,5";
textBox6.Text = "0,001";
textBox7.Text = "1";
textBox8.Text = "1";
}
private void button1_Click(object sender, EventArgs e)
{
int k = 0;
x0 = Convert.ToDouble(textBox7.Text);
y0 = Convert.ToDouble(textBox8.Text);
x1min = Convert.ToDouble(textBox1.Text);
x2min = Convert.ToDouble(textBox2.Text);
x1max = Convert.ToDouble(textBox3.Text);
x2max = Convert.ToDouble(textBox4.Text);
dh = Convert.ToDouble(textBox5.Text);
es = Convert.ToDouble(textBox6.Text);
mas[0, k] = fun(x0, y0) + ogr(x0, y0);
mas[1, k] = x0;
mas[2, k] = y0;
result = fun(x0, y0) + ogr(x0, y0);
while(flag)
{
result = fun(x0, y0)+ogr(x0,y0);
if (result > (fun(x0 + dh, y0) + ogr(x0+dh, y0)))
x0 = x0 + dh;
else if (result > (fun(x0 - dh, y0) + ogr(x0-dh, y0)))
x0 = x0 - dh;
if (result > (fun(x0, y0+dh)+ogr(x0,y0+dh)))
y0 = y0 + dh;
else if (result > (fun(x0, y0 - dh) + ogr(x0, y0-dh)))
y0 =y0 - dh;
it = fun(x0, y0) + ogr(x0, y0);
if (Math.Abs(it - result) < es || dh < es) flag = false;
else if (it == result) dh = dh / 2;
else if (x0 - dh <= x1min || y0 - dh <= x2min || x0 + dh >= x1max || y0 + dh >= x2max) dh = dh / 2;
k++;
mas[0, k] = fun(x0, y0) + ogr(x0, y0);
mas[1, k] = x0;
mas[2, k] = y0; }
richTextBox1.Text += "fun [ " + Convert.ToString(x0) + " , " + Convert.ToString(y0) + " ] = ";
richTextBox1.Text += Convert.ToString(result);
t = x0;
h = y0;
scale = (float)(grafArea.Height / (x2max - x2min + 2));
scalex1 = (float)(0 - x1min) * scale;
scalex2 = (float)(0 - x2min) * scale;
g = grafArea.CreateGraphics();
g.Clear(Color.White);
int sm = 25; g.TranslateTransform(sm, grafArea.Height - sm);
g.ScaleTransform((float)1, (float)1);
g.FillRectangle(System.Drawing.Brushes.SkyBlue, 0, 0, grafArea.Width, sm);
g.FillRectangle(System.Drawing.Brushes.White, 0, -grafArea.Height + sm - 5, grafArea.Width, sm);
g.FillRectangle(System.Drawing.Brushes.SkyBlue, -sm, -grafArea.Height + sm - 5, sm, grafArea.Height);
Pen pen = new Pen(System.Drawing.Brushes.Black, 3);
Font f = new Font("Courier New", 9, FontStyle.Bold);
pen.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;
g.DrawLine(pen, 0, 0, 0, -grafArea.Height + 40);
g.DrawLine(pen, 0, 0, grafArea.Width - 40, 0);
g.DrawString("x1", f, System.Drawing.Brushes.Black, grafArea.Width - 50, 0);
g.DrawString("x2", f, System.Drawing.Brushes.Black, -sm + 5, -grafArea.Height + 40);
Pen pen2 = new Pen(System.Drawing.Brushes.Black, 1);
for (double i = x1min; i <= x1max; i++)
{
float x1 = (float)(i * scale);
g.DrawString(i.ToString(), f, System.Drawing.Brushes.Black, x1 + scalex1, 0);
g.DrawLine(pen2, x1 + scalex1, -3, x1 + scalex1, 3);
}
for (double i = x2min; i <= x2max; i++)
{
float x2 = (float)i * scale;
g.DrawString(i.ToString(), f, System.Drawing.Brushes.Black, -sm + 5, -x2 - scalex2);
g.DrawLine(pen2, -3, -x2 - scalex2, 3, -x2 - scalex2);
}
for (double i = x2min; i <= x2max * 2; i += h)
{
float x2 = (float)i * scale;
g.DrawLine(pen2, x2 + scalex1, -grafArea.Height + sm, x2 + scalex1, 0);
}
for (double i = x1min; i <= x1max * 2; i += h)
{
float x1 = (float)(i * scale);
g.DrawLine(pen2, grafArea.Width, -x1 - scalex2, 0, -x1 - scalex2);
}
for (int i = 0; i <= k; i++)
drawExt(mas[1, i], mas[2, i]);
}
Выводы: Изучил метод штрафных функций для поиска условного экстремума при использовании локальных методов оптимизации.
Документ
Категория
Рефераты
Просмотров
30
Размер файла
576 Кб
Теги
лабораторная работа, лаба, отчет, лабораторная
1/--страниц
Пожаловаться на содержимое документа