- 原文鏈接(轉載請注明出處):決策模型(二):風險決策法

前言
風險決策法是指決策者對客觀情況不了解,但是對將發生各事件的概率是已知的。決策者往往通過調查,根據過去的經驗或主觀估計等途徑獲得這些概率。在風險決策中一般采用期望值作為決策准則,常用的有最大期望收益決策准則(EMV)和最小機會損失決策准則(EOL)。
風險型決策問題一般具有以下特點:
- 決策具有明確目標: 獲得最大收益(利潤)或最小損失;
- 存在兩個以上可供選擇的行動方案
- 存在兩個或兩個以上不以決策者主觀意志為轉移的自然狀態,但決策者根據過去的經驗,主觀估計或科學理論等可預先估算出這些狀態出現的概率值;
- 各行動方案在確定狀態下的損益值可以計算出來;
下面接着上一篇博文,對文中的例子做風險決策分析,決策矩陣如下:
(策略\事件) | E1 = 0 | E2 = 10 | E3 = 20 | E4 = 30 | E5 = 40 |
---|---|---|---|---|---|
事件概率(pj) | 0.1 | 0.2 | 0.4 | 0.2 | 0.1 |
S1 = 0 | 0 | 0 | 0 | 0 | 0 |
S2 = 10 | -10 | 50 | 50 | 50 | 50 |
S3 = 20 | -20 | 40 | 100 | 100 | 100 |
S4 = 30 | -30 | 30 | 90 | 150 | 150 |
S5 = 40 | -40 | 20 | 80 | 140 | 200 |
(注:記各自然狀態發生的概率為\(p_j\),采用第 i 種方案在發生第 j 自然狀態下的損益值為 \(a_{ij}\))
最大期望收益決策准則(EMV)
定義
最大期望收益決策,顯而易見,就是計算出每個方案期望收益值,然后選取最大期望值對應的方案即為最優方案。
計算步驟
先根據各事件發生的概率 \(p_j\),求出各個策略的期望收益值。然后從這些期望收益值中選擇最大者,它對應的策略為決策應選策略。
計算公式
S*k \(\rightarrow\) max \(\sum_{j} p_ja_{ij}\)
計算結果
(策略\事件) | E1 = 0 | E2 = 10 | E3 = 20 | E4 = 30 | E5 = 40 | EMV |
---|---|---|---|---|---|---|
事件概率(pj) | 0.1 | 0.2 | 0.4 | 0.2 | 0.1 | |
S1 = 0 | 0 | 0 | 0 | 0 | 0 | 0 |
S2 = 10 | -10 | 50 | 50 | 50 | 50 | 44 |
S3 = 20 | -20 | 40 | 100 | 100 | 100 | 76 |
S4 = 30 | -30 | 30 | 90 | 150 | 150 | 84 \(\longleftarrow\) max |
S5 = 40 | -40 | 20 | 80 | 140 | 200 | 80 |
根據 EMV 決策准則有
max (0 , 44 , 76, 84, 80) = 84
對應的決策策略為 S4,為決策者選擇的策略。
EMV 決策准則適用於一次決策多次重復進行生產的情況,所以它是平均意義下的最大收益。
計算代碼
private static int row = 4; //行
private static int col = 3; //列
private static double t =2; //效用曲率系數
private static double[][] matrix = {//決策矩陣
//事件 1 2 3
{0.2,0.5,0.3}, //事件概率
{140,120, 80}, //策略
{200,150, 40}, //策略
{340,140,-20}, //策略
};
/**
* 最大期望收益決策准則(EMV)
* @param matrix
* @param row
* @param col
*/
private static void EMV(double[][] matrix, int row, int col){
double[] maxMar = new double[row+1]; //記錄每種行動方案的結果,第一行是自然狀態概率
double max = 0.0; //最優結果
double temp = 0.0;
double chance = 0.0; //概率
int maxIndex = 0; //最優結果下標
//因為第一行是自然狀態概率,所以從第二行開始,實際的行數比 row 多一行
for (int i = 1; i <= row; i++) {
for (int j = 0; j < col; j++) {
chance = matrix[0][j]; //自然概率
temp = (j != 0) ? (temp + matrix[i][j]*chance) : (matrix[i][j]*chance);
}
maxMar[i] = temp;
if(i == 1){ // 當 i=1時,為 max 與 maxIndex 賦初值
max = temp;
maxIndex = 1;
}else if(temp > max){
max = temp;
maxIndex = i;
}
}
System.out.println(Arrays.toString(maxMar));
System.out.println(max+"--"+maxIndex);
}
最小機會損失決策准則(EOL)
定義
最小機會損失決策與不確定型決策法里的最小機會損失決策准則
相類似,都是先將收益矩陣的中各元素變換為機會損失值。將各自然狀態下的最大收益值定為理想目標,並將該狀態中的其他值與最高值之差稱為機會損失值。然后求這些機會損失值的期望損失值,最后從中選取最小的期望損失值,對應的策略即為決策者所選的策略。
計算步驟
首先計算出當發生 j 事件后,各策略的收益最大值
aij = max ( aij )
這時各策略的機會損失值為
\(a'_{ij}\) = { max ( aij ) - aij }
然后求這些機會損失值的期望損失值,最后從中選取最小的期望損失值
min \(\sum_{j} p_ja'_{ij}\)
計算公式
S*k \(\rightarrow\) min \(\sum_{j} p_ja'_{ij}\)
計算結果
(策略\事件) | E1 = 0 | E2 = 10 | E3 = 20 | E4 = 30 | E5 = 40 | EOL |
---|---|---|---|---|---|---|
事件概率(pj) | 0.1 | 0.2 | 0.4 | 0.2 | 0.1 | |
S1 = 0 | 0 | 50 | 100 | 150 | 200 | 100 |
S2 = 10 | 10 | 0 | 50 | 100 | 150 | 56 |
S3 = 20 | 20 | 10 | 0 | 50 | 100 | 24 |
S4 = 30 | 30 | 20 | 10 | 0 | 50 | 16 \(\longleftarrow\) max |
S5 = 40 | 40 | 30 | 20 | 10 | 0 | 20 |
根據 EOL 決策准則有
min (100, 56 , 24, 16, 20) = 16
對應的決策策略為 S4,為決策者選擇的策略。
從本質上講 EMV 與 EOL 決策准則是一樣的。所以決策時這兩個決策結果是一樣的。
計算代碼
/**
* 最小機會損失決策准則(EOL)
* @param matrix
* @param row
* @param col
*/
private static void EOL(double[][] matrix, int row, int col){
//先求損失矩陣
double[][] loss = new double[row+1][col];
for (int j = 0; j < col; j++) {
loss[0][j] = matrix[0][j]; //將自然概率復制到損失矩陣的第一行中
double max = matrix[1][j]; //先定每一列的第一個最大
for (int i = 1; i <= row; i++) {
if(matrix[i][j] > max){
max = matrix[i][j];
}
}
//此時已經求出該列的最大值
//損失矩陣中對應位置的值 = 決策矩陣中列最大值 - 決策矩陣中對應位置值
for (int i = 1; i <= row; i++) {
loss[i][j] = max - matrix[i][j];
}
}
//然后再求 EOL 決策
double[] maxMar = new double[row+1];
double min = 0.0;
double temp = 0.0;
int minIndex = 0;
double chance = 0.0;
for (int i = 1; i <= row; i++) {
for (int j = 0; j < col; j++) {
chance = loss[0][j]; //自然概率
temp = (j != 0) ? (temp + loss[i][j]*chance) : (loss[i][j]*chance);
}
maxMar[i] = temp;
if(i == 1){
min = temp;
minIndex = 1;
} else if(temp < min){
min = temp;
minIndex = i;
}
}
System.out.println(Arrays.toString(maxMar));
System.out.println(min+"--"+minIndex);
}
全情報的價值(EVPI)
定義
當決策者耗費了一定經費進行調研,獲得了各事件發生概率的信息,應采用 ”隨機應變“ 的戰術,這時所得的期望收益稱為全情報的期望收益,記做 EPPI,這個收益應當大於至少等於最大期望收益,即 EPPI >= max(EMV),則有EVPI = EPPL - max(EMV),EVPI 稱為全情報的價值,這就說明獲得情報的費用不能超過 EVPI 值,否則就沒有增加收入。
計算步驟
先進行 EMV 決策法計算,求得最大期望收益值
max \(\sum_{j} p_ja_{ij}\)
然后求全情報期望收益,先得求收益矩陣中每行的最大值然后求期望,最后將每行最大值的期望相加,得到全情報期望收益。
\(\sum_{j} p_jmax(a_{i})\) ; \(max(a_{i})\) 是 i 行的最大值
全情報期望收益減去最大期望收益即為全情報價值 EVPI
EVPI = \(\sum_{j} p_jmax(a_{i})\) - max \(\sum_{j} p_ja_{ij}\)
計算公式
EVPI = \(\sum_{j} p_jmax(a_{i})\) - max \(\sum_{j} p_ja_{ij}\)
計算結果
(策略\事件) | E1 = 0 | E2 = 10 | E3 = 20 | E4 = 30 | E5 = 40 | EMV | 期望收益 | EVPI |
---|---|---|---|---|---|---|---|---|
事件概率(pj) | 0.1 | 0.2 | 0.4 | 0.2 | 0.1 | |||
S1 = 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
S2 = 10 | -10 | 50 | 50 | 50 | 50 | 44 | ||
S3 = 20 | -20 | 40 | 100 | 100 | 100 | 76 | ||
S4 = 30 | -30 | 30 | 90 | 150 | 150 | 84 \(\longleftarrow\) max | 100 | 16 |
S5 = 40 | -40 | 20 | 80 | 140 | 200 | 80 |
根據 EMV 決策准則有
max (0, 44, 76 , 84, 80) = 84
得到最大的期望收益值為 84 , 再求得全情報期望收益 = 100 ,最后可得全情報價值EVPI = 16, 對應的決策策略為 S4,為決策者選擇的策略。
計算代碼
/**
* 全情報價值(EVPI)
* @param matrix
* @param row
* @param col
*/
private static void EVPI(double[][] matrix, int row, int col){
double[] maxMar = new double[row+1]; //記錄每種行動方案的結果,第一行是自然狀態概率
double max = 0.0; //最優結果
double temp = 0.0;
double chance = 0.0; //概率
int maxIndex = 0; //最優結果下標
//因為第一行是自然狀態概率,所以從第二行開始,實際的行數比 row 多一行
for (int i = 1; i <= row; i++) {
for (int j = 0; j < col; j++) {
chance = matrix[0][j]; //自然概率
temp = (j != 0) ? (temp + matrix[i][j]*chance) : (matrix[i][j]*chance);
}
maxMar[i] = temp;
if(i == 1){ // 當 i=1時,為 max 與 maxIndex 賦初值
max = temp;
maxIndex = 1;
}else if(temp > max){
max = temp;
maxIndex = i;
}
}
double rowMax = 0.0;
double expect = 0.0;
double chance = 0.0;
double value = 0.0;
//計算全情報價值收益
for (int i = 0; i < col; i++) {
chance = matrix[0][i]; //自然概率
for (int j = 1; j <= row; j++) {
if(j == 1){ //初始化第一行第一個為該行最大的收益值
rowMax = matrix[j][i];
}else if (matrix[j][i] > rowMax){
rowMax = matrix[j][i];
}
}
expect += rowMax * chance;
}
except = new BigDecimal(expect).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
value = new BigDecimal(expect - max).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println("全情報期望收益:"+except);
System.out.println("全情報價值EVPI:"+value);
}
效用曲線擬合(EUV)
定義
效用概念首先是由貝努里提出的,他認為人們對其錢財的真實價值的考慮與他的錢財擁有量有對數關系。經濟管理學家將效用作為指標,用它來衡量人們對某些事物的主觀價值,態度,偏愛,傾向等。例如在風險情況下進行決策,決策者對風險的態度是不同的,用效用指標來量化決策者對待風險的態度,可以給每一個決策者測定他對待風險的態度的效用曲線函數。這里還有一個概率是效用曲線系數,效用曲線系數的取值范圍為(0,∞)。
計算步驟
先建立效用曲線函數,將矩陣中的收益值裝化為效用值,其中 t 為效用曲線系數,b=max{x1,x2,x3,⋯,xn} ,a=min{x1,x2,x3,⋯,xn}) ;
U(x) = \(\left\{\begin{matrix} &0, & x\leq a & \\ &(\frac{x-a}{b-a})^t, & a\leq x\leq b \\ &1, &x\geq b \end{matrix}\right.\)
然后計算期望效用值,結果為期望效用的最大值
EUVi = \(\sum_{j} p_ju_{ij}\)
計算公式
S*k \(\rightarrow\) max \(\sum_{j} p_ju_{ij}\)
計算結果
(策略\事件) | E1 = 0 | E2 = 10 | E3 = 20 | E4 = 30 | E5 = 40 | EUV(t=2) |
---|---|---|---|---|---|---|
事件概率(pj) | 0.1 | 0.2 | 0.4 | 0.2 | 0.1 | |
S1 = 0 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 |
S2 = 10 | 0.02 | 0.14 | 0.14 | 0.14 | 0.14 | 0.128 |
S3 = 20 | 0.01 | 0.11 | 0.34 | 0.34 | 0.34 | 0.261 |
S4 = 30 | 0.0 | 0.09 | 0.29 | 0.63 | 0.63 | 0.323 |
S5 = 40 | 0.0 | 0.06 | 0.25 | 0.56 | 1.0 | 0.324 \(\longleftarrow\) max |
根據 EUV決策准則有
max (0.03, 0.128 , 0.261, 0.323, 0.324) = 0.324
對應的決策策略為 S5,為決策者選擇的策略。
計算代碼
/**
* 效用曲線擬合(EUV)
* @param matrix
* @param row
* @param col
*/
private static void EUV(double[][] matrix, double a, int row, int col){
//先求出收益矩陣中的最大值與最小值
double min = matrix[1][0];
double max = matrix[1][0];
for (int i = 2; i < row; i++) {
for (int j = 0; j < col; j++) {
if(matrix[i][j] > max){
max = matrix[i][j];
}
if(matrix[i][j] < min){
min = matrix[i][j];
}
}
}
System.out.println("min="+min+"max="+max);
//然后求出效用值矩陣
/*計算方法
小於最小值(a) => 0
大於最大值(b) => 1
介於之間=> (x-a/b-a)^t,其中t為效用曲線系數
*/
double[][] avail = new double[row+1][col];
for (int i = 1; i <= row; i++) {
for (int j = 0; j < col; j++) {
avail[0][j] = matrix[0][j]; //將自然狀態概率復制到第一行中
if(matrix[i][j] <= min){
avail[i][j] = 0.0;
}else if(matrix[i][j] >= max){
avail[i][j] = 1.0;
}else {
double pow = Math.pow((matrix[i][j] - min) / (max - min), t);
avail[i][j] = new BigDecimal(pow).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
}
for (int i = 0; i < row; i++) {
System.out.println(Arrays.toString(avail[i]));
}
//再求期望效用值
double[] maxMar = new double[row+1];
double availMax = 0.0; //效用期望最大值
int maxIndex = 0;
double temp = 0.0;
double chance = 0.0;
for (int i = 1; i <= row; i++) {
for (int j = 0; j < col; j++) {
chance = avail[0][j]; //自然概率
temp = (j != 0) ? (temp + avail[i][j]*chance) : (avail[i][j]*chance);
}
double value =new BigDecimal(temp).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
maxMar[i] = value;
if(i == 1){
availMax = value;
maxIndex = 1;
} else if(value > availMax){
availMax = value;
maxIndex = i;
}
}
System.out.println(Arrays.toString(maxMar));
System.out.println(availMax+"--"+maxIndex);
}
總結
至此,決策模型模塊的所有算法模型都分析,建立並實現完成。