Реферат: Решение задач линейного программирования симплекс методом 2
Название: Решение задач линейного программирования симплекс методом 2 Раздел: Рефераты по информатике Тип: реферат | |
Министерство образования и науки Российской Федерации Федеральное агентство по образованию Государственное образовательное учреждение ОРЕНБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ Математический факультет Кафедра математического обеспечения информационных систем Отчет по лабораторной работе № 3 по дисциплине «Методы оптимизации» Решение задач линейного программирования симплекс – методом
Оренбург 2010 Постановка задачи: Найти максимум функции Приограничениях Дана функция: Графический метод: Точка максимума является (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> usingnamespace std; constint n=4; constint 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) returntrue; } returnfalse; } 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 } |