声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3610|回复: 6

[C/C++] 单纯型法的c语言实现!

[复制链接]
发表于 2005-9-22 09:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
<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)[X][Y])<BR>{<BR>  int j;<BR>  *c=0;<BR>  for(j=1;j&lt;=*is;j++) <BR>    {<BR>      if((*a)[*ir][j]-*c&gt;0)<BR>    {<BR>      *c=(*a)[*ir][j];<BR>      *j0=j;<BR>    }<BR>     }<BR>}<BR><BR>      /***************** 参数说明 **********************/<BR>      /*   m_约束方程个数(基变量个数),n_非基变量个数   */<BR>      /*   m2-m+2整个变量,(*a)[X][Y]存放初始数据       */<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)[X][Y],<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)[m1][mn1]-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)[mn1];<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)[m2][mn1]);<BR>      return 0;<BR>    }<BR>     c=1e8;<BR>     for(i=1;i&lt;=m;i++)<BR>       {<BR>     if((*a)[j0]&gt;1e-8)<BR>        {<BR>          g=(*a)[mn1]/(*a)[j0];<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)[i0]=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)[i0][j]/(*a)[i0][j0];<BR>           (*a)[i0][j]=g;<BR>         for(i=1;i&lt;=m2;i++)<BR>           {<BR>         if((i==i0)||(!(l1==1)&amp;(i==m1)))<BR>            continue;<BR>         (*a)[j]=(*a)[j]-(*a)[j0]*g;<BR>           }<BR>       }<BR>       for(i=1;i&lt;=m2;i++)<BR>      (*a)[j0]=0;<BR>       (*a)[i0][j0]=1;<BR>       goto leap1;<BR>}  <BR>main()<BR>{<BR>  float a[5][7]={{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[3];<BR>  float x[3];<BR>  clrscr();<BR>  xi_sm(2,3,4,6,0,&amp;a,&amp;k,&amp;x);<BR>}</FONT><BR></FONT></P>
回复
分享到:

使用道具 举报

发表于 2005-10-10 22:11 | 显示全部楼层
版主可以讲讲没部迭代的原理吗。[em01]
 楼主| 发表于 2005-10-11 11:34 | 显示全部楼层

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

<DIV class=quote><B>以下是引用<I>aya331</I>在2005-10-10 22:11:22的发言:</B><BR>版主可以讲讲没部迭代的原理吗。[em01]</DIV>
<P>没部迭代是什么意思?没太看懂,请原谅</P>
发表于 2005-10-11 22:51 | 显示全部楼层
这个程序应该是把单纯型表中两阶法计算过程用c实现的程序。我的意思是可否解释下程序每部运算的过程,谢谢了。
发表于 2005-10-16 23:31 | 显示全部楼层
谢谢分享好资源
发表于 2006-4-1 16:29 | 显示全部楼层
编译出错了
发表于 2006-4-6 16:24 | 显示全部楼层
xiexie[em01][em01]
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-13 03:00 , Processed in 0.053442 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表