单纯形法cnmd

2024-02-26 17:58
文章标签 单纯形法 cnmd

本文主要是介绍单纯形法cnmd,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

单纯形法

在这里插入图片描述
C-Cheese, If You Please
关键词:线性规划;
思路:
令第 i 种商品的数量为 ,共 m 种商品。有 n 种原料,每种原料的数量为 w[i] ,第 j 种
商品使用第 i 种原料的比例为 p[i][j] ,每种商品的单价为 t[j] 。可得如下约束条件:
目标是最大化:
可用单纯形法解线性规划。
在这里插入图片描述
我们之前都是求最小花费且约束条件是大于
现在这道题是求最大利润且约束条件是小于
两者区别就在于pivot函数和b【】,c【】这两个数组
n是方程个数,m是未知数x的个数
1.目标最小化的时候(如花费,开销,资源
b数组表示答案系数
c数组表示约束条件
pivot函数是n-m-n-n

2.目标最小化的时候(如利润,好感度这些什么的
c数组表示答案系数
b数组表示约束条件
pivot函数是m-n-m-m


#include<bits/stdc++.h>
using namespace std;
const int MAXN=1500;
const int MAXM=15000;
const double INF=1e10;
const double eps=1e-7;
typedef long long ll;int N,M,n,m;
double a[MAXM][MAXN];//A[i][j]表示第i个方程,Xj的系数是多少
double c[MAXN];//第i个方程需要<=的常数
double b[MAXM];//目标方程Xj的系数是多少
double v;void pivot(int l,int e){b[l]/=a[l][e];for(int j=1;j<=m;j++)if(j!=e)a[l][j]/=a[l][e];//这里的n是方程个数a[l][e]=1/a[l][e];for(int i=1;i<=n;i++)if(i!=l&&fabs(a[i][e])>0){b[i]-=a[i][e]*b[l];for(int j=1;j<=m;j++) if(j!=e) a[i][j]-=a[i][e]*a[l][j];a[i][e]=-a[i][e]*a[l][e];}v+=c[e]*b[l];for(int j=1;j<=m;j++)if(j!=e)c[j]-=c[e]*a[l][j];c[e]=-c[e]*a[l][e];
}double Simplex()
{int i,l,e;while(true){for(i=1;i<=M;i++)if(c[i]>eps)break;if((e=i)==M+1)return v;//答案double tmp=INF;for(i=1;i<=N;i++)if(a[i][e]>eps && b[i]/a[i][e]<tmp)tmp=b[i]/a[i][e],l=i;if(tmp==INF)return INF;//无界pivot(l,e);}
}
int main()
{scanf("%d%d",&N,&M);n=N,m=M;for(int i=1;i<=N;i++){scanf("%lf",&b[i]);b[i]*=100;}for(int i=1;i<=M;i++){for(int j=1;j<=N;j++){scanf("%lf",&a[j][i]);}scanf("%lf",&c[i]);}double ans=Simplex();printf("%.2lf\n",ans);return 0;
}

解决上面这种题的话这个代码就ok了
如果要对偶的话


志愿者招募那道题

#include<bits/stdc++.h>
using namespace std;
const int M=10001,N=1001,INF=1e9;
const double eps=1e-6;
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
int n,m;
double a[M][N];//有m个变量n个方程
double b[M];//m个x系数也就是答案系数
double c[N];//n个约束
double v;//答案
void pivot(int l,int e){b[l]/=a[l][e];for(int j=1;j<=n;j++)if(j!=e)a[l][j]/=a[l][e];//这里的n是方程个数a[l][e]=1/a[l][e];for(int i=1;i<=m;i++)if(i!=l&&fabs(a[i][e])>0){b[i]-=a[i][e]*b[l];for(int j=1;j<=n;j++) if(j!=e) a[i][j]-=a[i][e]*a[l][j];a[i][e]=-a[i][e]*a[l][e];}v+=c[e]*b[l];for(int j=1;j<=n;j++)if(j!=e)c[j]-=c[e]*a[l][j];c[e]=-c[e]*a[l][e];
}
double simplex(){while(true){int e=0,l=0;for(e=1;e<=n;e++) if(c[e]>eps) break;if(e==n+1) return v;double mn=INF;for(int i=1;i<=m;i++)if(a[i][e]>eps&&mn>b[i]/a[i][e]) mn=b[i]/a[i][e],l=i;if(mn==INF) return INF;//unboundedpivot(l,e);}}
int main(){n=read();m=read();//n个方程,m个待求解的未知数for(int i=1;i<=n;i++)c[i]=read();for(int i=1;i<=m;i++){int l=read(),r=read();for(int j=l;j<=r;j++)a[i][j]=1;b[i]=read();}printf("%d",int(simplex()+0.5));
}

#include<bits/stdc++.h>
using namespace std;
const int M=10001,N=10001;
#define INF 1e10
const double eps=1e-6;
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
int n,m;
double a[M][N];//有m个变量n个方程
double b[M];//m个x系数也就是答案系数
double c[N];//n个约束
double v;//答案
void pivot(int l,int e){b[l]/=a[l][e];for(int j=1;j<=n;j++)if(j!=e)a[l][j]/=a[l][e];//这里的n是方程个数a[l][e]=1/a[l][e];for(int i=1;i<=m;i++)if(i!=l&&fabs(a[i][e])>0){b[i]-=a[i][e]*b[l];for(int j=1;j<=n;j++) if(j!=e) a[i][j]-=a[i][e]*a[l][j];a[i][e]=-a[i][e]*a[l][e];}v+=c[e]*b[l];for(int j=1;j<=n;j++)if(j!=e)c[j]-=c[e]*a[l][j];c[e]=-c[e]*a[l][e];
}
double simplex(){while(true){int e=0,l=0;for(e=1;e<=n;e++) if(c[e]>eps) break;if(e==n+1) return v;double mn=INF;for(int i=1;i<=m;i++)if(a[i][e]>eps&&mn>b[i]/a[i][e]) mn=b[i]/a[i][e],l=i;if(mn==INF) return INF;//unboundedpivot(l,e);}}
signed main(){n=read();m=read();swap(n,m);//n个方程,m个待求解的未知数//5个答案系数,3个方程for(int i=1;i<=m;i++)b[i]=read();// for(int i=1;i<=m;i++)cout<<b[i]<<" ";// cout<<endl;for(int i=1;i<=n;i++){int l=read(),r=read();for(int j=l;j<=r;j++)a[j][i]=1;c[i]=read();}printf("%d",(long long)(simplex()+0.5));
}

这篇关于单纯形法cnmd的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/749673

相关文章

单纯形法 -- 求解线性规划

目前,运用最广的线性规划方法就是著名的单纯形方法。这种方法是G.B.Dantzig在1947年提出的。几十年的实践证明,单纯形方法的确是一种使用方便、行之有效的重要算法。如今,它已经成为线性规划的中心内容。 单纯形法的基本思路是有选择地取(而不是枚举所有的)基本可行解,即是从可行域的一个顶点出发,沿着可行域的边界移到另一个相邻的顶点,要求新顶点的目标函数值不比原目标函数值差,如此迭代,直至找到最

每天一个数据分析题(三百六十一)- 单纯形法

单纯形法是求解线性规划问题最常用、最有效的算法之一,关于单纯形法的说法正确的是 A.在线性规划问题中,只要存在相应的解,则一定可以在可行域的顶点中找到。 B.单纯形法的核心是根据一定的规则,一步步寻找可行域中的最优解。 C.对偶单纯形法是求解对偶问题的一种方法。 D.单纯形法计算精度高,并且是一种很经济的算法 数据分析认证考试介绍:点击进入 题目来源于CDA模拟题库 点击此处获取答案

[OT] 基本可行解单纯形法

目录 1. 基本可行解 2. 单纯形法 2.1 基本解的公式表示 2.2 求基本解/基本可行解的例子 2.3 单纯形法例子 1. 基本可行解 2. 单纯形法 2.1 基本解的公式表示   2.2 求基本解/基本可行解的例子    基本解 满足 变量非负,则为基本可行解。可行域的极点 对应 基可行解。 2.3 单纯形法例子     无界解 : Z

【优化算法】Iterative映射和单纯形法的改进灰狼优化算法(SMIGWO)【含Matlab源码 1746期】

⛄一、获取代码方式 获取代码方式1: 完整代码已上传我的资源:【优化算法】Iterative映射和单纯形法的改进灰狼优化算法(SMIGWO)【含Matlab源码 1746期】 点击上面蓝色字体,直接付费下载,即可。 获取代码方式2: 付费专栏Matlab优化求解(初级版) 备注: 点击上面蓝色字体付费专栏Matlab优化求解(初级版),扫描上面二维码,付费29.9元订阅海神之光博客付费专栏M

运筹说 第20期 | 算法介绍之单纯形法

我们以16期的例题为例,选取Matlab以及Excel这两个软件对如何实现一般的单纯形法、大M法和两阶段法进行讲解,题目如下: 一、Matlab求解        MATLAB作为目前最流行的科学计算软件之一,被广泛的应用于数据分析、无线通信、深度学习、量化金融与风险管理、控制系统等领域。为了让大家更好地使用该软件,小编在此对MATLAB界面进行简单的介绍:界面主要由菜单

MATLAB多维极值之单纯形法

一、算法原理 1、问题引入 在之前讲解过的多维极值的算法中(最速下降法、牛顿法、共轭梯度法、拟牛顿法等),我们都利用了目标函数的导数值,因为函数的导数值是函数性态的反应。但在实际的工程应用中,会出现目标函数复杂导致求导麻烦甚至无法求导的情况。 单纯形法就解决了该问题,可以在不求导的情况下,根据若干个点的函数值大小关系,判断目标函数的变化趋势,为寻找目标函数的极值方向提供依据,这样经过若干次迭

利用单纯形法进行线性规划求解

作业要求 例16.5: 理论推导 本作业题的目的分别利用两阶段修正单纯形法与两阶段仿射尺度法对线性规划问题进行求解。 两阶段修正单纯形法是一种求解线性规划问题的方法,它主要用于处理约束系数矩阵不包含单位矩阵(没有明显的基本可行解)的情况,也就是无法直接得到初始基可行解的情况。它分为两个阶段: 第一阶段:引入人工变量,构造一个只含有人工变量的目标函数,并求其最小值。如果最小值为零,

单纯形法迭代原理及解的判定

写于:2024年1月4日晚 修改: 基于以下线性规划做分析, max ⁡ z = ∑ j = 1 n c j x j s.t.  { ∑ j = 1 n a i j x j ≤ b i ( i = 1 , 2 , … , m ) x j ≥ 0 ( j = 1 , 2 , … , n ) \begin{aligned} & \max \mathrm{z}=\sum_{j=1}^n c_j x

线性规划问题与单纯形法

线性规划是运筹学中一个很重要的分支,本文通过一个实例简单的介绍一下什么是线性规划问题,以及单纯形法的计算步骤。 问题 : 在一个工厂中,有两种产品A与B,它们的单价分别为6元与7元。A产品需要2千克原料P与4千克原料Q,而B产品需要3千克P与1千克Q,且P原料总数为16千克,Q原料总数为12千克,设计一种方案,即需要分别生产多少单位A和B可以使得利润最大化? 问题出处 :《运筹学基础及其

【管理运筹学】运筹学“背诵手册”(一) | 线性规划问题与单纯形法

引言 同数学一样,运筹学尽管大量的是计算题,但这些算法步骤及思路,还有涉及到的知识点如果不去整理和记忆,很难在短时间内正确求解出考题。比如指派问题的匈牙利法、排队论公式、运输问题的表上作业法等等,都是需要记忆的部分。下面就把个人认为容易遗忘的点整理起来,方便日后随时查阅。 一、线性规划问题与单纯形法 线性规划模型三个特点:1. 有决策变量,一般非负;2. 存在约束条件,用线性等式或不等式