1. 程式人生 > >Excel,R求解最優解問題

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代表無