线性规划的问题,老是得不到结果,帮忙看看

wheagle 2003-05-26 07:02:15

#include "stdio.h"
#include "stdlib.h"
#include "math.h"

int dcinv(a,n)
int n;
double a[];
{ int *is,*js,i,j,k,l,u,v;
double d,p;
is=malloc(n*sizeof(int));
js=malloc(n*sizeof(int));
for (k=0; k<=n-1; k++)
{ d=0.0;
for (i=k; i<=n-1; i++)
for (j=k; j<=n-1; j++)
{ l=i*n+j; p=fabs(a[l]);
if (p>d) { d=p; is[k]=i; js[k]=j;}
}
if (d+1.0==1.0)
{ free(is); free(js); printf("err**not inv\n");
return(0);
}
if (is[k]!=k)
for (j=0; j<=n-1; j++)
{ u=k*n+j; v=is[k]*n+j;
p=a[u]; a[u]=a[v]; a[v]=p;
}
if (js[k]!=k)
for (i=0; i<=n-1; i++)
{ u=i*n+k; v=i*n+js[k];
p=a[u]; a[u]=a[v]; a[v]=p;
}
l=k*n+k;
a[l]=1.0/a[l];
for (j=0; j<=n-1; j++)
if (j!=k)
{ u=k*n+j; a[u]=a[u]*a[l];}
for (i=0; i<=n-1; i++)
if (i!=k)
for (j=0; j<=n-1; j++)
if (j!=k)
{ u=i*n+j;
a[u]=a[u]-a[i*n+k]*a[k*n+j];
}
for (i=0; i<=n-1; i++)
if (i!=k)
{ u=i*n+k; a[u]=-a[u]*a[l];}
}
for (k=n-1; k>=0; k--)
{ if (js[k]!=k)
for (j=0; j<=n-1; j++)
{ u=k*n+j; v=js[k]*n+j;
p=a[u]; a[u]=a[v]; a[v]=p;
}
if (is[k]!=k)
for (i=0; i<=n-1; i++)
{ u=i*n+k; v=i*n+is[k];
p=a[u]; a[u]=a[v]; a[v]=p;
}
}
free(is); free(js);
return(1);
}


void damul(a,b,m,n,k,c)
int m,n,k;
double a[],b[],c[];
{ int i,j,l,u;
for (i=0; i<=m-1; i++)
for (j=0; j<=k-1; j++)
{ u=i*k+j; c[u]=0.0;
for (l=0; l<=n-1; l++)
c[u]=c[u]+a[i*n+l]*b[l*k+j];
}
return;
}





int hclplq(a,b,c,m,n,x)
int m,n;
double a[],b[],c[],x[];
{ int i,mn,k,j,l,*js;
double s,z,dd,y,*p,*d;
js=malloc(m*sizeof(int));
p=malloc(m*m*sizeof(double));
d=malloc(m*(m+n)*sizeof(double));
for (i=0; i<=m-1; i++) js[i]=n+i;
mn=m+n; s=0.0;
while (1==1)
{ for (i=0; i<=m-1; i++)
for (j=0; j<=m-1; j++)
p[i*m+j]=a[i*mn+js[j]];
l=dcinv(p,m);
if (l==0)
{ x[n]=s; free(js); free(p);
free(d); return(l);
}
damul(p,a,m,m,mn,d);
for (i=0; i<=mn-1; i++) x[i]=0.0;
for (i=0; i<=m-1; i++)
{ s=0.0;
for (j=0; j<=m-1; j++)
s=s+p[i*m+j]*b[j];
x[js[i]]=s;
}
k=-1; dd=1.0e-35;
for (j=0; j<=mn-1; j++)
{ z=0.0;
for (i=0; i<=m-1; i++)
z=z+c[js[i]]*d[i*mn+j];
z=z-c[j];
if (z>dd) { dd=z; k=j;}
}
if (k==-1)
{ s=0.0;
for (j=0; j<=n-1; j++)
s=s+c[j]*x[j];
x[n]=s; free(js); free(p);
free(d); return(1);
}
j=-1;
dd=1.0e+20;
for (i=0; i<=m-1; i++)
if (d[i*mn+k]>=1.0e-20)
{ y=x[js[i]]/d[i*mn+k];
if (y<dd) { dd=y; j=i;}
}
if (j==-1)
{ x[n]=s; free(js); free(p);
free(d); return(0);
}
js[j]=k;
}
}

void main()
{ int i;
double x[6];
static double a[3][6]={ {1.0,2.0,7.0,1.0,0.0,0.0},
{1.0,4.0,13.0,0.0,1.0,0.0},{0.0,2.0,8.0,0.0,0.0,1.0}};
static double b[3]={10.0,18.0,13.0};
static double c[6]={-4.0,-9.0,-26.0,0.0,0.0,0.0};
i=hclplq(a,b,c,3,3,x);
printf("\n");
if (i!=0)
{ for (i=0; i<=5; i++)
printf("x(%2d)=%e\n",i,x[i]);
printf("\n");
}
}
...全文
84 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
greening 2003-05-28
  • 打赏
  • 举报
