哪位兄弟可以将由C实现的“单纯形法”的过程---翻译成C#的程序,贴内有C的源程序,谢谢参与!

fphuang 2005-05-17 04:33:02
/*本程序是单纯形法,参考书目:河海大学<吴凤平>运筹学方法与应用*/
#include<stdio.h>
#include<math.h>
#define X 5
#define Y 7
void xi_max(int *m2,int *mn1,float *c,int *is,int *ir,int *j0,float (*a)[X][Y])
{
int j;
*c=0;
for(j=1;j<=*is;j++)
{
if((*a)[*ir][j]-*c>0)
{
*c=(*a)[*ir][j];
*j0=j;
}
}
}

/***************** 参数说明 **********************/
/* m_约束方程个数(基变量个数),n_非基变量个数 */
/* m2-m+2整个变量,(*a)[X][Y]存放初始数据 */
/* (*k)[]存放基变量脚标,(*x)存放基变量最优值 */
/********* http://happyyangxu.home.sunbo.net*******/
int xi_sm(int m,int n,int m2,int mn1,int l1,float (*a)[X][Y],
int(*k)[],float(*x)[])
{
int i,m1,mn,j0,i0,j;
float c,g;
m1=m+1;
mn=m+n;
for(i=1;i<=m;i++)
(*k)[i]=n+i;
leap1:
if(l1-1==0)
xi_max(&m2,&mn1,&c,&mn,&m1,&j0,a);
else
{
leap2: if(l1-50==0)
xi_max(&m2,&mn,&c,&n,&m2,&j0,a);
else
xi_max(&m2,&mn1,&c,&mn,&m2,&j0,a);
}
c-=1e-8;
if((c<=0)&&(l1==1)&&((*a)[m1][mn1]-1e-8>0))
{
printf("\n\t*********Not min&&No solution**********\n");
return(-1);
}
if((c<0)&&(l1==1))
{
l1=50;
goto leap2;
}
if(c<=0)
{
for(i=1;i<=m;i++)
(*x)[i]=(*a)[i][mn1];
printf("\n\t********Optimal solution********\n");
for(i=1;i<=m;i++)
printf("\ni=%d,x[i]=%f\n",(*k)[i],(*x)[i]);
printf("\nF=%f\n",(*a)[m2][mn1]);
return 0;
}
c=1e8;
for(i=1;i<=m;i++)
{
if((*a)[i][j0]>1e-8)
{
g=(*a)[i][mn1]/(*a)[i][j0];
if(g-c<0);
{
c=g;
i0=i;
}
}
}
if(c==1e+8)
{
printf("\n\t*******Lp no solution********\n");
return -3;
}
(*k)[i0]=j0;
for(j=1;j<=mn1;j++)
{
if((j==j0)||(l1==50)&&(n<j)&&(j<mn1))
continue;
g=(*a)[i0][j]/(*a)[i0][j0];
(*a)[i0][j]=g;
for(i=1;i<=m2;i++)
{
if((i==i0)||(!(l1==1)&(i==m1)))
continue;
(*a)[i][j]=(*a)[i][j]-(*a)[i][j0]*g;
}
}
for(i=1;i<=m2;i++)
(*a)[i][j0]=0;
(*a)[i0][j0]=1;
goto leap1;
}
main()
{
float a[5][7]={{0,0,0, 0, 0,0,0},
{0,3,-4,3, 1,0,12},
{0,3,0, 6, 0,1,12},
{0,0,0, 0, 0,0,0},
{0,69,0,144,0,0,300}};
int k[3];
float x[3];
clrscr();
xi_sm(2,3,4,6,0,&a,&k,&x);
}
...全文
236 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
NowCan 2005-07-05
  • 打赏
  • 举报
回复
不是 le-8 而是1e-8 相当于1*10^(-8) 0.00000008
^ 搞笑啊???
virm 2005-07-04
  • 打赏
  • 举报
回复
zlcc123(思老慕庄) ( ) 信誉:100
c-=le-8;// le 你已经定义了么????
----------------------
不是 le-8 而是1e-8 相当于1*10^(-8) 0.00000008
zlcc123 2005-07-04
  • 打赏
  • 举报
回复
你的这段代码好像有问题啊?
在方法xi_sm(...)中有: c-=le-8;// le 你已经定义了么????
我到happyyangxu.home.sunbo.net网站上去找,没找到这段代码,又去图书馆,可是吴凤平的<运筹学方法与应用>里只有算法描述,没有代码....
不过大体上应该是这样的,你回去再试一试吧,
using System;

public Class1
{
public Class1(){};
public const int X=5;
public const int Y=7;
//在c#中不提倡指针,所以方法void xi_max(int *m2,int *mn1,float *c,int *is,int *ir,int
//*j0,float (*a)[X][Y])变为:
void xi_max(ref int m2,ref int mn1,ref float c,ref int is,ref int ir,ref int j0,ref float a[X][Y])
{ int j,c=0;
for(j=1;j<=is;j++)
{ if((a[ir][j]-c>0)
{
c=a[ir][j];
j0=j;}}}

方法int xi_sm(int m,int n,int m2,int mn1,int l1,float (*a)[X][Y],
int(*k)[],float(*x)[])
依次类推,只是2个goto heap有点麻烦,可以采用循环的形式..
int xi_sm(int m,int n,int m2,int mn1,int l1,ref float a[X][Y],ref int k[],ref float x[])
{
int i,m1,mn,j0,i0,j;
float c,g;
m1=m+1;
mn=m+n;
for(i=1;i<=m;i++)
k[i]=n+i;
while(true)
{
if(l1-1==0)
xi_max(ref m2,ref mn1,ref c,ref mn,ref m1,ref j0,a);
while(true)//这个while(true){}就对应着goto leap2---leap2结构...
{
if(l1-50==0)
xi_max(ref m2,ref mn,ref c,ref n,ref m2,ref j0,a);
if((l1-1)!=0&&(l1-50)!=0)
xi_max(ref m2,ref mn1,ref c,ref mn,ref m2,ref j0,a);
c-=1e-8;//?????????????????????????????????????????
if((c<=0)&&(l1==1)&&((*a)[m1][mn1]-1e-8>0))
{
Console.WriteLine("\n\t*********Not min&&No solution**********\n");
return(-1);
}
if((c<0)&&(l1==1))
{
l1=50;}}
.............

}

public static void Main(sting[] Args)
{
float a[5][7]={{0,0,0, 0, 0,0,0},
{0,3,-4,3, 1,0,12},
{0,3,0, 6, 0,1,12},
{0,0,0, 0, 0,0,0},
{0,69,0,144,0,0,300}};
int k[3];
float x[3];
clrscr();
xi_sm(2,3,4,6,0,ref a,ref k,ref x);
}

}




lovebanyi 2005-05-27
  • 打赏
  • 举报
回复
晕啊。用了那么多的指针。C#里很少用这个了。搞不定

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