書籍の例は次のとおりです。Borisov、Krumberg、Fedorov-「ファジィモデルに基づく意思決定。 使用例」、1990年。 94-102
状態。 研究所のリーダーシップは、教員の空席を埋める候補者を検討しています。 タスクは、上記の方法を使用して、それらのベストを特定することです。 教員のメンバー間の議論により、次の結果が得られました。
d1:「候補者が経験豊富な研究者であり、ある程度の実務経験と技術分野の指導経験がある場合、候補者は満足です(要件を満たしている)。
d2:「上記の要件に加えて、彼が情報システムの理論を教えることができれば、彼は満足している以上です」。
d3:「d2に加えて、彼がハイテク製品の顧客を見つける能力を持っているなら、彼は申し分ない」
d4:「情報システムの理論を教える能力を除いて、opがd3で規定されているすべてのものを持っている場合、彼は非常に満足しています」。
d5:「候補者が非常に経験豊富な研究者であり、顧客と優れた教師を見つける能力はあるが、制作経験がない場合でも、彼は満足できるでしょう。」
d6:「彼が研究者の資格を持っていないか、教える能力が証明されていない場合、彼は不十分です。」
6つの情報フラグメントの分析により、意思決定に使用される5つの基準が得られます。
X(1)-研究能力;
X(2)-生産経験
X(3)-技術分野の指導経験
X(4)-情報システムの理論を教えた経験
X(5)-顧客を見つける能力。
U候補の基本セットでこれらの変数を測定します。 6つのフラグメントを見ると、次のようになります。
![画像](https://habrastorage.org/getpro/habr/post_images/d67/6a3/f99/d676a3f99acf21770efdb2122b0b94c9.png)
行A、B、C、D、Eから、入力インターフェイスを実装する入力クラスのmakeSkillメソッドに渡されるマトリックスがコンパイルされます。 その説明を以下に示します(ステートメントの変換を参照)。
ファジー機能
その後、知識の断片は次の形式を取ります。
d(1):「X = A、B、Cの場合、Y = S」
d(2):「X = A、およびB、C、およびDの場合、Y = MS」
d(3):「X = A、B、C、D、Eの場合、Y = P」
d(4):「X = A、およびB、C、およびEの場合、Y = VS」
d(5):「Xが非常にAで、B、C、およびEではない場合、Y = S」
d(6):「X = AでもCでもない場合、Y = US」
上記に従って、実装内の機能の内容:
package Function; import Support.Function; public class mMS extends Function { /*, */ public mMS(){} public double getY(double x) { return x*Math.sqrt(x); } }
package Function; import Support.Function; public class mP extends Function{ /**/ public mP(){} public double getY(double x) { if (x==1) return 1; return 0; } }
package Function; import Support.Function; public class mVS extends Function{ /* */ public mVS(){} public double getY(double x) { return x*x; } }
package Function; import Support.Function; public class mS extends Function { /**/ public mS(){} public double getY(double x) { return x; } }
package Function; import Support.Function; public class mUS extends Function{ /* */ public mUS(){} public double getY(double x) { return 1-x; } }
音声変換
ルールを使用してこれらのステートメントを変換すると、
![画像](https://habrastorage.org/getpro/habr/post_images/d42/bad/c23/d42badc23200f9bd51c563ef51625ebc.png)
ルールを必要なスキルに関連付ける入力クラスは次のとおりです。
package FLO_Engine; import Support.Function; import Support.Input; import Support.Rule; import Support.Skill; public class input extends Input{ private Skill A,B,C,D,E,A_M5,B_M5,A_M6,C_M6; public input(){ /* */ PARAMS_CNT = 5; FUNC_CNT = 6; } public void initFunc(Function[] func){ this.func = func; } private void makeSkill(double[][] arr){ /* ; , Function */ rl = new Rule[FUNC_CNT]; A = new Skill(arr[0]); B = new Skill(arr[1]); C = new Skill(arr[2]); D = new Skill(arr[3]); E = new Skill(arr[4]); double[][] u=arr; double[] a_m5 = (double[]) u[0].clone(); for (int i=0;i<u[0].length;i++) a_m5[i]*=a_m5[i]; /* */ A_M5 = new Skill(a_m5); double[] b_m5 = (double[]) u[1].clone(); for (int i=0;i<u[1].length;i++) b_m5[i]= 1 — b_m5[i]; /* */ B_M5 = new Skill(b_m5); double[] a_m6 = (double[]) u[0].clone(); for (int i=0;i<u[0].length;i++) a_m6[i] = 1 — a_m6[i]; /* */ A_M6 = new Skill(a_m6); double[] c_m6 = (double[]) u[2].clone(); for (int i=0;i<u[2].length;i++) c_m6[i] = 1 — c_m6[i]; /* */ C_M6 = new Skill(c_m6); } public Rule[] makeRules(double[][] arr) throws Exception{ makeSkill(arr); rl[0] = new Rule(new Skill[]{A,B,C} ,func[0]); // d1 rl[1] = new Rule(new Skill[]{A,B,C,D} ,func[1]); // d2 rl[2] = new Rule(new Skill[]{A,B,C,D,E} ,func[2]); // d3 rl[3] = new Rule(new Skill[]{A,B,C,E} ,func[3]); // d4 rl[4] = new Rule(new Skill[]{A_M5,B_M5,C,E} ,func[4]); // d5 rl[5] = new Rule(new Skill[]{A_M6,C_M6} ,func[5]); // d6 return rl; } }
このように
d(1):「X = M(1)の場合、Y = S」
d(2):「X = M(2)の場合、Y = MS」
d(3):「X = M(3)の場合、Y = P」
d(4):「X = M(4)の場合、Y = VS」
d(5):「X = M(5)の場合、Y = S」
d(6):「X = M(6)の場合、Y = US」
![画像](http://savepic.net/2354244.png)
計算
対応する式を使用して、各ステートメントの行列Dを取得します。
![画像](http://savepic.net/2355267.png)
コードの結果:
D [1]:
0.5 0.60 0.70 0.80 0.9 1.0 1.0 1.0 1.0 1.0 1.0 1.0
0.4 0.50 0.60 0.70 0.8 0.9 1.0 1.0 1.0 1.0 1.0 1.0
0.5 0.60 0.70 0.80 0.9 1.0 1.0 1.0 1.0 1.0 1.0 1.0
0.9 1.00 1.00 1.00 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
0.7 0.79 0.89 1.00 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
![画像](http://savepic.net/2347075.png)
D [2]:
0.5 0.53 0.58 0.66 0.75 0.85 0.96 1.0 1.0 1.0 1.0
0.7 0.73 0.78 0.86 0.95 1.00 1.00 1.0 1.0 1.0 1.0
0.5 0.53 0.58 0.66 0.75 0.85 0.96 1.0 1.0 1.0 1.0
0.9 0.93 0.98 1.00 1.00 1.00 1.00 1.0 1.0 1.0 1.0
0.7 0.73 0.78 0.86 0.95 1.00 1.00 1.0 1.0 1.0 1.0
ここでは結果は収束しませんが、MATLABと工学計算機は私の側にあります。 ほとんどの場合、これは著者の誤算です。
![画像](http://savepic.net/2328643.png)
D [3]:
0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1.0
0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 0.7 1.0
0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1.0
0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 1.0 1.0
0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 1.0 1.0
同じ話、おそらく著者の計算の関数の1つはエラーでした。
![画像](http://savepic.net/2330691.png)
D [4]:
0.5 0.51 0.54 0.59 0.66 0.75 0.86 0.99 1.0 1.0 1.0
0.5 0.51 0.54 0.59 0.66 0.75 0.86 0.99 1.0 1.0 1.0
0.5 0.51 0.54 0.59 0.66 0.75 0.86 0.99 1.0 1.0 1.0
0.9 0.91 0.94 0.99 1.00 1.00 1.00 1.00 1.0 1.0 1.0
0.9 0.91 0.94 0.99 1.00 1.00 1.00 1.00 1.0 1.0 1.0
![画像](http://savepic.net/2325571.png)
D [5]:
0.50 0.6 0.7 0.8 0.9 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.00 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.00 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
0.99 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.00 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
![画像](http://savepic.net/2311235.png)
D [6]:
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.00 1.00 0.90 0.8
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.00 1.00 1.00 0.9
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.00 1.00 1.00 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.99 0.89 0.79 0.7
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.00 1.00 1.00 1.0
一般的な関数解Dは、ファジーセットD(i)の共通部分として見つかります。
![画像](http://savepic.net/2309187.png)
D:
0.5 0.50 0.50 0.50 0.50 0.5 0.5 0.5 0.50 0.50 0.8
0.4 0.50 0.54 0.59 0.66 0.7 0.7 0.7 0.70 0.70 0.9
0.5 0.50 0.50 0.50 0.50 0.5 0.5 0.5 0.50 0.50 1.0
0.9 0.90 0.90 0.90 0.90 0.9 0.9 0.9 0.89 0.79 0.7
0.7 0.73 0.78 0.86 0.90 0.9 0.9 0.9 0.90 0.90 1.0
結果の不一致の考えられる理由は上記のとおりです。次に、本との比較を使用して、「より正確」であることが判明した決定の一般的な流れを示します。 式は同じですが、この実装、MATLAB、電卓は私の好意を表しています。 教科書の著者は一桁以上の経験がありますが、計算の方法は不明です-本の唯一のコピーが1990年代の日付であり、同じエラーを除外することはできません。
ポイントスコアの計算
![画像](http://savepic.net/2358338.png)
私の結果:
オブジェクト#1:
E:0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.8
X:0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
推定ポイント:0.6875
![画像](http://savepic.net/2348098.png)
オブジェクト#2:
E:0.4 0.5 0.54 0.59 0.66 0.7 0.7 0.7 0.7 0.7 0.9 0.9
X:0.0 0.1 0.20 0.30 0.40 0.5 0.6 0.7 0.8 0.9 1.0
推定ポイント:0.6561
![画像](http://savepic.net/2338882.png)
オブジェクト#3:
E:0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1.0
X:0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
ポイント見積もり:0.7500
![画像](http://savepic.net/2321474.png)
オブジェクト#4:
E:0.7 0.79 0.89 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9
X:0.0 0.10 0.20 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
ポイント見積もり:0.4833
![画像](http://savepic.net/2315330.png)
オブジェクト#5:
E:0.7 0.73 0.78 0.86 0.9 0.9 0.9 0.9 0.9 0.9 1.0
X:0.0 0.10 0.20 0.30 0.4 0.5 0.6 0.7 0.8 0.9 1.0
ポイント見積もり:0.5757308868523388
![画像](http://savepic.net/2358340.png)
明らかに、3番目の選択肢が最適です(スコア0.75)。
2番目の候補者は、本の中で最高の候補者として認識されます(丸める前に、彼の評価は最初の候補者よりも高かった)。
ソース(NetBeans 6.9.1のプロジェクト): ifolder.ru
パス:habrahabr.ru
念のため:実行可能.jarは\ dist \フォルダーにあります