#include<iostream>
#include<vector>
#include<string>
using namespace std;             //大M法   输入时 110代表>=  101代表<=  111代表=
#define M 100000                 /* 输入格式   eg: 3X(1)+2X(2)-X(3)<=20  -->  3 1 2 2 -1 3 101 20数字之间加空格,每输一行回车进入下一行,结束时 回车进入新行按ctrl+z 再回车 eg:   题1输入  min 3 1 2.5 22 1 4 2 110 403 1 2 2 110 50     */
float Get_Cb(vector<float> &v,float k){for(int i=2;i<v.size();){if(v[i]==k)return v[i-1];                               i+=2;}return 0;
}vector<float> Input_f(){vector<float> v;string s;float n;cin>>s;if(s=="max")v.push_back(0); else if(s=="min")v.push_back(1); getchar();while(cin>>n){v.push_back(n);if(getchar()=='\n')break; }return v;
}float** Input_st(vector<float> &v,int* Data){vector<vector<float>> vec;int l=0,max=0;float n;int GreaterThan_sign=0;int Equal_sign=0;vector<float> r;while(cin>>n){if(n!=0){if(n==101 || n==110 || n==111){if(n==110)GreaterThan_sign++;if(n==111)Equal_sign++;if(r[l-1]>max)max=r[l-1];}r.push_back(n);l++;}if(getchar()=='\n'){vec.push_back(r);vector<float> temp;r=temp;l=0;}}int row=vec.size()+1;int column=max+vec.size()+GreaterThan_sign+2;float** array;array=(float**)malloc(sizeof(float*)*row);for(int i=0;i<row;i++){array[i]=(float*)malloc(sizeof(float)*column);for(int j=0;j<column;j++)array[i][j]=0; } int mark=1,mark2=0;for(int i=0;i<vec.size();i++){for(int j=0;j<vec[i].size();){if(vec[i][j]==101 || vec[i][j]==110 ||vec[i][j]==111){if(vec[i][j]==101){array[i][max+1+mark2]=1;array[i][column-1]=vec[i][j+1];array[i][0]=max+1+i;mark2++;break;}else if(vec[i][j]==110){array[i][max+1+mark2]=-1;array[i][max+vec.size()-Equal_sign+mark]=1;v.push_back(M);v.push_back(max+vec.size()-Equal_sign+mark);array[i][0]=max+vec.size()-Equal_sign+mark;mark++,mark2++;array[i][column-1]=vec[i][j+1];  break;}else if(vec[i][j]==111){array[i][max+vec.size()-Equal_sign+mark]=1;v.push_back(M);v.push_back(max+vec.size()-Equal_sign+mark);array[i][0]=max+vec.size()-Equal_sign+mark;mark++;array[i][column-1]=vec[i][j+1]; break;    }}else{array[i][(int)vec[i][j+1]]=vec[i][j];j+=2;}}}array[row-1][0]=max+vec.size()-Equal_sign;for(int i=1;i<column-1;i++){for(int j=0;j<row-1;j++)array[row-1][i]+=Get_Cb(v,array[j][0])*array[j][i];array[row-1][i]=array[row-1][i]-Get_Cb(v,i);}for(int i=0;i<row-1;i++)array[row-1][(int)array[i][0]]=0;for(int i=0;i<row-1;i++)array[row-1][column-1]+=Get_Cb(v,array[i][0])*array[i][column-1];Data[0]=row;Data[1]=column; for(int i=0;i<row;i++){                //输出矩阵 for(int j=0;j<column;j++)cout<<array[i][j]<<' ';cout<<endl;}cout<<endl;   return array;
}int Get_min(float* b,int k){int min=b[1];int i=2;int temp=1;while(i<=k){if(b[i]<min){min=b[i];temp=i;}i++;}return temp;
}
int Get_max(float* b,int k){int max=b[1];int i=2;int temp=1;while(i<=k){if(b[i]>max){max=b[i];temp=i;}i++;}return temp;
}float** Eliminate(float** array,int r,int t,int row,int column){float s=array[r][t];for(int i=1;i<column;i++){array[r][i]=array[r][i]/s;}for(int i=0;i<row;i++){float k=array[i][t];if(i!=r)for(int j=1;j<column;j++){array[i][j]=array[i][j]-k*array[r][j];}}return array;
}void Print(float** array,vector<float> &v,int row,int column){int s=array[row-1][0];float a[s]={};for(int i=0;i<row-1;i++){a[(int)array[i][0]-1]=array[i][column-1];}cout<<"最优可行解X=(";for(int i=0;i<s;i++){cout<<"x"<<i+1;if(i!=s-1)cout<<",";}cout<<")"<<"=(";for(int i=0;i<s;i++){cout<<a[i];if(i!=s-1)cout<<",";}cout<<")"<<endl;if(v[0]==1)cout<<"最小值f(min)="<<array[row-1][column-1]<<endl;else cout<< "最大值f(max)="<<array[row-1][column-1]<<endl;
}void Function(float** array,vector<float> &v,int* Data){int row=Data[0];int column=Data[1];if(v[0]==1){if(array[row-1][Get_max(array[row-1],(int)array[row-1][0])]<=0){Print(array,v,row,column);}else{int k=Get_max(array[row-1],(int)array[row-1][0]);float min=M,m;int temp=-1;for(int i=0;i<row-1;i++){if(array[i][k]>0){m=array[i][column-1]/array[i][k];if(m<min){min=m;temp=i;}}}if(temp==-1){cout<<"无可行解";exit(0); }else{array=Eliminate(array,temp,k,row,column);array[temp][0]=k;}   for(int i=0;i<row;i++){                //输出矩阵 for(int j=0;j<column;j++)cout<<array[i][j]<<' ';cout<<endl;}cout<<endl;     Function(array,v,Data); }}else if(v[0]==0){if(array[row-1][Get_min(array[row-1],(int)array[row-1][0])]>=0){Print(array,v,row,column);}else{int k=Get_min(array[row-1],(int)array[row-1][0]);float min=M,m;int temp=-1;for(int i=0;i<row-1;i++){if(array[i][k]>0){m=array[i][column-1]/array[i][k];if(m<min){min=m;temp=i;}}}if(temp==-1){cout<<"无可行解";exit(0); }else{array=Eliminate(array,temp,k,row,column);array[temp][0]=k;}    for(int i=0;i<row;i++){                //输出矩阵 for(int j=0;j<column;j++)cout<<array[i][j]<<' ';cout<<endl;}cout<<endl;     Function(array,v,Data); }}
}void LP(){int a[2]={};vector<float> v=Input_f();float** array=Input_st(v,a);Function(array,v,a);
}int main(){LP();
}
题1输入
min 3 1 2.5 2
2 1 4 2 110 40
3 1 2 2 110 50题2输入
min -2 1 -3 2
1 1 -1 2 1 3 111 2
-3 1 1 2 1 4 111 4题3输入
max 5 1 2 2
30 1 20 2 101 160
5 1 1 2 101 15
1 1 101 5题4输入
max 0.375 1 0.302 2 0.4 3 0.401 4 0.328 5 0.426 6 0.65 7 0.862 8 0.684 9
5 1 5 2 5 3 10 7 101 6000
7 4 7 5 7 6 9 8 12 9 101 10000
6 1 6 4 8 7 8 8 101 4000
4 2 4 5 11 9 101 7000
7 3 7 6 101 4000

最优化理论—单纯形法的C++实现(大M法)相关推荐

  1. 最优化理论-线性规划中的大M法的步骤

    目录: 一.引言 二.线性规划的基本概念 三.最优化理论中的大M法     1. 大M法的基本思想     2. 大M法的步骤     3. 大M法的优缺点 四.大M法的应用     1. 生产计划问 ...

  2. 陈宝林《最优化理论与算法》超详细学习笔记 (三)————单纯形法

    陈宝林<最优化理论与算法>详细学习笔记 (三)----单纯形法 数学模型 最优性检验与解的判别 最优解的判别定理 无穷多最优解判别定理 无界解判别定理 其他情形 第三章 单纯形法 单纯形表 ...

  3. 陈宝林《最优化理论与算法》超详细学习笔记 (七)————第五章 运输问题

    陈宝林<最优化理论与算法>超详细学习笔记 (七)----第五章 运输问题 第1节 运输问题的数学模型 第2节 表上作业法 2.1 确定初始基可行解 2.2 最优解的判别 2.3 改进的方法 ...

  4. 最优化理论——阻尼牛顿法

    最优化理论--阻尼牛顿法 算法思想 算法步骤 代码 示例 算法思想 由于实际问题的精确极小点一般是不知道的, 因此初始点的选取给算法的实际操作带来了很大的困难. 为了克服这一困难, 可引入线搜索技术以 ...

  5. 最优化理论笔记及期末复习(《数值最优化》——高立)

    目录 一.预备知识 二.无约束最优化方法的基本结构 三.凸集和凸函数 四.负梯度方法和Newton型方法 五.共轭梯度法 六.约束最优化问题的最优性理论 七.罚函数方法 八.期末复习 8.1 知识点复 ...

  6. 最优化技术——单纯形法

    最优化技术--单纯形法 说明 这个文章的大部分内容(几乎全部)都来自于我最优化课程的课程笔记.主要来源是重庆大学文静老师的PPT,个人主要用于整理.归纳,如果有侵权等问题,我会在第一时间将博客撤销. ...

  7. 陈宝林《最优化理论与算法》超详细学习笔记 (四)————第四章 对偶理论

    陈宝林<最优化理论与算法>超详细学习笔记 (四)----第四章 对偶理论 1. 对偶问题的提出 2. 线性规划的对偶理论 2.1 原问题与对偶问题的关系 2.2 对偶问题的基本性质 3. ...

  8. 最优化理论总结算法索引

    由于最优化理论是许多算法的基础,因此本文在这里简单梳理了一下最优化相关的重要知识点以及算法分类,以供需要时查询使用. 一.最优化理论基础 1.线性规划中的对偶理论: 典型线性规划问题      及其对 ...

  9. 机器学习数学基础——最优化理论

    以下文章摘录自 <机器学习观止--核心原理与实践> 京东: https://item.jd.com/13166960.html 当当:http://product.dangdang.com ...

最新文章

  1. CentOS7(64位)查看CPU和NVIDIA显卡温度
  2. 【问题收录】svn: E155010: 提交失败(Ubuntu14.04环境)
  3. Unity2017.1官方UGUI文档翻译——Auto Layout
  4. Android 分享功能大全
  5. d3.js 旋转图形_苏教版三年级数学上册6.1平移和旋转微课视频 | 练习
  6. L1-056 猜数字 C语言,PAT L1-032 Left-pad
  7. js将9999以内的值的个位改为0
  8. 用Entlib的配置程序块遇到的问题
  9. 华为机试HJ45:名字的漂亮度
  10. Request header field mytoken is not allowed by Access-Control-Allow-Headers in preflight (请求头设置问题)
  11. PCS7 Step7块破解 解锁 FC FB s7canopener S7 Blocks Unlock
  12. windows切屏快捷键
  13. 趋势科技4月移动客户端病毒报告
  14. java 获取 word 窗体域_办公小技巧:巧用窗体域 控制Word文档修改区
  15. 推荐4款最好用的远程桌面访问软件,亲测好评
  16. seo快排可视化界面封装,一键运行。
  17. qq群排名霸屏技巧排名推广
  18. Csocket OnReceive接收数据部分(解决接收数据不全的问题+获取时间+将数据写入文本文档)
  19. 浙江省八年级python_今年9月起 浙江八年级新增Python编程课程
  20. 静态方法:无法在静态上下文中引用非静态

热门文章

  1. 分类问题结果统计指标的解释:真正类率TPR与假正类率FPR、查全率与查准率、感受性与特异性
  2. 米老师讲课 ITOO4.1 ——Java(2)
  3. Linux移动硬盘挂载常用操作
  4. python自动化配置路由器_华为 Python网络自动化
  5. matlab 1e3,Matlab 对 ODE的参数进行 拟合 求助@月只蓝 - 计算模拟 - 小木虫 - 学术 科研 互动社区...
  6. 四种访问修饰符---(Java版)
  7. yyyy-MM-dd HH:mm:ss--SimpleDateFormat类的快速入门使用
  8. 拒绝日夜调参:超参数搜索算法一览
  9. 绘画手残党的福音:涂鸦线稿秒变绝美图像
  10. Zabbix5系列-制作拓扑图 (十三)