//haust
//momentum

摘要:在运筹学中利用经典的单纯形法人工求解线性规划问题较为复杂,但利用计算机强大的计算能力便能够快速实现。本文利用经典的单纯形法的算法,借助传统的C语言进行实现,大大提高了适用于单纯形法的线性规划问题的运算效率。

Absrtact: in operations research, it is more complex to solve the linear programming problem by using the classical simplex method, but it can be realized quickly by using the powerful computing power of the computer. In this paper, the classical simplex algorithm is used to implement with the help of traditional C language, which greatly improves the operation efficiency of linear programming problems suitable for simplex method.
关键词:单纯形法 线性规划 C语言
一、引言
运筹学的主要目的是在决策时为管理人员提供科学依据,是实施有效管理、正确决策和现代化管理的重要方法之一,常用于解决现实中的复杂问题,尤其是改善或优化现有系统的效率。对于小规模问题,可以通过较为简单的人工计算得到答案,但对于大规模问题,便需要借助计算机强大的计算能力来完成,所以研究计算机在线性规划中的应用很有实践意义,本文仅仅是管中窥豹,出于对C语言的一些兴趣,利用经典的单纯形法的算法,借助传统的C语言进行实现,大大提高了适用于单纯形法的线性规划问题的运算效率。
二、单纯形法算法原理
线性规划问题中,若存在最优解那么一定在某个基本可行解处取得,而我们可以将所有基本可行解找出来,代入目标函数后找到最优解,但是随着问题规模的增大,寻找所有基本可行解就变得异常困难。1947年G.B.Bantzig提出了单纯形法,成为了求解线性规划问题的基本方法。即先找到一个基本可行解,判断是否为最优解,若不是,从该可行解出发,寻找另一个基本可行解,再进行最优性判断,经此有限次步骤后便能够找到LP的最优解。

参考文献
[1]于松南.长春工业大学运筹学课程设计[Z]. https://wenku.baidu.com/view/4380168552ea551811a6872f.html,2015.
[2]尚有林.运筹学(第一版)[M]. 北京:高等教育出版社,2001.

#include <stdio.h>
#include <math.h>
#pragma warning(disable:4996)
#define m 3         //定义约束方程个数
#define n 5         //定义决策变量个数
double M = 1e6;
double A[m][n];     //存储A约束矩阵
double C[n];        //存储目标函数价值系数C矩阵
double b[m];        //存储约束条件资源系数b矩阵
double CB[m];       //存储基变量系数矩阵
double seta[m];     //存放出基和入基的变化情况
double sigma[n];    //存储检验数矩阵σ
double x[n];        //存储决策变量
int num[m];         //存储出基和入基变量的情况
double Z = 0;      //记录目标函数值void input();
void print();
int FindSwapInVar();        //确定入基变量
int FindSwapOutVar(int a);  //确定出基变量
void Iterate(int a, int b); //换基迭代//确定入基变量,对于所有检验数均大于等于0时,当前解为最优解
int FindSwapInVar()
{int i, k = 0;//用k带出入基变量int flag = 1;double min = 0;for (i = 0; i < n; i++){if (sigma[i] < 0){flag = 0; break;}}if (flag == 1)//找到了咯return -1;for (i = 0; i < n; i++)//找出最大的检验数σ{if (sigma[i] < min)//求min问题按照sigma最小的为入基变量{min = sigma[i];k = i;}}return k;
}
//确定出基变量
int FindSwapOutVar(int a)
{int i, j;int flag = 1;int k = a;//a入基变量for (i = 0; i < m; i++)//如果某个数小于0的检验数,对应的列向量中所有元素≤0 该问题有无界解{if (A[i][k] > 0){flag = 0; break;}}if (flag == 1){printf("该线性规划问题有无界解、无最优解!\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;//当A[i][k]≤0的时候是不需要考虑的//然而是根据比值最小原则整的 所以给对应的卡一个很大的M}double 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 Iterate(int p, int q)
{int i, j, r, c;//row行 column列(r,l)就是转轴元r = p;//行号      p是出基变量c = q;//列号       q是入基变量double temp1 = A[r][c];double temp2, temp3;//标准化该行b[r] /= temp1;for (j = 0; j < n; j++)A[r][j] /= temp1;for (i = 0; i < m; i++)//标准化其他行{if (i != r)if (A[i][c] != 0){temp2 = A[i][c];b[i] -= temp2 * b[r];//b[r]转轴元对应bfor (j = 0; j < n; j++)A[i][j] -= temp2 * A[r][j];//A[r][j]是转轴元对应行}}//σ的迭代计算temp3 = sigma[c];for (i = 0; i < n; i++){sigma[i] -= A[r][i] * temp3;}}
//输入函数、约束条件的技术系数矩阵A、初始基变量的数字代码
//输入约束条件的资源系数b、目标函数价值系数C
void input()
{int i, j;printf("请按顺序输入方程组的系数矩阵A(共%d行%d列):\n", m, n);for (i = 0; i < m; i++)for (j = 0; j < n; j++)scanf("%lf", &A[i][j]);printf("请按顺序输入初始基变量所在列数的数字代码num矩阵:\n");for (i = 0; i < m; i++)scanf("%d", &num[i]);printf("请按顺序输入约束条件的资源系数b矩阵:\n");for (i = 0; i < m; i++)scanf("%lf", &b[i]);printf("请按顺序输入目标函数的价值系数C矩阵:\n");for (i = 0; i < n; i++)scanf("%lf", &C[i]);for (i = 0; i < n; i++)sigma[i] = C[i];for (i = 0; i < m; i++)CB[i] = C[num[i] - 1];//表示基变量的系数,因为将人类输入的转化为数组序号
}
//输出
void print()
{int i, j;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]);if (i != m - 1)printf("\n");}printf("\n--------------------------------------------------------------------------\n");printf("\t\t σ          ");for (i = 0; i < n; i++)printf(" %8.2f", sigma[i]);printf("\n--------------------------------------------------------------------------\n");
}
int main()
{int i, j, k = 1;int p, q;//q是换入变量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;while (true){q = FindSwapInVar();if (q == -1){print();printf("\n恭喜您得到最优解!\n");printf("最有解为:");for (j = 0; j < m; j++)x[num[j] - 1] = b[j];//因为x[n]对应第n+1个决策变量for (i = 0; i < n; i++){printf("x%d=%.2f ", i + 1, x[i]);Z = Z + x[i] * C[i];}printf("\n最优值为:Z* = %.2f", Z);break;}print();p = FindSwapOutVar(q);printf("\n进行第%d次迭代,迭代元位置为(%d,%d)\n", k++, p + 1, q + 1);if (q == -1) break;Iterate(p, q);}
}
//作者:夏浩momentum

单纯形法的C语言实现相关推荐

  1. 单纯形 c语言 程序,单纯形法完全c语言程序

    单纯形法完全c语言程序 更新时间:2017/2/8 13:37:00  浏览量:566  手机版 单纯形法完全c语言程序,能运行 #include "math.h" #includ ...

  2. 对偶单纯形c语言程序,通用对偶单纯形法的C语言程序.doc

    #include #include #define MAX_N 100 #define M 1000000.0; int m,n; float A[MAX_N][MAX_N],C[MAX_N],b[M ...

  3. c语言怎么做非线性规划,非线性规划中单纯形法求极值的C语言实现

    非线性规划中单纯形法求极值的C语言实现 焦作大学学报第 综合版 撇 非线性规划中单纯形法求极值的 靳 摘 要 , 语言实现 民 , 日常生活生产 中有大量求极小值的问题 . 一般计算机实现用穷举法或 ...

  4. C语言实现单纯形法与对偶单纯形法

    C语言实现单纯行法与对偶单纯行法 某次为了完成课程要求所做: 单纯形法代码如下,使用方法修改二位数组A[ip][jp], #include<stdio.h> #define ip 3 #d ...

  5. 3行6列单纯形法c语言,单纯形法

    概括:这道题是毋丈志同学的课后数学练习题,主要是关于单纯形法,指导老师为蒯老师.改进单纯形法的每一步都需要求解基矩阵的逆矩阵,而且与单纯形法不同的是,求解逆矩阵使得其不能使用表上作业法,求解过程繁琐. ...

  6. 对偶单纯形c语言程序,对偶单纯形法C语言实现.doc

    程序源代码: #include #include #define MAX_N 100 #define M 1000000.0; int m, n; double A[MAX_N][MAX_N], C[ ...

  7. 最优化评分法c语言,最优化方法及其实现(Optimization-Algorithm)C语言

    Optimization-Algorithm 优化算法--C语言 ##A Record for the Methods of Optimization.(优化算法--C语言) Author: Amoi ...

  8. 线性规划 - 用单纯形法解决整数规划问题 - (Matlab、Lingo建模)

    现实生活中,比如机器的台数,参与工作的人数,可调动的车辆数,这些数据都是整数.因此对于变量中包含整数.或者完全是整数的规划问题,我们称之为整数规划.在解决整数规划常用的算法便是单纯形法. 课题名称:任 ...

  9. 最优化方法及其实现(Optimization-Algorithm)C语言

    Optimization-Algorithm 优化算法--C语言 ##A Record for the Methods of Optimization.(优化算法--C语言) Author: Amoi ...

最新文章

  1. xp版php,PHP5.3以后的版本如何在XP中安装
  2. C# 计算IP段之间的IP列表
  3. java中上传附件怎么该名称_将附件保存到Outlook中的文件夹并重命名
  4. pytorch张量的简介与创建(代码)
  5. python人工智能——机器学习——分类算法-朴素贝叶斯算法
  6. C++ array初始化需要双层大括号
  7. linux php pdo server,linux服务器用PHP的PDO链接myql方法(php pdo)
  8. 三次样条插值_2.6 三次样条插值
  9. Backpropogation反向传播公式推导【李宏毅深度学习版】
  10. 一次通过PMP认证考试的心得分享
  11. 【C语言】整人小程序
  12. c语言编程串级控制,组态王-串级控制
  13. word批量转PDF
  14. 2021全国大学生电子设计竞赛F题(智能送药小车)国一赛后总结
  15. Linux中tomcat启动后无进程、无法访问
  16. Oracle一次性查询超过1000条数据的方法(分批查询)
  17. mysql 改列定义_如何更改MySQL列定义?
  18. Unity的Inspector
  19. Linux基础命令,个人笔记备份
  20. NUC 折腾笔记 - Linux 系统篇

热门文章

  1. (HTTP的)幂等性Idempotence
  2. 软考复盘:我的一些复习经验分享
  3. Moodle文件夹简介
  4. 《算法竞赛入门经典(第二版)》习题解答——第二章
  5. linux 时间函数
  6. 非线性系统辨识:非线性 ARX 和 Hammerstein-Wiener
  7. 鸢尾花(iris)数据集分析
  8. 计算机网络系列之集线器、交换机和路由器
  9. 进制数及其转换(二进制,十进制,十六进制)
  10. 基于51单片机的电子钟设计[本科自动化毕业设计论文,源码,实物]