- •Содержание
- •Введение
- •Задача нелинейного программирования
- •1.1 Постановка задачи
- •Метод оптимизации: Франка-Вульфа
- •1.2 Определение стационарных точек и их типа
- •1.3 Построение линий уровней, трехмерного графика целевой функции
- •1.4 Алгоритм решения задачи
- •1.6 Описание программного обеспечения
- •1.7 Руководство пользователя
- •1.8 Результаты выполнения программы
- •2 Задача линейного программирования
- •2.1 Постановка задачи
- •2.2 Графическое решение задачи
- •2.3 Аналитическое решение задачи
- •2.4 Решение задачи с использованием процедуры «поиск решения»
- •Список литературы
- •Приложение а. Листинг программного продукта
- •Приложение б. Презентация PowerPoint
Приложение а. Листинг программного продукта
using System;
using System.Windows.Forms;
namespace proga
{
public partial class Form1 : Form
{
private double a1, a2, b1, b2, d1, d2;
private double A1, A2, B1, B2, C1, C2, D1, D2;
private double eps;
private double x0, y0;
private double xL, yL;
private double gradX, gradY;
private double minX = 1000;
private double minY = 1000;
private double minF = 1000;
private double lyam;
private bool konec = true;
public int iter = 0;
private double k = 0.5;
private string mess = "";
private int dw = 1;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
a1 = Convert.ToDouble(textBox1.Text);
a2 = Convert.ToDouble(textBox2.Text);
b1 = Convert.ToDouble(textBox4.Text);
b2 = Convert.ToDouble(textBox5.Text);
d1 = Convert.ToDouble(textBox3.Text);
d2 = Convert.ToDouble(textBox6.Text);
A1 = Convert.ToDouble(textBox9.Text);
A2 = Convert.ToDouble(textBox10.Text);
B1 = Convert.ToDouble(textBox11.Text);
B2 = Convert.ToDouble(textBox12.Text);
C1 = Convert.ToDouble(textBox13.Text);
C2 = Convert.ToDouble(textBox14.Text);
D1 = Convert.ToDouble(textBox15.Text);
D2 = Convert.ToDouble(textBox16.Text);
x0 = Convert.ToDouble(textBox17.Text);
y0 = Convert.ToDouble(textBox18.Text);
xL = Convert.ToDouble(textBox17.Text);
yL = Convert.ToDouble(textBox18.Text);
eps = Convert.ToDouble(textBox20.Text);
konec = true;
listBox1.Items.Clear();
dw = 1;
while (konec == true)
{
x0 = xL;
y0 = yL;
grad(x0, y0);
for (double i = 0; i <= 10; i += 0.01)
for (double j = 0; j <= 9; j += 0.01)
{
simplex(i, j);
}
listBox1.Items.Add("Итерация " + Convert.ToString(dw));
listBox1.Items.Add(" Оптимальный план");
listBox1.Items.Add("minX = " + Convert.ToString(minX));
listBox1.Items.Add("minY = " + Convert.ToString(minY));
minF = 1000;
lyam = Math.Round(Math.Abs(lyambda()), 4);
if ((lyam < 1) && (lyam > 0))
{
xL = x0 + (minX - x0)*lyam;
yL = y0 + (minY - y0)*lyam;
}
else
{
double f0;
double f1;
f0 = our_func(x0, y0);
f1 = our_func(minX, minY);
if (f1 > f0)
{
xL = x0;
yL = y0;
}
else
{
xL = minX;
yL = minY;
}
}
xL = Math.Round(xL, 4);
yL = Math.Round(yL, 4);
listBox1.Items.Add(" Новые допустимые значения");
listBox1.Items.Add("X = " + Convert.ToString(xL) + " Y = " + Convert.ToString(yL));
listBox1.Items.Add("f( t + 1 ) = " + Convert.ToString(Math.Round(our_func(xL, yL), 4)));
listBox1.Items.Add("f( t ) = " + Convert.ToString(Math.Round(our_func(x0, y0),4)));
listBox1.Items.Add("| f ( t + 1 ) - f ( t ) | = " + Convert.ToString(Math.Round(Math.Abs(our_func(xL, yL) - our_func(x0, y0)),4)));
if (Math.Abs(our_func(xL, yL) - our_func(x0, y0)) < eps)
{
konec = false;
}
listBox1.Items.Add(" ");
dw++;
}
textBox7.Text = Convert.ToString(xL);
textBox8.Text = Convert.ToString(yL);
}
private double our_func(double y1, double y2)
{
double ret;
ret = a1*y1*y1 + a2*y1 + d1 + b1*y2*y2 + b2*y2 + d2;
return ret;
}
private double lyambda()
{
double ret;
if ((minX == x0) && (minY == y0)) return 0;
ret =
-((a1*2*x0*(minX - x0) + a2*(minX - x0) + 2*b1*y0*(minY - y0) +
b2*(minY - y0))/(2*a1*(minX - x0)*(minX - x0) + 2*b1*(minY - y0)*(minY - y0)));
return ret;
}
private void simplex(double y1, double y2)
{
double minFvrem;
if ((ogr1(y1, y2) == true) && (ogr2(y1, y2) == true) && (ogr3(y1, y2) == true))
{
minFvrem = gradX*y1 + gradY*y2;
if (minFvrem < minF)
{
minF = Math.Round(minFvrem,4);
minX = Math.Round(y1,4);
minY = Math.Round(y2,4);
}
}
}
private void grad(double y1, double y2)
{
gradX = 2*a1*y1 + a2;
gradY = 2*b1*y2 + b2;
}
private bool ogr1(double y1, double y2)
{
if ((-1 * y1 * (B2 - A2) + y2 * (B1 - A1) + B2 * A1 - A2 * B1) <= 0) return true;
else return false;
}
private bool ogr2(double y1, double y2)
{
if ((-1 * y1 * (C2 - B2) + y2 * (C1 - B1) + C2 * B1 - B2 * C1) <= 0) return true;
else return false;
}
private bool ogr3(double y1, double y2)
{
if ((-1 * y1 * (D2 - C2) + y2 * (D1 - C1) + D2 * C1 - C2 * D1) <= 0) return true;
else return false;
}
}
}