CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

编单纯形法老出现段错误,帮我看看啊

楼主edeth23()2006-06-04 20:14:44 在 C/C++ / C语言 提问

如题,下面贴上程序,程序很乱,不好意思  
  #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

相关问题

关键词

得分解答快速导航

  • 帖主:edeth23
  • jixingzhong
  • jixingzhong
  • jixingzhong
  • SamuelKevin

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo