Advertisement
Guest User

Untitled

a guest
May 24th, 2015
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.39 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <cmath>
  4. #include "simplex.h"
  5.  
  6. using namespace std;
  7.  
  8. simplex::simplex(const vector<fracao> & c, const vector<fracao> & b, const vector< vector<fracao> > & A){
  9. n=c.size();
  10. m=b.size();
  11. linhaFO.resize(m+n);
  12. valores.resize(m);
  13. for (size_t i = 0; i <m; i++){
  14. if (b[i] < nula){
  15. cout << "o coeficiente e negativo" << endl;
  16. system ("PAUSE");
  17. exit (1);
  18. }
  19. }
  20. for(size_t i=0; i<m; i++){
  21. vector <fracao> h;
  22. for(size_t j=0; j<n+m; j++){
  23. fracao nula1;
  24. h.push_back(nula1);
  25. }
  26. quadro.push_back(h);
  27. }
  28. fracao nula2;
  29. for(size_t i=0; i<n; i++) linhaFO[i]=-c[i];
  30. for(size_t i=n; i<n+m; i++) linhaFO[i]=nula;
  31. for(size_t i=0; i<m; i++) valores[i]=b[i];
  32.  
  33. for(size_t i=0; i<m; i++){
  34. for(size_t j=0; j<n; j++){
  35. quadro[i][j]=A[i][j];
  36. }
  37. }
  38. for(size_t i=0; i<m; i++){
  39. for(size_t j=n; j<n+m; j++){
  40. quadro[i][j] = 0;
  41. }
  42. }
  43. for(size_t i=0; i<m; i++){
  44. quadro[i][n+i]=1;
  45. }
  46. for(size_t i=n; i<m+n;i++){
  47. VB.push_back(i+1);
  48. }
  49. fracao nula;
  50. Z=nula;
  51. }
  52.  
  53. void simplex :: resolver (){
  54.  
  55. int menores = 2;
  56. iteracoes =0;
  57.  
  58. while(menores != 0){
  59.  
  60. int entra = 0;
  61. fracao nula;
  62. for (size_t i =1; i < n+m; i++){
  63. if (linhaFO[entra]<nula && linhaFO[i]<nula){
  64. if (linhaFO[entra] > linhaFO[i]) entra = i;
  65. }
  66. else if (linhaFO[entra]>nula && linhaFO[i]<nula){
  67. entra = i;
  68. }
  69. //cout << "entra = " << entra+1 << endl;
  70.  
  71. }
  72. int escolhidos =0;
  73. int sai =0;
  74. while (escolhidos < 1){
  75. //cout << "tou dentro do while!!!" << endl;
  76. for (size_t i =0; i<m; i++){
  77. //cout << "tou dentro do for!!!" << endl;
  78.  
  79. if (quadro[i][entra] > nula) {
  80. //cout << "tou dentro do if!!!" << endl;
  81. sai = i;
  82. cout << "i = " << i << endl;
  83. escolhidos ++;
  84. }
  85. }
  86. }
  87. //cout << "sai = " << sai+1 << endl;
  88. for (size_t i =0; i<m; i++){
  89.  
  90. if (quadro [i][entra] >nula){
  91.  
  92. //cout << "quadro [i][entra] = " << quadro [i][entra] << endl;
  93. if (valores[sai]/quadro[sai][entra] > valores[i]/quadro [i][entra]) sai = i;
  94. //cout << "valores / quadro = " << valores[sai]/quadro[sai][entra] << " e valores[i]/quadro [i][entra] = " << valores[i]/quadro [i][entra] << endl;
  95. }
  96. }
  97.  
  98. fracao pivot;
  99. pivot = quadro[sai][entra];
  100. //cout << " sai = " << sai + 1 << endl;
  101. //cout << " entra = " << entra + 1 << endl;
  102. //cout << "o pivot e " << pivot << "!!!!! " << endl;
  103.  
  104. VB [sai] = entra + 1;
  105. for (size_t i =0; i<m; i++){
  106. //cout << " VB [i] = " << VB[i] << endl;
  107. }
  108.  
  109. Z = Z - ((valores[sai]*linhaFO[entra])/pivot);
  110. //cout << " Z = " << Z << endl ;
  111.  
  112. for (size_t i = 0; i < m+n; i++){
  113. if (int (i) != entra){
  114. //cout << "linhaFO [i]" << linhaFO[i] << " - quadro[sai][i] " << quadro[sai][i] << " * linhaFO[entra]" << linhaFO[entra] << " / PIVOT " << pivot<< endl;
  115. linhaFO[i] = linhaFO [i] - ((quadro[sai][i]*linhaFO[entra])/pivot);
  116. }
  117. }
  118. linhaFO[entra]=nula;
  119. //cout << "linhaFO[entra]" << linhaFO[entra];
  120. for (size_t i = 0; i < m+n; i++){
  121. //cout << "linhaFO[i] = "<< linhaFO[i] << endl ;
  122. }
  123.  
  124. for (size_t i = 0; i < m; i++){
  125. if (int (i) != sai){
  126. valores [i] = valores [i] - ((quadro[i][entra]*valores[sai])/pivot);
  127. //cout << "valores [i] = " << valores[i] << endl;
  128. }
  129. }
  130.  
  131. for (size_t i = 0; i < m; i++){
  132. for (size_t j=0; j < n+m; j++){
  133. if (int(i)!= sai && int(j)!= entra) {
  134. quadro [i][j] = quadro [i][j] - ((quadro[i][entra]*quadro[sai][j])/pivot);
  135. }
  136. }
  137. }
  138.  
  139. for (size_t i = 0; i < m; i++){
  140. if (int (i) != sai) quadro [i][entra] = nula;
  141. }
  142.  
  143. for (size_t i= 0; i < m+n; i++){
  144. quadro [sai][i] = quadro[sai][i]/pivot;
  145. }
  146.  
  147. for (size_t i = 0; i < m; i++){
  148. for (size_t j=0; j < n+m; j++){
  149. //cout << "quadro[" << i+1 << "][" << j+1 << "] = " << quadro[i][j] << endl;
  150. }
  151. }
  152.  
  153. for (size_t i= 0; i < m+n; i++){
  154. //cout << "quadro [sai][i]/pivot = " << quadro [sai][i] << endl;
  155. }
  156. valores[sai] = valores[sai]/pivot;
  157. //cout << "valores [sai] = " << valores [sai] << endl;
  158.  
  159.  
  160. //fracao nula;
  161. menores=0;
  162. for (size_t i =0; i < n+m; i++){
  163. if (linhaFO [i] < nula) menores++;
  164. }
  165. cout << "menores = " << menores << endl;
  166. iteracoes ++;
  167. if (iteracoes > 50){
  168. cout << "e degenerado!!!!!!!!!, o valor de uma variavel basica é zero, o que leva a um ciclo infinito de repeticoes " << endl;
  169. system ("PAUSE");
  170. exit (1);
  171. }
  172. }
  173. cout << "interacoes = " << iteracoes;
  174. }
  175.  
  176.  
  177. ostream &operator <<(ostream & os , const simplex & A ){
  178. os << " VB ";
  179. for (size_t i = 0; i< A.m+A.n; i++){
  180. os << "| x" << i + 1 << " ";
  181. }
  182. os << "| Valores";
  183. os << endl;
  184. os << "------------------------------------------------------------------" << endl;
  185. os << " Z ";
  186. for (size_t i = 0; i< A.m+A.n; i++){
  187. os << "| " << A.linhaFO[i] << " ";
  188. }
  189. os << "| " << A.Z << endl;
  190. os << "------------------------------------------------------------------" << endl;
  191. for (size_t i=0; i < A.m; i++){
  192. os << " X" << A.VB[i] << " |";
  193. for (size_t j=0; j < A.m+A.n; j++){
  194. os << " " << A.quadro [i][j] << " ";
  195. }
  196. os << " | " << A.valores [i] << endl;
  197. }
  198. return os;
  199. }
  200.  
  201. void simplex :: solucao (){
  202. for (size_t i=0; i < m; i++){
  203. cout<< "X " << VB[i] << " = " << valores[i] << endl;
  204. }
  205.  
  206. cout << "Z = " << Z << endl;
  207.  
  208. cout << "Foram feitas " << iteracoes << " iteracoes!" << endl;
  209. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement