Excel,R求解最优解问题

1. Excel最优化

本人使用的是2016版Excel,一开始是没有Solver这个求解最优解的包的按钮的。MS Excel在装载时会下载该包,但是不予激活。所以如果在“数据”这一栏没有找到“Solver/规划求解”按钮,需要自行激活,方法如下:

(1)点开“选项”按钮,选中“加载项”,点击“转到”。

(2)“跳转”后会显示如下弹窗,选中“分析工具库”和“规划求解加载项”,点击“确定”。

(3)Excel工具栏就会多出右下方“分析”这一栏

然后我们就可以使用Excel求解最优化问题啦~

假设李皮皮要进行一个增重计划,以下为约束条件和决策变量信息:

变量:每个月分别吃烤肉的次数x1和吃火锅的次数x2(B3和B4),目前设定为1次和2次;x1不能超过5次,x2不能超过10次(会破产)。

每次吃烤肉会消耗掉300g肉;每次吃火锅会消耗掉400g肉;一个月总耗肉量不能超过5000g;

李皮皮每吃一次烤肉增重500g,每吃一次火锅增重600g;

那么李皮皮一个月依靠吃火锅和烤肉的净增重就是:y=500x1+600x2;

目标就是在约束条件下,求解y最大值。

针对这个数学问题,我们做了如下输入。将目标函数公式所在处选中,然后点击“规划求解参数”,设定条件,求解。

得到的结果可以看出,在给定条件下,我们得到的最优解为每个月吃3次烤肉,10次火锅,就能长最大胖7500g。这么一算我就想去吃饭了。

 

2. R最优化

同样的问题,我们用R再来一次:

看了下好像包不少,这里使用Rsymphony包里的Rsymphony_solve_LP()函数。

https://www.rdocumentation.org/packages/Rglpk/versions/0.6-3/topics/Rglpk_solve_LP

整理一下上述应用题的公式,有:

\\max(500x_{1} + 600x_{2}) \\ x_{1}\leq 5\\ x_{1}\geq 0\\x_{2}\leq 10\\ x_{2}\geq 0\\300x1+400x2\leq 5000\\

代码如下:

//导入包
require(Rsymphony)
//目标函数
obj <- c(500,600)
//各个值
mat <- matrix(c(1,1,0,0,300,0,0,1,1,400),nrow = 5)
//显示矩阵
mat
     [,1] [,2]
[1,]    1    0
[2,]    1    0
[3,]    0    1
[4,]    0    1
[5,]  300  400
//确定约束条件符号
> dir <- c("<=",">=","<=",">=","<=")
//约束条件符号右边值
> rhs <- c(5,0,10,0,5000)
//求最大解
> max <- TRUE
//两个变量类型均为int
> types <- c("I","I")
//求解
> Rsymphony_solve_LP(obj,mat,dir,rhs,types = types, max = max)
$solution
[1]  3 10 //解分别为3和10

$objval
[1] 7500 //最优解为7500

$status
TM_OPTIMAL_SOLUTION_FOUND 
                        0 //0代表有最优解,1代表无

猜你喜欢

转载自blog.csdn.net/weixin_39965890/article/details/81190683
今日推荐