声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5186|回复: 4

[C/C++] [原创]单纯形法完全c语言程序,能运行

[复制链接]
发表于 2006-5-17 16:34 | 显示全部楼层 |阅读模式

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

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

x
单纯形法完全c语言程序,每步都有说明,不足之处希望指出。
  1. #include "math.h"
  2. #include "stdio.h"
  3. #define N 2

  4. void paixu(p,n)
  5. int n;
  6. double p[];
  7. { int m,k,j,i;
  8. double d;
  9. k=0; m=n-1;
  10. while (k<m)
  11. { j=m-1; m=0;
  12. for (i=k; i<=j; i++)
  13. if (p>p[i+1])
  14. { d=p; p=p[i+1]; p[i+1]=d; m=i;}
  15. j=k+1; k=0;
  16. for (i=m; i>=j; i--)
  17. if (p[i-1]>p)
  18. { d=p; p=p[i-1]; p[i-1]=d; k=i;}
  19. }
  20. return;
  21. }
  22. double mubiao(double *x)
  23. { double y;
  24. y=x[1]-x[0]*x[0]; y=100.0*y*y;
  25. y=y+(1.0-x[0])*(1.0-x[0]);
  26. return(y);
  27. }

  28. main()
  29. { int i,j,k,l,m=0;
  30. double c,xx[N+1][N],f0[N+1],f[N+1],x0[N]={1.2,1},x1[N],s=0.0;
  31. double a,b;
  32. double xa[N],xb[N],xc[N],xe[N],xw[N],xr[N],xo[N];
  33. double fr,fe,fw,fc,fo;
  34. double aef=1.0,r=1.0,eps1=1.0e-30,eps2=1.0e-30,bt=0.5,rou=0.5;
  35. c=1.0;
  36. b=(c/(N*sqrt(2)))*(sqrt(N+1)-1);
  37. a=b+c/sqrt(2);
  38. //printf("a=%13.7e b=%13.7e ",a,b);
  39. //printf("\n");
  40. //给xx[N][N+1]赋值,每一行构成单纯形的一个定点
  41. //***********************
  42. for(i=0;i<N;i++)
  43. xx[0]=x0;
  44. for(i=1;i<N+1;i++)
  45. for(j=0;j<N;j++)
  46. {if(j==i-1)
  47. xx[j]=x0[j]+a;
  48. else
  49. xx[j]=x0[j]+b;
  50. }
  51. for (i=0;i<N+1;i++)
  52. {for (j=0;j<N;j++)
  53. printf("xx[%d][%d]%13.7e ",i,j,xx[j]);
  54. printf("\n");
  55. }
  56. loop1:
  57. //求单纯形的每个定点的函数值f0,f和x1是过渡数组
  58. printf("\n");
  59. printf("\n");
  60. for(i=0;i<N+1;i++)
  61. {for(j=0;j<N;j++)
  62. x1[j]=xx[j];
  63. f0=mubiao(x1);
  64. f=mubiao(x1);
  65. printf("f0[%d]=%13.7e f[%d]=%13.7e\n",i,f0,i,f);
  66. }
  67. printf("\n");
  68. //比较f的大小,f[0]是最小值,f[N]是最大值
  69. paixu(f,N+1);
  70. for(i=N;i>=0;i--)
  71. printf("f[%d]=%13.7e \n",i,f);
  72. //找最好点和最坏点分别是哪一个点,即xx[][]的行数
  73. for(i=0;i<N+1;i++)
  74. {if(f0==f[0])
  75. k=i;
  76. if(f0==f[N])
  77. l=i;
  78. }
  79. printf("最好点k=%d\n",k);
  80. printf("最坏点l=%d\n",l);
  81. //终止判断条件
  82. printf("f[N]-f[0]=%13.7e \n",f[N]-f[0]);
  83. if((f[N]-f[0])<eps1+eps2*fabs(f[N]))
  84. {printf("迭代次数m=%d\n",m);
  85. for(j=0;j<N;j++)
  86. printf("optx[%d]=%13.7e\n",j,xx[k][j]);
  87. printf("fmin=%13.7e\n",f[0]);
  88. }
  89. else
  90. {
  91. m=m+1;
  92. //把xx[][]中最好点移到第一行,最坏点移到最后一行
  93. for(j=0;j<N;j++)
  94. {xb[j]=xx[k][j];
  95. xx[k][j]=xx[0][j];
  96. xx[0][j]=xb[j];
  97. //
  98. xw[j]=xx[l][j];
  99. xx[l][j]=xx[N][j];
  100. xx[N][j]=xw[j];
  101. }
  102. for (i=0;i<N+1;i++)
  103. {for (j=0;j<N;j++)
  104. printf("xx[%d][%d]=%13.7e ",i,j,xx[j]);
  105. printf("\n");
  106. }
  107. //求除最坏点f[N]外其余点的中点xc[]
  108. for(i=0;i<N;i++)
  109. xa=0;
  110. for(j=0;j<N;j++)
  111. {{for(i=0;i<N;i++)

  112. xa[j]=xa[j]+xx[j];}
  113. xa[j]=xa[j]/N;
  114. }
  115. for(i=0;i<N;i++)
  116. printf("xa[%d]=%13.7e xb[%d]=%13.7e xw[%d]=%13.7e \n",i,xa,i,xb,i,xw);
  117. //求xw[N]的反射点xr[N];
  118. for(i=0;i<N;i++)
  119. {xr=xa+aef*(xa-xw);
  120. printf("xr[%d]=%13.7e ",i,xr);
  121. }
  122. printf("\n");
  123. //求xr[N]的函数值fr
  124. fr=mubiao(xr);
  125. printf("fr=%13.7e \n",fr);
  126. //判断xr与xb的好坏
  127. if(fr<=f[0])
  128. {for(i=0;i<N;i++)
  129. {xe=xr+r*(xr-xa);
  130. //printf("xe[%d]=%13.7e ",i,xe);
  131. }
  132. printf("\n");
  133. fe=mubiao(xe);
  134. if(fe<=f[0])
  135. for(j=0;j<N;j++)
  136. xx[N][j]=xe[j];
  137. else
  138. for(j=0;j<N;j++)
  139. xx[N][j]=xr[j];
  140. goto loop1;
  141. }
  142. else
  143. {
  144. fw=f[N];
  145. if(fr>=fw)
  146. {for(i=0;i<N;i++)
  147. xc=xa-bt*(xa-xw);
  148. fc=mubiao(xc);
  149. if(fc>=fw)
  150. {for(i=1;i<N+1;i++)
  151. for(j=0;j<N;j++)
  152. xx[j]=xx[0][j]-rou*(xx[j]-xx[0][j]);
  153. goto loop1;
  154. }
  155. else
  156. {for(j=0;j<N;j++)
  157. xx[N][j]=xc[j];
  158. goto loop1;
  159. }
  160. }
  161. else
  162. {if(fr>=fe)
  163. {
  164. for(i=0;i<N;i++)
  165. xo=xa+bt*(xa-xw);
  166. fo=mubiao(xo);
  167. if(fo>=fr)
  168. {for(i=1;i<N+1;i++)
  169. for(j=0;j<N;j++)
  170. xx[j]=xx[0][j]-rou*(xx[j]-xx[0][j]);
  171. goto loop1;
  172. }
  173. else
  174. {for(j=0;j<N;j++)
  175. xx[N][j]=xo[j];
  176. goto loop1;
  177. }
  178. }
  179. else
  180. {for(j=0;j<N;j++)
  181. xx[N][j]=xr[j];
  182. goto loop1;
  183. }
  184. }
  185. }
  186. }
  187. }
复制代码

[ 本帖最后由 风花雪月 于 2006-10-18 08:23 编辑 ]
回复
分享到:

使用道具 举报

发表于 2006-7-5 15:17 | 显示全部楼层

变量如何定义?

你的程序中的各个变量都代表什么意思?
谢谢!!!
发表于 2006-7-5 18:10 | 显示全部楼层
好像不能够运行啊
 楼主| 发表于 2006-7-31 23:19 | 显示全部楼层
原帖由 zhuwy16 于 2006-7-5 18:10 发表
好像不能够运行啊

我是在VC6.0中编译通过的,再试试吧!!
发表于 2006-10-7 14:47 | 显示全部楼层
我以前也编过一个,不过收敛性不怎么好.有时间试试楼主的怎么样.
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-25 04:42 , Processed in 0.071165 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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