编单纯形法老出现段错误,帮我看看啊
如题,下面贴上程序,程序很乱,不好意思
#include"stdio.h"
#include<math.h>
#include<iostream.h>
void phalanx(double *a,double *a0,int *is,int m,int n)
{int i,j,k=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
a0[k]=a[m*(i-1)+is[j]-1];
k++;
}
}
void interchange (double * x,int n,double * y)
{
int i,j;
double *temp=new double[n*n];
for (i=1;i<=n;i++)
for(j=1;j<=n;j++)
temp[(i-1)*n+j-1]=x[(j-1)*n+i-1];
for (i=1;i<=n*n;i++)
y[i-1]=temp[i-1];
delete[] temp;
}
void matrix_mult(double * A,double * B,double * C,int m,int r,int n)
{
int i,j,k;
double * temp = new double[m*n];
for (i = 1;i <= m;i++)
for (j = 1;j <= n;j++)
{
temp[(i-1)*n+j-1] = 0;
for (k = 1;k <= r;k++)
temp[(i-1)*n+j-1] += A[(i-1)*r+k-1] * B[(k-1)*n+j-1];
}
for (i = 1;i <= m*n;i++)
C[i-1] = temp[i-1];
delete []temp;
}
double matrix_det(double * A,int n)
{
double det=0;
if (n==1)
{
det=A[n-1];
}
else if(n==2)
{
det = A[0]*A[3]-A[1]*A[2];
}
else if(n>2)
{
int i,j,k,m;
double * temp=new double[(n-1)*(n-1)];
for (k=1;k<=n;k++)
{
m=1;
for(i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
if (i!=1&&j!=k)
{
temp[m-1]=A[(i-1)*n+j-1];
m++;
}
}
if (k%2 == 1)
{
det+=A[k-1]*matrix_det(temp,n-1);
}
else
{
det-=A[k-1]*matrix_det(temp,n-1);
}
}
delete[] temp;
}
return det;
}
double matrix_alg_cofactor(double * A,int n,int k)
{
int i,j,m,ai,aj;
double ac;
double * temp = new double [(n-1)*(n-1)];
ai = (k-1)/n+1;
aj = (k-1)%n+1;
m=1;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if (i!=ai&&j!=aj)
{
temp[m-1]=A[(i-1)*n+j-1];
m++;
}
}
ac = matrix_det(temp,n-1);
delete[] temp;
if ((ai+aj) %2 == 0)
{
return ac;
}
else
{
return 0-ac;
}
}
double matrix_inverse(double * A,double * B,int n)
{
double det = matrix_det(A,n);
if (det != 0)
{
int i;
double * temp = new double[n*n];
for (i=1;i<=n*n;i++)
temp[i-1]=matrix_alg_cofactor(A,n,i)/det;
for (i =1;i<=n*n;i++)
B[i-1]=temp[i-1];
interchange(B,n,B);
delete[] temp;
return 1;
}
else
{
return -1;
}
}
void instead(double *a,double *a0,double *b,double *c,double *xbest,int *is,int m,int n)
{
int i,j,s,h,t,e,d,g,r,test,f=0;
double k,z,co;
double *temp=new double [n*(m-n)];
double *x=new double [n];
double *aj=new double [n];
double *y=new double[n];
double *ct=new double[n];
double *a1=new double[n*n];
do{
matrix_inverse(a0,a1,n);
matrix_mult(a1,b,x,n,n,1);
for(d=0;d<m;d++)
{
for(e=0;e<n;e++)
{
if(d==(is[e]-1)){break;}
else f++;
}
if(f==(n-1))
{
for(g=0;g<n;g++)
aj[g]=a[g*m+d];
break;
}
}
matrix_mult(a1,aj,y,n,n,1);
k=x[0]/y[0];
j=1;
for(i=0;i<n;i++)
{
if(x[i]/y[i]<k)
{
k=x[i]/y[i];
j=i+1;
}
}
test=0;
for(i=0;i<m;i++)
{//
if(i!=(is[i]-1))
{//
for(r=0;r<n;r++)
{//
temp[s]=a[r*m+i];
s++;
}
co=c[i];
matrix_mult(a1,temp,y,n,n,1);
interchange (c,n,ct);
matrix_mult(ct,y,&z,n,n,1);
if((z-co)<0)
{//
test++;
for(t=0;t<n;t++)
{//
if(is[t]==j)
{//
is[t]=i+1;
break;
}
}
phalanx(a,a0,is,m,n);
break;
}
}
}
}while((double)test>0.000001);
if((double)test<0.000001)
for(i=0;i<m;i++)
{
for(h=0;h<n;h++)
{
if(i==(is[h]-1))
{xbest[i]=x[i];
break;
}
else xbest[i]=0;
}
}
delete[] temp;
delete[] x;
delete[] aj;
delete[] y;
}
int main()
{
int i;
double *A0=new double[4];
double *Xbest=new double[5];
double A[][5]={{4,2,1,1,0},{1,3,3,2,0}};
double B[][1]={{2},{1}};
double C[5]={2,4,3,3,0};
int IS[2]={1,3};
phalanx(A,A0,IS,5,2);
instead(A,A0,B,C,Xbest,IS,5,2);
printf("best solution is ");
for(i=0;i<5;i++)
{
printf("%f",Xbest[i]);
}
delete[] A0;
delete[] Xbest;
return 0;
}
问题点数:100、回复次数:10Top
1 楼edeth23()回复于 2006-06-05 09:28:06 得分 0
在Linux下编译成功的,就是运行的时候出现段错误了,不知道哪错了,帮忙看看啊Top
2 楼jixingzhong(瞌睡虫·星辰)回复于 2006-06-05 14:13:14 得分 25
检查一下 指针 ....Top
3 楼jixingzhong(瞌睡虫·星辰)回复于 2006-06-05 14:50:53 得分 25
基本就是指针操作了非法内存 ....Top
4 楼jixingzhong(瞌睡虫·星辰)回复于 2006-06-05 14:56:42 得分 25
很多函数的 参数类型 不匹配,
多维数组 传递时候需要提供 第二维的长度
比如:
void phalanx(double *a,double *a0,int *is,int m,int n)
==》
void phalanx(double a[][5],double *a0,int *is,int m,int n)Top
5 楼edeth23()回复于 2006-06-05 22:38:18 得分 0
改了不行啊,无法匹配了,错误改不正了。。急Top
6 楼SamuelKevin(曼陀罗)回复于 2006-06-06 02:53:50 得分 25
还不如把你的题目要求说出来啊 我一看代码 头痛啊Top
7 楼edeth23()回复于 2006-06-06 10:24:33 得分 0
函数优化 ABC如上,目标函数z=CTx (CT是C矩阵的转置)Ax=B,
以A中任选n个线性无关的列组成基A0,矩阵A中任一列Aj都可写成A0的线性组合。 假设用Aj代替取代A0r,A0r是A0中的列
1,求进入变量 Zj=CT*Yj, Xb=A0^(-1) *B, Yj=A0^(-1) *Aj
z-c 小于0的选相对应的x为进入变量
2。选择退出变量
xbi/yij i=0,1...n 谁小谁退出
3。当所有的z-c都大于0的时候,迭代结束,得出最优解Top
8 楼edeth23()回复于 2006-06-07 12:39:02 得分 0
lz自己终于弄出来了,错误很多,改得面目全非了,粗心的地方也很多,第一次写这么长的,以后出错的话看来得自己好好检查了,重新思考流程,所以分是不是加给自己呢。程序不贴了吧,呵呵,万一有人想知道的话留言好了俄。Top
9 楼edeth23()回复于 2006-06-07 12:43:38 得分 0
不过跟楼上说的多维数组传递没什么关系,用指针没错的,错的是声明 像A[0],不是直接ATop
10 楼luray()回复于 2006-06-21 17:10:38 得分 0
我也要编单纯形法的程序,你的程序还没仔细看,先请教一下。
1 你用的是单纯形还是改进单纯形
2 第一个可行基的确定方法是。。。。,就是用高斯迭代求出的吗?用辅助方法求编写程序好像有点复杂。
希望和你交流一下:)Top




