现有一个线性规划问题,要用单纯形法解,哪位GGJJ有现成解法?或者给予点拨一二,小女子这厢多谢了!
[email protected]

解决方案 »

  1.   

    你到sourceForge.net上搜索mfc,是个JAVA的数学库
      

  2.   

    MFC不是VC的类库吗?怎么
      

  3.   

    #include<stdio.h>
    #include<math.h>
    #define m 3        /*定义约束条件方程组的个数*/
    #define n 5         /*定义未知量的个数*/
    float M=1000000.0;
    float A[m][n];   /*用于记录方程组的数目和系数;*/
    float C[n];      /*用于存储目标函数中各个变量的系数*/
    float b[m];      /*用于存储常约束条件中的常数*/
    float CB[m];     /*用于存储基变量的系数*/
    float seta[m];   /*存放出基与入基的变化情况*/
    float delta[n];  /*存储检验数矩阵*/
    float x[n];
    int num[m];      /*用于存放出基与进基变量的情况*/
    float ZB=0;      /*记录目标函数值*/
    void input();
    void print();
    int huanruorder();               /*确定换入变量*/
    int huanchuorder(int a);         /*确定换出变量*/
    void quzhuorder(int a,int b);    /*实现取主变换*/
    void main()
    {
    int i,j=0;
    int p,q,temp;
    input();
    printf("\n-------------------------------------------------------------------------------\n");
    printf(" \tCB\tXB\tb\t");
    for(i=0;i<n;i++)
    printf(" X(%d)\t",i+1);
    for(i=0;i<n;i++)
    x[i]=0;
    printf("\n");
    while(1)
    {
    q=huanruorder();
    if(q==-1)
    {
         print();
         printf("\n所得解已经是最优解!\n");
         printf("\n最优解为:\n");
         for(j=0;j<m;j++)
         {
         temp=num[j]-1;
         x[temp]=b[j];
         }
         for(i=0;i<n;i++)
         {
         printf("x%d=%.2f ",i+1,x[i]);
         ZB=ZB+x[i]*C[i];
         }
         printf("ZB=%.2f",ZB);
         break;
         }
         print();
        p=huanchuorder(q);
         printf("\np=%d,q=%d",p+1,q+1);
         quzhuorder(p,q);
    }
    getchar();
    }
    int huanruorder()
    {
    int i,k=0;
    int flag=0;
    float min=0;
    for(i=0;i<n;i++) /*判定向量delta[]中是否有负值*/
    if(delta[i]>=0)
    flag=1;
    else
    {
    flag=0;
    break;
    }
    if(flag==1)     /*如果都为+数,返回 -1*/
    return -1;
    for(i=0;i<n;i++) /*找出delta[]中的最小值,并记录下标*/
    {
        if(min>delta[i])
        {
    min=delta[i];
    k=i;
    }
    }
    return k;         /*返回delta[]中的最小值的下标*/
    }
    int huanchuorder(int a)
    {
    int i,k,j;
    int flag=0;
    float min;
    k=a;
    for(i=0;i<m;i++)
    if(A[i][k]<=0)
    flag=1;
    else
    {
    flag=0;
    break;
    }
    if(flag==1)
    {
    printf("\n该线性规划无最优解!\n");
    return -1;
    }
    for(i=0;i<m;i++)
    {
        if(A[i][k]>0)
        seta[i]=b[i]/A[i][k];
        else seta[i]=M;
    }
    min=M;
    for(i=0;i<m;i++)
    {
        if(min>=seta[i])
        {
    min=seta[i];
    j=i;
    }
    }
    num[j]=k+1;
    CB[j]=C[k];
    return j;
    }
    void quzhuorder(int p,int q)
    {
    int i,j,c,l;
    float temp1,temp2,temp3=0;
    c=p;/*行号*/
    l=q;/*列号*/
    temp1=A[c][l];
    b[c]=b[c]/temp1;
    for(j=0;j<n;j++)
    A[c][j]=A[c][j]/temp1;
    for(i=0;i<m;i++)
    {
        if(i!=c&&A[i][l]!=0)
        {
         temp2=A[i][l];
        b[i]=b[i]-b[c]*temp2;    for(j=0;j<n;j++)
           A[i][j]=A[i][j]-A[c][j]*temp2;
        }
    }
    for(j=0;j<n;j++)
    {
    for(i=0;i<m;i++)
    {
    temp3+=C[num[i]-1]*A[i][j];
    }
    delta[j]=C[j]-temp3;
    temp3=0;
    }
    }
    void print()
    {
    int i,j=0;
    printf("\n-------------------------------------------------------------------------------\n");
    for(i=0;i<m;i++)
    {
        printf("%8.2f\tX(%d) %8.2f ",CB[i],num[i],b[i]);
        for(j=0;j<n;j++)
       printf("%8.2f ",A[i][j]);
       printf("\n");
    }
    printf("\n-------------------------------------------------------------------------------\n");
    printf("\t\t\t\t");
    for(i=0;i<n;i++)
    printf(" %8.2f",delta[i]);
    printf("\n-------------------------------------------------------------------------------\n");
    }
    void input()
    {
    int i,j; /*循环变量*/
    int k;
    printf("请输入方程组的系数矩阵A(%d行%d列):\n",m,n);
    for(i=0;i<m;i++)
    for(j=0;j<n;j++)
    scanf("%f",&A[i][j]);
    printf("\n请输入初始基变量的数字代码num矩阵:\n");
    for(i=0;i<m;i++)
    scanf("%d",&num[i]);
    printf("\n请输入方程组右边的值矩阵b:\n");
    for(i=0;i<m;i++)
    scanf("%f",&b[i]);
    printf("\n请输入目标函数各个变量的系数所构成的系数阵C:\n");
    for(i=0;i<n;i++)
    scanf("%f",&C[i]);
    for(i=0;i<n;i++)
    delta[i]=0;
    for(j=0;j<n;j++)
    {
    for(i=0;i<m;i++)
    {
    delta[j]+=C[num[i]-1]*A[i][j];
    }
    delta[j]=C[j]-delta[j];
    } for(i=0;i<m;i++)
    {
    k=num[i]-1;
    CB[i]=C[k];
    }
    }