zoukankan      html  css  js  c++  java
  • 单纯形法实现一维管材排料最优化

    单纯形法实现一维管材排料最优化

    #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 danchunxing1();
    int danchunxing2(int a);
    void danchunxing3(int a,int b);
    int danchunxing1()
    {
    int i,k=0;
    int flag=0;
    float min=0;
    for(i=0;i<n;i++)
    if(delta[i]>=0)
    flag=1;
    else {flag=0;break;}
    if(flag==1)
    return -1;
    for(i=0;i<n;i++)
    {
       if(min>delta[i])
       {min=delta[i];k=i;}
    }
    return k;
    }
    int danchunxing2(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(" 该线性规划无最优解! "); 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 danchunxing3(int p,int q)
    {
    int i,j,c,l;
    float temp1,temp2,temp3;
    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)
       if(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;
       }
    }
    temp3=delta[l];
    for(i=0;i<n;i++)
    delta[i]=delta[i]-A[c][i]*temp3;
      
    }

    void print()
    {
    int i,j=0;
    printf(" -------------------------------------------------------------------------- ");
    for(i=0;i<m;i++)
    {
       printf("%8.2f X(%d) %8.2f ",CB[i],num[i],b[i]);
       for(j=0;j<n;j++)
       printf("%8.2f ",A[i][j]);
       printf(" ");
    }
    printf(" -------------------------------------------------------------------------- ");
    printf(" ");
    for(i=0;i<n;i++)
    printf(" %8.2f",delta[i]);
    printf(" -------------------------------------------------------------------------- ");
    }
    void input()
    {
    int i,j; /*循环变量*/
    int k;
    printf("请输入方程组的系数矩阵A(%d行%d列): ",m,n);
    for(i=0;i<m;i++)
    for(j=0;j<n;j++)
    scanf("%f",&A[i][j]);

    printf(" 请输入初始基变量的数字代码num矩阵: ");
    for(i=0;i<m;i++)
    scanf("%d",&num[i]);

    printf(" 请输入方程组右边的值矩阵b: ");
    for(i=0;i<m;i++)
    scanf("%f",&b[i]);
    printf(" 请输入目标函数各个变量的系数所构成的系数阵C: ");
    for(i=0;i<n;i++)
    scanf("%f",&C[i]);
    for(i=0;i<n;i++)
    delta[i]=C[i];

    for(i=0;i<m;i++)
    {
       k=num[i]-1;
       CB[i]=C[k];
    }
    }
    main()
    {
    int i,j=0;
    int p,q,temp;
    input();
    printf(" -------------------------------------------------------------------------- ");
    printf(" CB XB b ");
    for(i=0;i<n;i++)
    printf(" X(%d) ",i+1);
    for(i=0;i<n;i++)
    x[i]=0;
    printf(" ");
    while(1)
    {
       q=danchunxing1();
       if(q==-1)
       {
        print();
        printf(" 所得解已经是最优解! ");
        printf(" 最优解为: ");
        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=danchunxing2(q);
       printf(" p=%d,q=%d",p,q);
       if(q==-1) break;
       danchunxing3(p,q);
    }
    }
    运行结果如下:
    请输入方程组的系数矩阵A(3行5列):
    1 2 1 0 0
    4 0 0 1 0
    0 4 0 0 1
    请输入初始基变量的数字代码num矩阵:
    3 4 5
    请输入方程组右边的值矩阵b:
    8 16 12
    请输入目标函数各个变量的系数所构成的系数阵C:
    -2 -3 0 0 0
    --------------------------------------------------------------------------
            CB      XB      b         X(1)    X(2)    X(3)    X(4)    X(5)
    --------------------------------------------------------------------------
        0.00        X(3)     8.00      1.00     2.00     1.00     0.00     0.00
        0.00        X(4)    16.00      4.00     0.00     0.00     1.00     0.00
        0.00        X(5)    12.00      0.00     4.00     0.00     0.00     1.00
    --------------------------------------------------------------------------
                                 -2.00     -3.00      0.00      0.00      0.00
    --------------------------------------------------------------------------
    p=2,q=1
    --------------------------------------------------------------------------
        0.00        X(3)     2.00      1.00     0.00     1.00     0.00    -0.50
        0.00        X(4)    16.00      4.00     0.00     0.00     1.00     0.00
       -3.00        X(2)     3.00      0.00     1.00     0.00     0.00     0.25
    --------------------------------------------------------------------------
                                 -2.00      0.00      0.00      0.00      0.75
    --------------------------------------------------------------------------
    p=0,q=0
    --------------------------------------------------------------------------
       -2.00        X(1)     2.00      1.00     0.00     1.00     0.00    -0.50
        0.00        X(4)     8.00      0.00     0.00    -4.00     1.00     2.00
       -3.00        X(2)     3.00      0.00     1.00     0.00     0.00     0.25
    --------------------------------------------------------------------------
                                  0.00      0.00      2.00      0.00     -0.25
    --------------------------------------------------------------------------
    p=1,q=4
    --------------------------------------------------------------------------
       -2.00        X(1)     4.00      1.00     0.00     0.00     0.25     0.00
        0.00        X(5)     4.00      0.00     0.00    -2.00     0.50     1.00
       -3.00        X(2)     2.00      0.00     1.00     0.50    -0.13     0.00
    --------------------------------------------------------------------------
                                  0.00      0.00      1.50      0.13      0.00
    --------------------------------------------------------------------------
    所得解已经是最优解!
    最优解为:
    x1=4.00 x2=2.00 x3=0.00 x4=0.00 x5=4.00 ZB=14.00

                 Press any key to continue
  • 相关阅读:
    汉诺塔解法解析
    scrapy 集成到 django(三)
    scrapy 集成到 django(二)
    scrapy 集成到 django(一)
    日记-2017-7-26-javascript
    日记-2017-7-25-django/admin-Levenshtein
    日记-2017-7-24-cp-css-django/media
    二叉树 4 种排序方式
    归并排序 / 快排
    django-import-export 插件
  • 原文地址:https://www.cnblogs.com/mjgw/p/12562382.html
Copyright © 2011-2022 走看看