回复
错误太多,改了一阵,通过了调试,只是不知道合不合你的结果。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int dcinv(double a[],int n)
{ int *is,*js,i,j,k,l,u,v;
double d,p;
is=(int*)malloc(n*sizeof(int));
js=(int*)malloc(n*sizeof(int));
for (k=0; k<=n-1; k++)
{ d=0.0;
for (i=k; i<=n-1; i++)
for (j=k; j<=n-1; j++)
{ l=i*n+j; p=fabs(a[l]);
if (p>d) { d=p; is[k]=i; js[k]=j;}
}
if (d+1.0==1.0)
{ free(is); free(js); printf("err**not inv\n");
return(0);
}
if (is[k]!=k)
for (j=0; j<=n-1; j++)
{ u=k*n+j; v=is[k]*n+j;
p=a[u]; a[u]=a[v]; a[v]=p;
}
if (js[k]!=k)
for (i=0; i<=n-1; i++)
{ u=i*n+k; v=i*n+js[k];
p=a[u]; a[u]=a[v]; a[v]=p;
}
l=k*n+k;
a[l]=1.0/a[l];
for (j=0; j<=n-1; j++)
if (j!=k)
{ u=k*n+j; a[u]=a[u]*a[l];}
for (i=0; i<=n-1; i++)
if (i!=k)
for (j=0; j<=n-1; j++)
if (j!=k)
{ u=i*n+j;
a[u]=a[u]-a[i*n+k]*a[k*n+j];
}
for (i=0; i<=n-1; i++)
if (i!=k)
{ u=i*n+k; a[u]=-a[u]*a[l];}
}
for (k=n-1; k>=0; k--)
{ if (js[k]!=k)
for (j=0; j<=n-1; j++)
{ u=k*n+j; v=js[k]*n+j;
p=a[u]; a[u]=a[v]; a[v]=p;
}
if (is[k]!=k)
for (i=0; i<=n-1; i++)
{ u=i*n+k; v=i*n+is[k];
p=a[u]; a[u]=a[v]; a[v]=p;
}
}
free(is); free(js);
return(1);
}


void damul(double a[],double b[],int m,int n,int k,double c[])
{ int i,j,l,u;
for (i=0; i<=m-1; i++)
for (j=0; j<=k-1; j++)
{ u=i*k+j; c[u]=0.0;
for (l=0; l<=n-1; l++)
c[u]=c[u]+a[i*n+l]*b[l*k+j];
}
return;
}





int hclplq(double a[],double b[],double c[],int m,int n,double x[])
{ int i,mn,k,j,l,*js;
double s,z,dd,y,*p,*d;
js=(int*)malloc(m*sizeof(int));
p=(double*)malloc(m*m*sizeof(double));
d=(double*)malloc(m*(m+n)*sizeof(double));
for (i=0; i<=m-1; i++) js[i]=n+i;
mn=m+n; s=0.0;
while (1==1)
{ for (i=0; i<=m-1; i++)
for (j=0; j<=m-1; j++)
p[i*m+j]=a[i*mn+js[j]];
l=dcinv(p,m);
if (l==0)
{ x[n]=s; free(js); free(p);
free(d); return(l);
}
damul(p,a,m,m,mn,d);
for (i=0; i<=mn-1; i++) x[i]=0.0;
for (i=0; i<=m-1; i++)
{ s=0.0;
for (j=0; j<=m-1; j++)
s=s+p[i*m+j]*b[j];
x[js[i]]=s;
}
k=-1; dd=1.0e-35;
for (j=0; j<=mn-1; j++)
{ z=0.0;
for (i=0; i<=m-1; i++)
z=z+c[js[i]]*d[i*mn+j];
z=z-c[j];
if (z>dd) { dd=z; k=j;}
}
if (k==-1)
{ s=0.0;
for (j=0; j<=n-1; j++)
s=s+c[j]*x[j];
x[n]=s; free(js); free(p);
free(d); return(1);
}
j=-1;
dd=1.0e+20;
for (i=0; i<=m-1; i++)
if (d[i*mn+k]>=1.0e-20)
{ y=x[js[i]]/d[i*mn+k];
if (y<dd) { dd=y; j=i;}
}
if (j==-1)
{ x[n]=s; free(js); free(p);
free(d); return(0);
}
js[j]=k;
}
}

int main()
{ int i;
double x[6];
static double a[3][6]={ {1.0,2.0,7.0,1.0,0.0,0.0},
{1.0,4.0,13.0,0.0,1.0,0.0},{0.0,2.0,8.0,0.0,0.0,1.0}};
static double b[3]={10.0,18.0,13.0};
static double c[6]={-4.0,-9.0,-26.0,0.0,0.0,0.0};
i=hclplq(*a,b,c,3,3,x);
printf("\n");
if (i!=0)
{ for (i=0; i<=5; i++)
printf("x(%2d)=%e\n",i,x[i]);
printf("\n");
}
system("pause");
return 0;
}
David2008 2003-05-26
  • 打赏
  • 举报
回复
你所谓的规划有扫描要求?
没有要求,我们怎么帮 你看啊
而且,没有注释

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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