風險決策法是指決策者對客觀狀況不瞭解,可是對將發生各事件的機率是已知的。決策者每每經過調查,根據過去的經驗或主觀估計等途徑得到這些機率。在風險決策中通常採用指望值做爲決策準則,經常使用的有最大指望收益決策準則(EMV)和最小機會損失決策準則(EOL)。html
風險型決策問題通常具備如下特色:java
下面接着上一篇博文,對文中的例子作風險決策分析,決策矩陣以下:算法
(策略\事件) | 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}\))函數
最大指望收益決策,顯而易見,就是計算出每一個方案指望收益值,而後選取最大指望值對應的方案即爲最優方案。spa
先根據各事件發生的機率 \(p_j\),求出各個策略的指望收益值。而後從這些指望收益值中選擇最大者,它對應的策略爲決策應選策略。code
S*k \(\rightarrow\) max \(\sum_{j} p_ja_{ij}\)htm
(策略\事件) | 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 決策準則有blog
max (0 , 44 , 76, 84, 80) = 84事件
對應的決策策略爲 S4,爲決策者選擇的策略。ci
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); }
最小機會損失決策與不肯定型決策法裏的最小機會損失決策準則
相相似,都是先將收益矩陣的中各元素變換爲機會損失值。將各天然狀態下的最大收益值定爲理想目標,並將該狀態中的其餘值與最高值之差稱爲機會損失值。而後求這些機會損失值的指望損失值,最後從中選取最小的指望損失值,對應的策略即爲決策者所選的策略。
首先計算出當發生 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); }
當決策者耗費了必定經費進行調研,得到了各事件發生機率的信息,應採用 」隨機應變「 的戰術,這時所得的指望收益稱爲全情報的指望收益,記作 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); }
效用概念首先是由貝努裏提出的,他認爲人們對其錢財的真實價值的考慮與他的錢財擁有量有對數關係。經濟管理學家將效用做爲指標,用它來衡量人們對某些事物的主觀價值,態度,偏心,傾向等。例如在風險狀況下進行決策,決策者對風險的態度是不一樣的,用效用指標來量化決策者對待風險的態度,能夠給每個決策者測定他對待風險的態度的效用曲線函數。這裏還有一個機率是效用曲線係數,效用曲線係數的取值範圍爲(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); }
至此,決策模型模塊的全部算法模型都分析,創建並實現完成。