Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <math.h>
- #include <conio.h>
- #define CMAX 10 //maksymalna ilosc zmiennych
- #define VMAX 10 //maksymalna ilosc warunkow
- int NC, // ilosc warunkow
- NV, // ilosc zmiennych
- NOPTIMAL, // sprawdzanie czy mamy juz optimum
- P1,P2, // numer wiersza i kolumny obacanych
- XERR; // zmienna przechowujaca dane czy jest rozwiazanie
- double TS[CMAX][VMAX]; //tabela simpleksow NC+1xNV+1
- void Data() {
- double R1,R2; // r1 = 1 dla maksymalizacji -1 dla minimalizacji, r2 pomocnicza do wprowadzania
- char R; // czy liczymy maksimum czy tez minimum
- printf("\n Metoda Simplex\n\n");
- printf(" Czy liczysz maksimum (Y/N) ? "); scanf("%c", &R);
- printf("\n Podaj ilosc zmiennych funkcji "); scanf("%d", &NV);
- printf("\n Podaj ilosc warunkow "); scanf("%d", &NC);
- if (R == 'Y' || R=='y')
- R1 = 1.0;
- else
- R1 = -1.0;
- printf("\n Podaj wspolczynniki liczonej funkcji w postaci aX1+bX2+cX3...\n");
- for (int J = 1; J<=NV; J++) {
- printf(" #%d ? ", J); scanf("%lf", &R2);
- TS[1][J+1] = R2 * R1;
- }
- printf(" Wprowadz prawa strone ? "); scanf("%lf", &R2);
- TS[1][1] = R2 * R1;
- for (int I = 1; I<=NC; I++) {
- printf("\n Wprowadz wspolczynniki dla warunku #%d:\n", I);
- for (int J = 1; J<=NV; J++) {
- printf(" #%d ? ", J); scanf("%lf", &R2);
- TS[I + 1][J + 1] = -R2;
- }
- printf("Podaj prawa strone warunku "); scanf("%lf", &TS[I+1][1]);
- }
- printf("\n\n RESULTS:\n\n");
- for(int J=1; J<=NV; J++) TS[0][J+1] = J;
- for(int I=NV+1; I<=NV+NC; I++) TS[I-NV+1][0] = I;
- }
- void Pivot();
- void Formula();
- void Optimize();
- void Simplex() {
- e10: Pivot();
- Formula();
- Optimize();
- if (NOPTIMAL == 1) goto e10;
- }
- void Pivot() {
- double RAP,V,XMAX;
- XMAX = 0.0;
- for(int J=2; J<=NV+1; J++) {
- if (TS[1][J] > 0.0 && TS[1][J] > XMAX) {
- XMAX = TS[1][J];
- P2 = J;
- }
- }
- RAP = 999999.0;
- for (int I=2; I<=NC+1; I++) {
- if (TS[I][P2] >= 0.0) continue;
- V = fabs(TS[I][1] / TS[I][P2]);
- if (V < RAP) {
- RAP = V;
- P1 = I;
- }
- }
- V = TS[0][P2]; TS[0][P2] = TS[P1][0]; TS[P1][0] = V;
- }
- void Formula() {;
- for (int I=1; I<=NC+1; I++) {
- if (I == P1) continue;
- for (int J=1; J<=NV+1; J++) {
- if (J == P2) continue;
- TS[I][J] -= TS[P1][J] * TS[I][P2] / TS[P1][P2];
- }
- }
- TS[P1][P2] = 1.0 / TS[P1][P2];
- for (int J=1; J<=NV+1; J++) {
- if (J == P2) continue;
- TS[P1][J] *= fabs(TS[P1][P2]);
- }
- for (int I=1; I<=NC+1; I++) {
- if (I == P1) continue;
- TS[I][P2] *= TS[P1][P2];
- }
- }
- void Optimize() {
- for (int I=2; I<=NC+1; I++)
- if (TS[I][1] < 0.0) XERR = 1;
- NOPTIMAL = 0;
- if (XERR == 1) return;
- for (int J=2; J<=NV+1; J++)
- if (TS[1][J] > 0.0) NOPTIMAL = 1;
- }
- void Results() {
- if (XERR != 0){
- printf(" Brak rozwiazania.\n"); }
- else{
- for (int I=1; I<=NV; I++)
- for (int J=2; J<=NC+1; J++) {
- if (TS[J][0] != 1.0*I) continue;
- printf(" Zmienna #%d: %f\n", I, TS[J][1]);
- ;}
- printf("\n Funkcja przyjmuje wtedy wartosc%f\n", TS[1][1]);
- printf("\n");
- }
- getch();
- getch();
- }
- int main() {
- Data();
- Simplex();
- Results();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement