Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет1.doc
Скачиваний:
2
Добавлен:
25.08.2019
Размер:
752.13 Кб
Скачать

3. Описание входных и выходных данных

Описание входных данных

Переменная integer m – число полезных элементов в питании

Переменная integer n – число продуктов питания

Массив double[n] C – вектор стоимостей продуктов питания

Массив double[m] B – вектор ограничений снизу на количество полезных элементов питания

Массив double[m,n] A – матрица питательности

Описание выходных данных

Массив double[n] X – вектор с решением задачи

Переменная double CelF – значение целевой функции для вектора решения (min значение целевой функции)

4. Текст программы

namespace Dieta

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private static Boolean FindSigmas(double[,] a, ref double[] z,double[] b,double[] bazis,ref Boolean stop)

{

int l1 = z.Length;

int l2 = bazis.Length;

int j = 0;

int stopkrit=0;

for (int i = 0; i < l1; i++)

{

z[i] = 0;

for (j = 0; j < l2; j++)

z[i] += a[j, i] * bazis[j];

z[i] = z[i] - b[i];

if (z[i] < 0)

{

for (j = 0; j < l2; j++)

if (a[j, i] > 0) break;

if (j == l2) return false;

}

else

stopkrit++;

}

if (stopkrit == l1)

stop = true;

return true;

}

private static void FindNapr(double[,] a, double[] z, double[] c, ref int i0, ref int j0)

{

double minsigma = z[0];

j0=0;

int l1 = z.Length;

int l2 = c.Length;

for (int j = 1; j < l1; j++)

{

if (z[j] < minsigma)

{

minsigma = z[j];

j0 = j;

}

if (c[0] / a[0, j0] < 0) minsigma = 2147483647; else minsigma = c[0] / a[0, j0];

for (int j = 1; j < l2; j++)

if (a[j, j0]!=0)

if ((minsigma > c[j] / a[j, j0])&&(c[j] / a[j, j0]>=0))

{

minsigma = c[j] / a[j, j0];

i0 = j;

}

}

private void button3_Click(object sender, EventArgs e)

{

int n = Convert.ToInt16(textBox2.Text); //число продуктов

int m = Convert.ToInt16(textBox1.Text); //число элементов

int raz = m+n; // число переменных и базисных и таких в сумме

double[,] a = new double[n,raz]; //матрица питательности

double[] b = new double[raz];//ограничение элементов

double[] c = new double[n];//стоимости

double[] x = new double[raz]; //решения

int[] perem = new int[raz];//сначала строка свободные n , потом базисные m

Boolean[] p = new Boolean[raz];

double[] bazis = new double[n];//здесь хранятся коэфициенты базисных переменных

double[] z = new double[raz]; //строка с сигмаразностями

double[] astolb = new double[n]; //столбец а из матрицы питательности

int i0=0, j0=0;

double x0;

int tmp =0;

int count = 0;

Boolean stop = false;

//строка i/ столбец j

for (int i = 0; i <m; i++)

{

for (int j = 0; j < n; j++)

{ a[j,i]=Convert.ToDouble(dataGridView1.Rows[i].Cells[j].Value);//транспонированная

}

}

for (int j = 0; j < n; j++)

{

c[j] = Convert.ToDouble(dataGridView2.Rows[0].Cells[j].Value);//ограничения становятся стоимостями

}

for (int i = 0; i < m; i++)

{

b[i] = Convert.ToDouble(dataGridView3.Rows[0].Cells[i].Value);//стоимости становятся ограничениями

perem[i] = i;

x[i] = 0;

}

for (int j = m; j < raz; j++)

{

b[j] = 0;

perem[j] = j;

x[j] = 0;

a[-m + j, j] = 1;

}

while (!stop)

{

count++;

int k = 0;

for (int j = m; j < raz; j++)

{ bazis[k]= b[ perem[j] ]; k++; }

//Жарим сигмы, возвращаем z, одновременно проверка на отсутствие решения, когда столбец а для z отрицателен

if (FindSigmas(a, ref z, b, bazis,ref stop))

{

button3.Text = (count-1).ToString();

for (int j = 0; j < n; j++)

{

x[j] = z[j + m];

}

if (stop)

{

double celf = 0;

dataGridView4.ColumnCount = n;

dataGridView4.RowCount = 1;

for (int j = 0; j <n; j++)

dataGridView4.Rows[0].Cells[j].Value = x[j].ToString();

for (int j = 0; j < n; j++)

{

celf += x[j] * Convert.ToDouble(dataGridView2.Rows[0].Cells[j].Value);

}

label7.Text = celf.ToString();

break;

}

//Минимум из этого z, находим направляющий столбец и стороку, вываливаем i,j,x

i0 = 0; j0 = 0; x0 = 0;

FindNapr(a, z, c, ref i0, ref j0);

//Новая матрица a

x0 = a[i0, j0];

for (int i = 0; i < n; i++)

{

if (i != i0)

{

for (int j = 0; j < raz; j++)

if (j != j0)

{

a[i, j] = a[i, j] - a[i, j0] * a[i0, j] / x0;

}

c[i] = c[i] - c[i0] *a[i,j0]/ x0;

}

}

for (int j = 0; j < raz; j++)

a[i0, j] = a[i0, j] / x0;

for (int i = 0; i < n; i++)

if (i!=i0)

a[i, j0] = 0;

c[i0] = c[i0] / x0;

//меняем местами переменные

tmp=perem[i0+m];

perem[i0+m]=j0;

perem[j0]=tmp;

} Else button1.Text = "Нет решений!"; }}}}