Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.44 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <conio.h>
  4.  
  5.  
  6.  
  7. #define CMAX 10 //maksymalna ilosc zmiennych
  8. #define VMAX 10 //maksymalna ilosc warunkow
  9.  
  10.  
  11. int NC, // ilosc warunkow
  12. NV, // ilosc zmiennych
  13. NOPTIMAL, // sprawdzanie czy mamy juz optimum
  14. P1,P2, // numer wiersza i kolumny obacanych
  15. XERR; // zmienna przechowujaca dane czy jest rozwiazanie
  16. double TS[CMAX][VMAX]; //tabela simpleksow NC+1xNV+1
  17.  
  18. void Data() {
  19. double R1,R2; // r1 = 1 dla maksymalizacji -1 dla minimalizacji, r2 pomocnicza do wprowadzania
  20. char R; // czy liczymy maksimum czy tez minimum
  21.  
  22. printf("\n Metoda Simplex\n\n");
  23. printf(" Czy liczysz maksimum (Y/N) ? "); scanf("%c", &R);
  24. printf("\n Podaj ilosc zmiennych funkcji "); scanf("%d", &NV);
  25. printf("\n Podaj ilosc warunkow "); scanf("%d", &NC);
  26. if (R == 'Y' || R=='y')
  27. R1 = 1.0;
  28. else
  29. R1 = -1.0;
  30. printf("\n Podaj wspolczynniki liczonej funkcji w postaci aX1+bX2+cX3...\n");
  31. for (int J = 1; J<=NV; J++) {
  32. printf(" #%d ? ", J); scanf("%lf", &R2);
  33. TS[1][J+1] = R2 * R1;
  34. }
  35. printf(" Wprowadz prawa strone ? "); scanf("%lf", &R2);
  36. TS[1][1] = R2 * R1;
  37. for (int I = 1; I<=NC; I++) {
  38. printf("\n Wprowadz wspolczynniki dla warunku #%d:\n", I);
  39. for (int J = 1; J<=NV; J++) {
  40. printf(" #%d ? ", J); scanf("%lf", &R2);
  41. TS[I + 1][J + 1] = -R2;
  42. }
  43. printf("Podaj prawa strone warunku "); scanf("%lf", &TS[I+1][1]);
  44. }
  45. printf("\n\n RESULTS:\n\n");
  46. for(int J=1; J<=NV; J++) TS[0][J+1] = J;
  47. for(int I=NV+1; I<=NV+NC; I++) TS[I-NV+1][0] = I;
  48. }
  49.  
  50. void Pivot();
  51. void Formula();
  52. void Optimize();
  53.  
  54. void Simplex() {
  55. e10: Pivot();
  56. Formula();
  57. Optimize();
  58. if (NOPTIMAL == 1) goto e10;
  59. }
  60.  
  61. void Pivot() {
  62.  
  63. double RAP,V,XMAX;
  64.  
  65.  
  66. XMAX = 0.0;
  67. for(int J=2; J<=NV+1; J++) {
  68. if (TS[1][J] > 0.0 && TS[1][J] > XMAX) {
  69. XMAX = TS[1][J];
  70. P2 = J;
  71. }
  72. }
  73. RAP = 999999.0;
  74. for (int I=2; I<=NC+1; I++) {
  75. if (TS[I][P2] >= 0.0) continue;
  76. V = fabs(TS[I][1] / TS[I][P2]);
  77. if (V < RAP) {
  78. RAP = V;
  79. P1 = I;
  80. }
  81. }
  82. V = TS[0][P2]; TS[0][P2] = TS[P1][0]; TS[P1][0] = V;
  83. }
  84.  
  85. void Formula() {;
  86.  
  87.  
  88.  
  89. for (int I=1; I<=NC+1; I++) {
  90. if (I == P1) continue;
  91. for (int J=1; J<=NV+1; J++) {
  92. if (J == P2) continue;
  93. TS[I][J] -= TS[P1][J] * TS[I][P2] / TS[P1][P2];
  94. }
  95. }
  96. TS[P1][P2] = 1.0 / TS[P1][P2];
  97. for (int J=1; J<=NV+1; J++) {
  98. if (J == P2) continue;
  99. TS[P1][J] *= fabs(TS[P1][P2]);
  100. }
  101. for (int I=1; I<=NC+1; I++) {
  102. if (I == P1) continue;
  103. TS[I][P2] *= TS[P1][P2];
  104. }
  105. }
  106.  
  107. void Optimize() {
  108.  
  109. for (int I=2; I<=NC+1; I++)
  110. if (TS[I][1] < 0.0) XERR = 1;
  111. NOPTIMAL = 0;
  112. if (XERR == 1) return;
  113. for (int J=2; J<=NV+1; J++)
  114. if (TS[1][J] > 0.0) NOPTIMAL = 1;
  115. }
  116.  
  117. void Results() {
  118.  
  119.  
  120. if (XERR != 0){
  121. printf(" Brak rozwiazania.\n"); }
  122. else{
  123. for (int I=1; I<=NV; I++)
  124. for (int J=2; J<=NC+1; J++) {
  125. if (TS[J][0] != 1.0*I) continue;
  126. printf(" Zmienna #%d: %f\n", I, TS[J][1]);
  127. ;}
  128. printf("\n Funkcja przyjmuje wtedy wartosc%f\n", TS[1][1]);
  129. printf("\n");
  130. }
  131. getch();
  132. getch();
  133. }
  134.  
  135. int main() {
  136.  
  137. Data();
  138. Simplex();
  139. Results();
  140.  
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement