理论部分不解释了, 就是粘个实验课的代码,按照书上的算法写的,仅仅是把课本上的样例过了,有bug可能难免,欢迎指出。

Sample 1.

$$ \left\{
\begin{aligned}
min z = 5x_1+21x_3\\
s.t.\,\,x_1-x_2+6x_3-x_4=2 \\
x_1+x_2+2x_3-x_5=1\\
x_j\geq 0,\,j=1,\dots,5 \\
\end{aligned}
\right.
$$

input:

5 2
1 -1 6 -1 0
1 1 2 0 -1
5 0 21 0 0
2 1

answer:

63/8

Sample 2.

$$ \left\{
\begin{aligned}
min z = 3x_1+2x_2+x_3\\
s.t.\,\,x_1+2x_2+x_3=15 \\
2x_1+5x_3=18\\
2x_1+4x_2+x_3+x_4=10\\
x_j\geq 0,\,j=1,2,3,4 \\
\end{aligned}
\right.
$$

input:

4 3
1 2 1 0
2 0 5 0
2 4 1 1
3 2 1 0
15 18 10

output:

无解

//运行环境GCC6.4.0 C++11  非VC++
//实验一 单纯性方法
#include "cmath"
#include "cstdio"
#include "vector"
#include "algorithm"
#include "iostream"
using namespace std;int N, M;
double **A;
int *mark;bool Simplex(int ROW, int COL) {//两阶段法//mark标记进基变量mark = (int *)malloc(sizeof(int)*N);for (int i = 0; i < M; i++) mark[i] = M+i;//使得添加的变量的检验数为0for (int i = 2; i < N+2; i++) {for (int j = 0; j < COL; j++) {A[1][j] += A[i][j];}}//按照单纯形方法进行迭代double maxx = -1;int pos = 0;for (int i = 0; i < N+M; i++) {if (A[1][i] > maxx) {maxx = A[1][i]; pos = i;}}while (maxx > 0) {double minn = -1;int pos1 = 0;for (int i = 0; i < N; i++) {if (A[i+2][pos] > 0) {if (minn < 0) { pos1 = i+2; minn = A[i+2][M+N]/A[i+2][pos];}else if (A[i+2][M+N]/A[i+2][pos] < minn) {pos1 = i+2;minn = A[i+2][N+M]/A[i+2][pos];}}}if (minn == -1.0) return false;double s = A[pos1][pos];for (int i = 0; i < COL; i++) {A[pos1][i] /= s;}mark[pos1-2] = pos;for (int i = 0; i < ROW; i++) {if (i == pos1) continue;s = A[i][pos];for (int j = 0; j < COL; j++) {A[i][j] -= s*A[pos1][j];}}maxx = -1;pos = 0;for (int i = 0; i < N+M; i++) {if (A[1][i] > maxx) {maxx = A[1][i]; pos = i;}}}return true;
}
int main(int argc, char const *argv[])
{printf("请输入自变量的个数和方程组的个数:");scanf("%d%d", &M, &N);A = (double **)malloc(sizeof(double *)*(N+3)); //A为单纯形表for (int i = 0; i < N+3; i++) {*(A+i) = (double *)malloc(sizeof(double)*(M+N+2));}printf("请输入约束矩阵:\n");for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {scanf("%lf", &A[i+2][j]);}}for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {if (i == j) A[i+2][j+M] = 1.0;else A[i+2][j+M] = 0.0;}}printf("请输入价值向量:\n");for (int i = 0; i < M; i++) {double t; scanf("%lf", &t);A[0][i] = -t;}for (int i = 0; i < N + M; i++) {if (i < M) A[1][i] = 0.0;else A[1][i] = -1.0;}printf("请输入右端向量:\n");A[0][N+M] = A[1][N+M] = 0.0;for (int i = 0; i < N; i++) {scanf("%lf", &A[i+2][N+M]);}//向量R中保存的是基本解向量对应的值int *R = (int *)malloc(sizeof(int)*(N+M));for (int i = 0; i < N+M; i++) R[i] = -1;if (Simplex(N+2, M+N+1)) {double g = 0.0;//辅助问题的gfor (int i = 0; i < N; i++) {R[mark[i]] = i;if (mark[i] >= M) g += A[i][M+N];}// 如果min g != 0 方程无解if (g > 0) printf("该线性方程无解!\n");else {printf("利用单纯形方法得到的解为%.6lf\n", A[0][M+N]);printf("该线性规划的一个基本可行解为:\n");for (int i = 0; i < M; i++) {if (R[i] != -1) printf("%lf\n", A[R[i]+2][M+N]);else printf("%lf\n", 0.0);}}}else printf("该线性方程无解!\n");return 0;
}

转载于:https://www.cnblogs.com/cniwoq/p/9144082.html

运筹学上机实验 - 单纯形方法的两阶段法相关推荐

  1. 运筹学两阶段法编程c语言,运筹学上机实验 - 单纯形方法的两阶段法

    理论部分不解释了, 就是粘个实验课的代码,按照书上的算法写的,仅仅是把课本上的样例过了,有bug可能难免,欢迎指出. Sample 1. $$ \left\{ \begin{aligned} min ...

  2. 凸优化笔记4(两阶段法)

    前言 下面先简要介绍两阶段法,在通过例题说明具体流程.重点看例题,有些问题在本刊其他文章中不予赘述. 一.两阶段法介绍 大M法与两阶段法都是在原问题缺少初始可行基的情况下利用引人人工变量构造人工基,以 ...

  3. 运筹学_两阶段法对偶单纯形法_week5

    目录 思维导图 例题解析 两阶段法 问题展示 解题过程 答案展示 对偶单纯形法 问题展示 解题过程 答案展示 最后吐槽 思维导图 例题解析 两阶段法 问题展示 Q:请利用两阶段法求解. 解题过程 原问 ...

  4. 运筹学matlab实验报告,运筹学上机实验报告 利用Matlab求解整数线性规划

    四川师范大学数学与软件科学学院运筹学上机实验报告. 学期:__2011_至__2012__ 第___一__ 学期 2011年11月9日 课程名称:__ 运 筹 学 ________ 专业:_信息与计算 ...

  5. 运筹学_单纯形表法_大M法/两阶段法_步骤

    文章目录 步骤 latex代码 步骤 latex代码 \begin{align} 目标函数&:\min z=\sum_{i=1}^{n}c_{i}*x_{i}\\约束条件& \left ...

  6. 利用两阶段法通过寻找基可行解求线性规划问题的最优解

    算法介绍: java代码实现: package sy1; //标准化系数矩阵 并加上人工变量 public class BzhAndJrg {public double A[][]; //原矩阵的系数 ...

  7. 两阶段法-Python实现

    Python单纯形法-两阶段法 单纯形法简介 Python代码 1.主函数 2.定义Simplex()大类 3. 将初值全部放入大矩阵T中 4.最优性检验函数 5.迭代函数: 6. 去人工变量 7.两 ...

  8. 学习笔记 | Heckman两阶段法介绍

    最近看的两篇VC文献,都是有使用到Heckman两阶段法,所以就借此机会系统学习了Heckman两阶段法 本篇内容主要学习了如下文章: 1 CJAR的带你了解Heckman两步法 2 计量经济圈的He ...

  9. 运筹系列2:线性规划两阶段法python代码

    提示:本文参考了scipy的linprog源码,对源码感兴趣的小伙伴可以直接去读源码,注释真的是非常详尽了,比代码都长. 1. 补充问题 上一节中的代码在运行时还有很多细节没有处理,这里补充两个比较重 ...

最新文章

  1. 全球自动驾驶政策概况及特征研究
  2. ecshop 属性自动组合_【深度文章】结构设计中的荷载组合剖析(下)
  3. 【Caffe实践】 多目标输出探究
  4. 11.3finally块控制的读取文件释放
  5. Weka学习二(聚类算法)
  6. 企业校园网的6大趋势
  7. nebula加入时间约束条件,查询结果没有输出
  8. AMIO编辑器开发(三):转向C++,月底遇到第二个瓶颈
  9. 在onelogin中使用OpenId Connect Implicit Flow
  10. python链接mysql报错2003_Python连接Mysql报错问题解决
  11. 长春高中计算机考试时间安排,长春部分高中期末考试时间出炉!
  12. WDCP(WDlinux Control Panel) mysql/add_user.php、mysql/add_db.php Authentication Loss
  13. ThinkPHP5.0之控制器中常用操作
  14. 《图书管理系统》毕业论文
  15. pixel 1 欧版电信破解4G,安卓P亲测可用(打电话+4G上网)
  16. 选择部门-选择员工(js)
  17. 《Real-Time Rendering 4th Edition》全文翻译 - 第5章 着色基础(下)5.5 ~ 5.6
  18. 你平时都怎么记笔记?给好学的你安利10个最好用的记笔记神器!
  19. 10g recyclebin与用户表空间限额
  20. python基础--绘制棋盘图形

热门文章

  1. linux的django路径,Ubuntu下使用Django搭建前后端分离的全栈项目
  2. 服务器芯片采购,服务器采购具体要求.pdf
  3. Proxy 补充学习笔记
  4. Git 上传文件到 码云 gitee
  5. 【BZOJ 4555】 4555: [Tjoi2016Heoi2016]求和 (NTT)
  6. 用字节流查看txt文件
  7. Windows路由表
  8. knockoutJS学习笔记06:ko数组与模板绑定
  9. 深入了解一下PYTHON中关于SOCKETSERVER的模块-B
  10. [µC/GUI 学习]µC/GUI移植