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 = "Нет решений!"; }}}}