风花雪月 发表于 2005-9-22 09:17

单纯型法的c语言实现!

<P><FONT color=#ffffff><FONT color=#000000> /*本程序是单纯形法,参考书目:河海大学&lt;吴凤平&gt;运筹学方法与应用*/<BR>#include&lt;stdio.h&gt;<BR>#include&lt;math.h&gt;<BR>#define X 5<BR>#define Y 7<BR>void xi_max(int *m2,int *mn1,float *c,int *is,int *ir,int *j0,float (*a))<BR>{<BR>int j;<BR>*c=0;<BR>for(j=1;j&lt;=*is;j++) <BR>    {<BR>      if((*a)[*ir]-*c&gt;0)<BR>    {<BR>      *c=(*a)[*ir];<BR>      *j0=j;<BR>    }<BR>   }<BR>}<BR><BR>      /***************** 参数说明 **********************/<BR>      /*   m_约束方程个数(基变量个数),n_非基变量个数   */<BR>      /*   m2-m+2整个变量,(*a)存放初始数据       */<BR>      /*   (*k)[]存放基变量脚标,(*x)存放基变量最优值   */<BR>      /********* </FONT><a href="http://happyyangxu.home.sunbo.net*******/" target="_blank" >http://happyyangxu.home.sunbo.net*******/</A><FONT color=#000000> <BR>int xi_sm(int m,int n,int m2,int mn1,int l1,float (*a),<BR>       int(*k)[],float(*x)[])<BR>{<BR>int i,m1,mn,j0,i0,j;<BR>float c,g;<BR>m1=m+1;<BR>mn=m+n;<BR>for(i=1;i&lt;=m;i++)<BR>    (*k)=n+i;<BR>leap1:<BR>if(l1-1==0)<BR>   xi_max(&amp;m2,&amp;mn1,&amp;c,&amp;mn,&amp;m1,&amp;j0,a);<BR>else<BR>   {<BR>leap2:   if(l1-50==0)<BR>      xi_max(&amp;m2,&amp;mn,&amp;c,&amp;n,&amp;m2,&amp;j0,a);<BR>       else<BR>      xi_max(&amp;m2,&amp;mn1,&amp;c,&amp;mn,&amp;m2,&amp;j0,a);<BR>   }<BR>   c-=1e-8;<BR>   if((c&lt;=0)&amp;&amp;(l1==1)&amp;&amp;((*a)-1e-8&gt;0))<BR>      {<BR>    printf("\n\t*********Not min&amp;&amp;No solution**********\n");<BR>    return(-1);<BR>      }<BR>   if((c&lt;0)&amp;&amp;(l1==1))<BR>       {<BR>   l1=50;<BR>   goto leap2;<BR>       }<BR>    if(c&lt;=0)<BR>       {<BR>      for(i=1;i&lt;=m;i++)<BR>         (*x)=(*a);<BR>         printf("\n\t********Optimal solution********\n");<BR>      for(i=1;i&lt;=m;i++)<BR>         printf("\ni=%d,x=%f\n",(*k),(*x));<BR>      printf("\nF=%f\n",(*a));<BR>      return 0;<BR>    }<BR>   c=1e8;<BR>   for(i=1;i&lt;=m;i++)<BR>       {<BR>   if((*a)&gt;1e-8)<BR>      {<BR>          g=(*a)/(*a);<BR>          if(g-c&lt;0);<BR>         {<BR>         c=g;<BR>         i0=i;<BR>          }<BR>         }<BR>    }<BR>      if(c==1e+8)<BR>    {<BR>      printf("\n\t*******Lp no solution********\n");<BR>      return -3;<BR>   }<BR>       (*k)=j0;<BR>       for(j=1;j&lt;=mn1;j++)<BR>      {<BR>      if((j==j0)||(l1==50)&amp;&amp;(n&lt;j)&amp;&amp;(j&lt;mn1))<BR>         continue;<BR>         g=(*a)/(*a);<BR>         (*a)=g;<BR>         for(i=1;i&lt;=m2;i++)<BR>         {<BR>         if((i==i0)||(!(l1==1)&amp;(i==m1)))<BR>            continue;<BR>         (*a)=(*a)-(*a)*g;<BR>         }<BR>       }<BR>       for(i=1;i&lt;=m2;i++)<BR>      (*a)=0;<BR>       (*a)=1;<BR>       goto leap1;<BR>}<BR>main()<BR>{<BR>float a={{0,0,0, 0,0,0,0},<BR>               {0,3,-4,3,1,0,12},<BR>               {0,3,0, 6,0,1,12},<BR>               {0,0,0, 0,0,0,0},<BR>               {0,69,0,144,0,0,300}};<BR>int k;<BR>float x;<BR>clrscr();<BR>xi_sm(2,3,4,6,0,&amp;a,&amp;k,&amp;x);<BR>}</FONT><BR></FONT></P>

aya331 发表于 2005-10-10 22:11

版主可以讲讲没部迭代的原理吗。

风花雪月 发表于 2005-10-11 11:34

回复:(aya331)版主可以讲讲没部迭代的原理吗。[em0...

<DIV class=quote><B>以下是引用<I>aya331</I>在2005-10-10 22:11:22的发言:</B><BR>版主可以讲讲没部迭代的原理吗。</DIV>
<P>没部迭代是什么意思?没太看懂,请原谅</P>

aya331 发表于 2005-10-11 22:51

这个程序应该是把单纯型表中两阶法计算过程用c实现的程序。我的意思是可否解释下程序每部运算的过程,谢谢了。

johhan 发表于 2005-10-16 23:31

谢谢分享好资源

sprine 发表于 2006-4-1 16:29

编译出错了

binry 发表于 2006-4-6 16:24

xiexie
页: [1]
查看完整版本: 单纯型法的c语言实现!