Реферат

Реферат Решение задач линейного программирования симплекс методом 2

Работа добавлена на сайт bukvasha.net: 2015-10-28

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 29.3.2025





Министерство образования и науки Российской Федерации

Федеральное агентство по образованию

Государственное образовательное учреждение

ОРЕНБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

Математический факультет

Кафедра математического обеспечения информационных систем
Отчет
по лабораторной работе № 3

по дисциплине «Методы оптимизации»

Решение задач линейного программирования симплекс – методом




Руководитель:______Луговскова Ю.П.

«___»_______________________2010 г.

Исполнитель:

студент гр. 08МОС(у)

___________________Ледовского А.С.

«___»_______________________2010 г.




Оренбург 2010
Постановка задачи:
Найти максимум функции    



При ограничениях





Дана функция:




Графический метод:

C:\Documents and Settings\Admin\Рабочий стол\Безымянный.JPG

Точка максимума является (0;7)

Значение функции в данной точке = (0*(-1)+1*7) = 7


Симплекс – метод

Приведём данную функцию к каноническому виду



Матрица A = 

Б={}



0 x3  2    1.00  -1.00   1.00   0.00   2.00

0 x4  7    2.00   1.00   0.00   1.00   2.00

--------------------------------------------

           -1.00   1.00   0.00   0.00

    -2.00  -1.00   1.00  -1.00  -0.00

--------------------------------------------

-1 x1 -2   -1.00   1.00  -1.00  -0.00  -2.00

 0 x4  9    3.00   0.00   1.00   1.00  -2.00

--------------------------------------------

           -2.00   2.00  -1.00   0.00

    -2.00  -1.00   1.00  -1.00  -0.00

--------------------------------------------

 1 x2 -2   -1.00   1.00  -1.00  -0.00   9.00

 0 x4  9    3.00   0.00   1.00   1.00   9.00

--------------------------------------------

            0.00   0.00   1.00   0.00

     9.00   3.00   0.00   1.00   1.00

--------------------------------------------
 1 x2  7    2.00   1.00   0.00   1.00

 0 x3  9    3.00   0.00   1.00   1.00

           -3.00   0.00   0.00  -1.00

      
б.п. {0 7 9 0 }

(.)max = (0;7)

function(.)max = 7
Код программы:



// lab3.cpp : Defines the entry point for the console application.

//
#include "stdafx.h"

#include <iostream>

using namespace std;

const int n=4;

const int nn=2;

double A[2][n];

double A1[2][n];

int bp[2];

double Y0[2];

double mini;

double delta[n];

double e[n+1];

double C[4];

int bp_[n];
int maxi(double mas[n])

{

      double mm=-1000;

      int no;

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

      {

            if (mas[i]>mm) {mm=mas[i];no=i;}

      }

      return no;

}
bool exitt(double mas[n])

{

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

      {

            if (mas[i]>0.001) {return 0;}

      }

      return 1;

}
bool neogr(double mas[nn][n])

{

      int k=0;

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

      {

            k=0;

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

            {

                  if (mas[i][j]<1) {k++;}

            }

            if (k==n) return true;

      }

      return false;

}

int bp_free()

{

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

      {

            if (bp_[i]==0) return i;

      }

      cout << "konec!!!"<<endl;

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

      {bp_[i]=0;}

      return 0;

}
void update(double mas[nn][n],double mas1[nn][n])

{

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

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

      {mas[i][j]=mas1[i][j];}

}

int main()

{

      freopen("input.txt","r",stdin);

      freopen("output.txt","w",stdout);

     

      cin >> C[0];

      cin >> C[1];

      C[2]=0;

      C[3]=0;

     

      // считали матрицу А

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

      {

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

            {cin >> A[i][j];bp_[j]=0;}

            cin >> Y0[i];

      }

      bp[0]=3;

      bp_[2]=0; // помечаем что в 3 были

      bp[1]=4;

      bp_[3]=0; // помечаем что в 4 были

     

      int nomer=0;

      // находим минимум

      if (((Y0[0]/A[0][0])>0)&&((Y0[0]/A[0][0])<(Y0[1]/A[1][0]))) {mini=(Y0[0]/A[0][0]);}

      else {mini=(Y0[1]/A[1][0]);nomer=1;}
      // находим дельта

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

      {delta[i]=C[i]-(C[bp[0]-1]*A[0][i]+C[bp[1]-1]*A[1][i]);}

     

      int s=maxi(delta); // номер ведущего столбца

      double v_e=A[nomer][s];

      // вычмсление строки ебсилон

      e[0]=Y0[nomer]/v_e;    

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

      {

            e[i+1]=A[nomer][i]/v_e;

      }

      // вывод

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

      {

            printf("%2.0f",C[bp[i]-1]);

            cout<<" "<<"x";

            printf("%1i",bp[i]);

            cout<<" ";

            printf("%2.0f",Y0[i]);

            cout<<" ";       

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

            printf("%7.2f",A[i][j]);

            printf("%7.2f",mini);

            cout << endl;

      }

      cout<<"--------------------"<<endl;

      cout << "         ";

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

      printf("%7.2f",delta[j]);   

      cout << endl<< "  ";

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

      printf("%7.2f",e[j]);

      cout<<endl<<"---------------"<<endl;

while (exitt(delta)==false) // смотрим всё ли элементы в е отрицательны

{

      if (neogr(A)==true) {cout<<"no ogran";return 0;} // проверяем есть ли столбцы со всеми отрицательными элементами

      if (((bp[nomer])!=(bp_free()+1))&&((bp[1-nomer])!=(bp_free()+1)))

      {

            bp[nomer]=bp_free()+1;

            bp_[bp_free()]=1;

      }

      else {bp[nomer]=bp_free()+2;bp_[bp_free()+1]=1;}    

      //пересчитываем матрицу А

      Y0[nomer]=e[0];

      Y0[1-nomer]=Y0[1-nomer]-e[0]*A[1-nomer][s];   

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

      {

            A1[nomer][i]=e[i+1];

            A1[1-nomer][i]=A[1-nomer][i]-e[i+1]*A[1-nomer][s];

      }

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

      {delta[i]=C[i]-(C[bp[0]-1]*A1[0][i]+C[bp[1]-1]*A1[1][i]);}
      if (exitt(delta)==true)

      {

            cout << endl<<endl;

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

            {

                  printf("%2.0f",C[bp[i]-1]);

                  cout<<" "<<"x";

                  printf("%1i",bp[i]);

                  cout<<" ";

                  printf("%2.0f",Y0[i]);

                  cout<<" ";             

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

                  {printf("%7.2f",A1[i][j]);}

            cout << endl;

            }

      cout << "         ";

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

      printf("%7.2f",delta[j]);   

      cout << endl<< "       "<<endl<<endl;

      double aa[n];

      for (int i=0;i<n;i++) aa[i]=0;

      aa[bp[0]-1]=Y0[0];

      aa[bp[1]-1]=Y0[1];     

      cout<<"б.п. {";

      for (int i=0;i<n;i++) cout <<aa[i]<<" ";

      cout <<"}"<<endl;

      if (aa[0]<0.0001) C[0]=0;

      cout<<"(.)max = ("<<C[0]*aa[0]<<";"<<C[1]*aa[1]<<")"<<endl;

      cout<<"function(.)max = " <<C[0]*aa[0]+C[1]*aa[1];

      return 0;

     

      }

      s=maxi(delta); // ведущий столбец

      // находим минимум

      nomer=0;   

      if (((Y0[1]/A1[1][s])<0)||(A1[1][s])==0)

      {mini=(Y0[0]/A1[0][s]);nomer=0;}

      else {mini=(Y0[1]/A1[1][s]);nomer=1;}

      if ((A1[0][s])==0)

      {mini=(Y0[1]/A1[1][s]);nomer=1;}

      v_e=A1[nomer][s];

     

      e[0]=Y0[nomer]/v_e;    

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

      {

            e[i+1]=A1[nomer][i]/v_e;

      }

      // вывод

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

      {

            printf("%2.0f",C[bp[i]-1]);

            cout<<" "<<"x";

            printf("%1i",bp[i]);

            cout<<" ";

            printf("%2.0f",Y0[i]);

            cout<<" ";       

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

            printf("%7.2f",A1[i][j]);

            cout <<"  ";           

            printf("%5.2f",mini);

            cout <<endl;

      }

      cout<<"-------------------"<<endl;

      cout << "         ";

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

      printf("%7.2f",delta[j]);         

      cout << endl<< "  ";

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

      {printf("%7.2f",e[j]);}

      cout<<endl<<"--------------"<<endl;

      update(A,A1);

}

      return 0 }





1. Реферат на тему Women In Third World Fiction Essay Research
2. Контрольная работа Процесс производства сахара-рафинада Основные виды печенья
3. Реферат на тему Физкультура в жизни студента
4. Реферат Отчет по общеинженерной практике на ОАО Воскресенские минеральные удобрения
5. Реферат Биология орхидей
6. Реферат на тему Официальный стиль речи
7. Реферат на тему Claim
8. Сочинение на тему Наташа Ростова на пути к счастью
9. Реферат на тему Evolution Vs Christianity Essay Research Paper Evolution
10. Реферат на тему Scientific Revolution Essay Research Paper There have