Advertisement
Guest User

simplexresolvemethod

a guest
Apr 24th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 6.40 KB | None | 0 0
  1. %resolution par methode de simplex
  2. function simplex()
  3. clc;clear;
  4. prompt = {'Fonction cout=', 'max == 1 or min==2','nombre de contraintes = '};
  5. lineno=1;
  6. title= 'entrer les données';
  7. def={'[ ]','0','0'};
  8. options.Resize='on';
  9. a = inputdlg(prompt,title,lineno,def,options);
  10. a=char(a);
  11. [m,n] = size(a);
  12. cout=eval(a(1,:));
  13. nbr=eval(a(3,1));
  14. type=eval(a(2,1));
  15. str1=struct('vari',{},'Type',{});
  16. str2=struct('var_base',{},'valeur',{});
  17. for i=1:nbr
  18. prompt ={'entrez les differents types de contraintes(<=,>=,=) dans l''ordre  :'};
  19. title= 'entrer les données';
  20. def={''};
  21. options.Resize='on';
  22. p = inputdlg(prompt,title,lineno,def,options);
  23. p=char(p);
  24. opert=p;
  25.  str1(1,i).Type=opert;
  26. end
  27.  
  28. prompt = {'ENTRER LA MATRICE DES X'};
  29. lineno=1;
  30. title= 'entrer les données';
  31. def={'[ ]'};
  32. options.Resize='on';
  33. t = inputdlg(prompt,title,lineno,def,options);
  34. t=char(t);
  35. sc=eval(t);
  36. prompt = {'ENTRER LES SECONDS ELEMENTS'};
  37. lineno=1;
  38. title= 'entrer les données';
  39. def={'[ ]'};
  40. options.Resize='on';
  41. u = inputdlg(prompt,title,lineno,def,options);
  42. u=char(u);
  43. second=eval(u);
  44. M=100*max(max(sc));
  45. sc1=[];
  46. %initialisation des variables d''activité
  47. v_a=zeros(1,length(cout));
  48. %initialisation des variables d'ecarts
  49. v_e=[];
  50. v_b=[];
  51. v_ari=[];
  52. sc2=[];
  53. j=1;
  54. for i=1:nbr
  55.     n=str1(1,i).Type;
  56.     if n(1)~= '<' && isempty(sc2);
  57.         sc2=zeros(nbr,1);
  58.     end
  59.     switch str1(1,i).Type
  60.         case '<='
  61.             v_e=[v_e second(i)];
  62.             sc1(j,length(v_e))=1;
  63.             v_b=[v_b,second(i)];
  64.            
  65.         case '>='
  66.             v_e=[v_e 0];
  67.               sc1(j,length(v_e))=-1;
  68.               v_ari=[v_ari second(i)];
  69.               sc2(j,length(v_ari))=1;
  70.               v_b=[v_b,second(i)];
  71.              
  72.         case'='
  73.             v_ari=[v_ari second(i)];
  74.               sc2(j,length(v_ari))=1;
  75.               v_b=[v_b,second(i)];
  76.              
  77.     end
  78.     j=j+1;
  79. end
  80.  
  81. sc=[sc,sc1,sc2];
  82. vari=[];
  83. vari_a=[];
  84. vari_e=[];
  85. vari_ar=[];
  86. for i=1:size(sc,2)
  87.     str1(1,i).vari=['x',num2str(i)];
  88.     vari=[vari,str1(1,i).vari,' '];
  89.     if i<length(v_a)
  90.         vari_a=[vari_a,str1(1,i).vari,' '];
  91.     elseif i<=length(v_a)+length(v_e)
  92.         vari_e=[vari_e,str1(1,i).vari,' '];
  93.     else
  94.         vari_ar=[vari_ar,str1(1,i).vari,' '];
  95.     end
  96. end
  97. %Tableau 0
  98. x=[v_a,v_e,v_ari];
  99.  
  100. if length(v_ari~=0)
  101.     v_ar=ones(1,length(v_ari));
  102.     if type==1
  103.         v_ar=-M*length(v_ari).*v_ar;
  104.     else
  105.        v_ar=M*length(v_ari).*v_ar;
  106.     end
  107. else  v_ar=[];
  108. end
  109. Cj=[cout,0.*v_e,v_ar];
  110. Vb=[];
  111. Q=v_b;
  112. Ci=[];
  113. tabl=[];
  114. for i=1:length(Q)
  115.     tabl=[tabl; ' | '];
  116.     str2(1,i).valeur=Q(i)
  117.     ind=find(x==Q(i));
  118.     str2(1,i).var_base=str1(1,ind).vari;
  119.     Vb=[Vb,str2(1,i).var_base,' '];
  120.     Ci=[Ci,Cj(ind)];
  121. end
  122. Z=sum(Ci.*Q);
  123. for i=1:length(Cj)
  124.     Zj(i)=sum(Ci'.*sc(:,i));
  125. end
  126. Cj_Zj=Cj-Zj;
  127. l=[];
  128. for i=1:nbr
  129.     if length(str2(1,i).var_base)==2
  130.         l=[l;str2(1,i).var_base,' '];
  131.     else
  132.          l=[l;str2(1,i).var_base];
  133.     end
  134. end
  135. fprintf('\n');
  136. disp('===========================Programme sous Forme Standard===========================');
  137. disp(['les variables : ',vari]);
  138. disp(['                   -les variables d''activité    : ',vari_a]);
  139. disp(['                   -les variables d''ecarts    : ',vari_e]);
  140. disp(['                   -les variables artificiels    : ',vari_ar]);
  141. disp('============================Tableau 0==================================');
  142. disp(['initialisation des variables : ',vari]);
  143. disp(['                   -les variables d''activité    : ',num2str(v_a)]);
  144. disp(['                   -les variables d''ecarts    : ',num2str(v_e)]);
  145. disp(['                   -les variables artificiels    : ',num2str(v_ar)]);
  146. disp(['Cj                  : ',num2str(Cj)]);
  147. disp('_______________________________________________________________________');
  148. disp([tabl,num2str(Ci'),tabl,l,tabl,num2str(Q'),tabl,num2str(sc),tabl]);
  149. disp('_______________________________________________________________________');
  150. disp(['Zj                  : ',num2str(Zj)]);
  151. disp(['Cj-Zj                  : ',num2str(Cj-Zj)]);        
  152. disp(['Z                  : ',num2str(Z)]);  
  153. t=1;
  154. arret=1;
  155. while arret==1
  156.     %tableau t
  157.     if type==1
  158.         num=max(Cj_Zj);num=num(1);
  159.         num1=find(Cj_Zj==num);num1=num1(1);
  160.         V_ent=str1(1,num1).vari;
  161.     else
  162.       g=min(Cj_Zj);g=g(1);
  163.         num1=find(Cj_Zj==g);num1=num1(1);
  164.         V_ent=str1(1,num1).vari;                ['x',num2str(num1)];
  165.     end
  166.     b=sc(:,num1);
  167.     k=0;d=10000;
  168.     for i=1:length(Q)
  169.         if b(i)>0
  170.             div=Q(i)/b(i);
  171.             if d>div
  172.                 d=div;
  173.                 k=i;
  174.             end
  175.         end
  176.     end
  177.     if k~=0
  178.         num2=k;
  179.     else
  180.         disp('on n''arrive pas à trouver V.S : la solution est infinie ');
  181.         break;
  182.     end
  183.     V_sort=str2(1,num2).var_base;
  184.     str2(1,num2).var_base=str1(1,num1).vari;
  185.     pivot=sc(num2,num1);
  186.     Ci(num2)=Cj(num1);
  187.     sc(num2,:)=sc(num2,:)./pivot;
  188.     Q(num2)=Q(num2)/pivot;
  189.     h=size(sc,1);
  190.     for i=1:h
  191.         if i~=num2
  192.             Q(i)=Q(i)-sc(i,num1)*Q(num2);
  193.             sc(i,:)=sc(i,:)-sc(i,num1).*sc(num2,:);
  194.            
  195.         end
  196.     end
  197.     Z=sum(Ci.*Q);
  198.     for i=1:size(sc,2)
  199.         Zj(i)=sum(Ci'.*sc(:,i));
  200.     end
  201.     Cj_Zj=Cj-Zj;
  202.     l=[];V=[];
  203.     for i=1:nbr
  204.         if length(str2(1,i).var_base)==2
  205.             l=[l;str2(1,i).var_base,' '];
  206.             V=[V,l(i,:),' '];
  207.         else
  208.           l=[l;str2(1,i).var_base];
  209.           V=[V,l(i,:),' '];
  210.         end
  211.     end
  212.     Vb=V;
  213. disp(['===========================Tableau ',num2str(t),'===========================']);
  214. disp(['V.E           : ',num2str(V_ent)]);
  215. disp(['V.S              : ',num2str(V_sort)]);
  216. disp(['Pivot              : ',num2str(pivot)]);
  217. disp(['Var base              : ',num2str(Vb)]);
  218. disp(['Cj                  : ',num2str(Cj)]);
  219. disp('_______________________________________________________________________');
  220. disp([tabl,num2str(Ci'),tabl,l,tabl,num2str(Q'),tabl,num2str(sc),tabl]);
  221. disp('_______________________________________________________________________');
  222. disp(['Zj                  : ',num2str(Zj)]);
  223. disp(['Cj-Zj                  : ',num2str(Cj-Zj)]);        
  224. disp(['Z                  : ',num2str(Z)]);  
  225. t=t+1;
  226. if type==1
  227.     a=max(Cj_Zj);a=a(1);
  228.     if a<=0
  229.         break;
  230.     end
  231. else
  232. a=min(Cj_Zj);a=a(1);
  233. if a>=0 break;
  234. end
  235. end
  236. end
  237. p=num2str(Z);
  238. k= msgbox( p,'COUT OPTIMAL :')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement