问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言编单纯形法程序怎么写

发布网友 发布时间:2022-04-23 14:30

我来回答

1个回答

热心网友 时间:2023-05-06 14:19

#include<stdio.h>
#include<math.h>
 
intm;  //记录约束条件方程组的个数
intn;  //记录未知量的个数
floatM=1000000.0;
floatA[100][100];   //用于记录方程组的数目和系数
floatC[100];      //用于存储目标函数中各个变量的系数
floatb[100];      //用于存储常约束条件中的常数
floatCB[100];     //用于存储基变量的系数
floatseta[100];   //存放出基与入基的变化情况
floatcn[100];   //存储检验数矩阵
floatx[100];
intnum[100];    //用于存放出基与进基变量的情况
floatZ=0;   //记录目标函数值
 
voidshuru();
voidprint();
intmincz();
intfind_line(int a);
voidexchange(int a,int b);
intmain()
{
    int i,j=0;
    int p,q,temp;  //q:换入,p:换出
    shuru();
   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=mincz();
        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]);
                Z=Z+x[i]*C[i];
            }
            printf("Z=%.2f",Z);
            break;
        }
        print();
        p=find_line(q);
        printf("\np=%d,q=%d",p,q);
        if(q==-1) break;
        exchange(p,q);
    }
    return 0;
}
intmincz()
{
    int i,k=0;
    int flag=0; //检验数标记
    float min=0;
    for(i=0; i<n; i++)
        if(cn[i]>=0)
            flag=1;
        else {
            flag=0;
            break;
        }
    if(flag==1)
        return -1;
        //进行到此处,说明存在<0的检验数
        //找到最小的检验数,作为换入变量
    for(i=0; i<n; i++) {
        if(min>cn[i]) {
            min=cn[i];
            k=i;
        }
    }
    return k;
}
intfind_line(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;
}
voidexchange(int p,int q)
{
    int i,j,c,l;
    float temp1,temp2,temp3;
    c=p; //行号,换出
    l=q; //列号,换入
    temp1=A[c][l];  //A[c][l]主元
    b[c]=b[c]/temp1;
    for(j=0; j<n; j++)
        A[c][j]=A[c][j]/temp1;  //主元化为1
    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;
                //主元所在列,其余元素化为0
                for(j=0; j<n; j++)
                    A[i][j]=A[i][j]-A[c][j]*temp2;
            }
    }
    temp3=cn[l];
    for(i=0; i<n; i++)
        cn[i]=cn[i]-A[c][i]*temp3;
}
voidprint()
{
    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");
    for(i=0; i<n; i++)
        printf(" %8.2f",cn[i]);
   printf("\n--------------------------------------------------------------------------\n");
}
voidshuru()
{
    int i,j; //循环变量
    int k;
    printf("请输入线性规划问题的约束条件个数M:");
    scanf("%d",&m);
    printf("请输入线性规划问题的决策变量个数N:");
    scanf("%d",&n);
    printf("\n请输入方程组的系数矩阵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请输入初始基变量的数字代码矩阵:\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++)
        cn[i]=-C[i];
    for(i=0; i<m; i++) {
        k=num[i]-1;
        CB[i]=C[k];
    }
  }

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
WIN7不会自动安装AHCI驱动是怎么回事?每次重装系统后都得我自己安装_百... 钉钉录播课能否查看观看时长 为什么城市轨道要有身高条件 城轨交通运营管理专业现身高吗 城市轨道交通运营管理这个专业是否有身高要求 读城轨专业需要什么条件 学习城轨专业需要什么条件? 城市轨道专业最低的身高要求多少?身高158毕业出来好找工作吗? 城轨专业要求身材吗 城轨专业有身高限制吗 土豆粉丝怎么煮,买回来的土豆粉丝?要浸泡下在煮还是用开水煮烫下在放入冷水中在煮?还是直接汤烧好放入 粉丝要泡多久? 东北土豆粉做菜前用冷水泡还是热水泡啊,泡多久啊? 干土豆粉, 用冷水泡多长时间才能泡开? 土豆炖粉条粉条用热水还是凉水 三星s9来短信的时候怎么调边上的灯 乾隆通宝到底值不值钱,乾隆通宝价格表大全 乾隆通宝现在市场价格多少? (乾隆通宝)价格多少? 手指上长疣怎么去除? 我的手指上 长了个 猴子 请问怎么才能 弄掉? 我手上长了个猴子怎么才能去掉呀? 乾隆宝通大钱值多少钱 手上长了个瘊子,有什么办法去掉?曾经用剪刀剪掉了,过段时间又长出来了,而且还有刺,有什么好办法去掉 手上的瘊子怎么去掉,需要多少钱? 乾隆通宝各局价格值多少钱,市场价格 怎样把手上的瘊子去出? 乾隆通宝铜钱价格表 有什么办法可以去掉手上的瘊子??? 乾隆通宝价格表 土豆粉和成面是用冷水还是热水 lingo编写单纯形法的程序怎么写? 土豆粉条吃之前泡不泡 单纯形法的C++程序详解过程 泡粉丝用热水还是冷水 单纯形法程序用法 土豆粉怎么泡有柔劲好吃 急求运筹学单纯型法的matlab程序代码!! 求matlab单纯型方法求解线性规划代码 土豆拌粉丝凉菜的做法 急急急!!高分!!编写程序实现利用单纯形法求解线性规划问题 单纯形法的C程序 再吃粉丝前,粉丝需要泡成哪种程度? 土豆粉需要煮多久熟? 在约束最优化中,用单纯形法解线性规划的matlab程序 土豆淀粉是怎么调的,是用开水,还是冷水 实验二:MATLAB编程单纯形法求解 目标规划单纯形法的C++编程 用单纯形法求解线性规划问题 请问各位朋友:谁有两阶段单纯形法的matlab程序,先谢谢了!