実際の生活には、商品を売買することで商人の利益を最大化する方法など、多くの問題がありますか?大学生の登録で最高の全体的な結果を達成する方法は?患者の医師がどのようにして最高の全体的なサービスレベルなどを達成できるかなど。私たちは皆、これらを統一された方法で二国間意思決定の問題に変えることができます。まず、二国間の意思決定についてのあなたの理解について話しましょう。
二国間意思決定 - 個人的な理解
誰もが理解するために、私は簡単な例を使用して、二国間決定が何であるかを紹介します。市場には10人の顧客、つまりA0、A1、A2、A3、A4、A5、A6、A7、A8、A9がいます。市場には製品、つまりB0、B1、B2、B3、B4、B5、B6、B7、B8、およびB9があります。現在、これらの10の製品はこれら10の顧客に配布する必要があり、全体的な満足度が必要です。もちろん、各顧客は各製品のスコアを異なります。 N製品の顧客はAmbnに満足しています。では、これらの製品を割り当てて、全体的な満足度を最高にするにはどうすればよいでしょうか?このトピックは、二国間の意思決定の問題です。
アルゴリズムの紹介
二国間意思決定を実装するための多くのアルゴリズムがあります。ここに自分自身を考える方法があります(類似性がある場合、それは純粋に偶然です)。このアルゴリズムは、私が以前に書いた遺伝的アルゴリズムに関する記事に基づいて考えられていました。このアルゴリズムでは、顧客と製品の数が一貫している必要があり、1対1の関係である必要があります。数値が一貫性がないか、nのペア(nが特定の値)の場合、仮想製品(顧客)を構築することでこのアルゴリズムを使用できます。アルゴリズムのアイデアを簡単に紹介しましょう。
1)最初に割り当て計画を選択します。ここでは、最初の割り当て計画はM製品をM顧客に割り当てることであるとは想定していません。
2)比較ステップを1に設定します。
3)ステップが配列の長さを超えるかどうかを判断します。エンドアルゴリズムを超えた場合、次のステップを超えない場合は、次のステップを実行し続けます。
4)割り当て計画が切り替えられていると仮定して、ステップステップサイズの下で2人の顧客を比較します。調整後の満足度が調整前の満足度よりも大きい場合は、それを切り替えます。そうしないと、比較位置を1つに移動してステップ4に続きます。
5)このステップで調整できる割り当て計画はありません。ステップに1を追加します。
6)ステップ3にジャンプして、実行を続けます。
上記のアルゴリズムの説明では、ステップ4)に焦点を当てます。ここでは、最初の顧客によって割り当てられた製品は製品No.1であり、2番目の顧客によって割り当てられた製品は製品No. 2であり、製品に対する満足度はそれぞれA1B1とA2B2であると仮定します。この時点で、2人の顧客の全体的な満足度はSCORE1 = A1B1+A2B2です。ここでは、彼らの割り当て計画、つまり、最初の顧客によって割り当てられた製品は製品No. 2であり、2番目の顧客によって割り当てられた製品は製品No.1であり、現時点では製品に対する満足度はそれぞれA1B2とA2B1です。これら2つの顧客の全体的な満足度は、SCORE2 = A1B2+A2B1です。 SCORE1がSCORE2未満の場合、割り当て戦略を変更します。それ以外の場合は、元の割り当て戦略を維持します。
Javaコード分析
上記の紹介はあまり具体的ではないかもしれませんし、Javaでそれを実装する方法がわかりません。実装を分解しましょう:
1)アルゴリズムを書くときは、まずいくつかの定数を定義し、割り当てスキームを保存する必要があります。
Public Class TwosideDdecision {private int num = 10; //個人の数private boolean maxflag = true; //最大値のprivate int [] [] scorearray; // ab private int [] decumentArray; //選択方法B}の相互評価スコアここにはmaxflag属性があります。その機能は、私たちの二国間決定を最大または最小とするかどうかを特定することです。 trueは最大値を表し、falseは最小値を表します。 NUMは個人の数を識別するために使用され、スコアレイアレイは製品に対するユーザーの満足度を表すために使用され、DecisionArrayは製品の割り当て計画を保存するために使用されます。
2)アルゴリズムを実行する前に、個人の数を設定する必要があります
public void setnum(int num){if(num <1){system.out.println( "numは0より大きくなければならない);戻る; } this.num = num; } 3)顧客は製品の満足度を獲得し、初期割り当て計画を決定します
public void setscorearray(int [] [] scorearray){if(scorearray == null){system.out.println( "scorearray is null"); } if(!(scorearray.length == num && scorearray [0] .length == num)){system.out.println( "scorearrays be" + num); } this.scorearray = scorearray; DecisionArray = new int [num]; //最初の決定、斜めの(int i = 0; i <num; i ++){decisionArray [i] = i; } 決断(); } 4)次に、ステップ4)アルゴリズムの説明で、割り当て計画が調整されているかどうかを確認する
private boolean Compare(int steptize){for(int i = 0; i <num -stepsize; i ++){int a1 = i; int a2 = i +ステップサイズ。 int b1 = decisionArray [a1]; int b2 = decisionArray [a2]; //元の2つのスコアの合計int score1 = scorearray [a1] [b1] + scorearray [a2] [b2]; int1 = math.abs(scorearray [a1] [b1] -scorearray [a2] [b2]); //交換後の2つのスコアの合計int score2 = scorearray [a1] [b2] + scorearray [a2] [b1]; int2 = math.abs(scorearray [a1] [b2] -scorearray [a2] [b1]); if(maxflag){//最大最終スコアはif(score1 <= score2){//交換後のスコアは以前の交換よりも少ない//交換後のスコアは以前の交換よりも大きいif(score1 <score2 || hitering intery1){score 1){decantionArray [a1] = b2; DecisionArray [a2] = b1; trueを返します。 }}} else {//最終スコアは最小ですif(score1> = score2){//交換後のスコアは、交換前のスコアよりも大きくない//交換後のスコアは取引所前よりも大きいif(score1> score2 || hienth2> hiteter1){decisionArray [a1] = b2; DecisionArray [a2] = b1; trueを返します。 }}} falseを返します。 }この方法の返品値は、このステップサイズでスイッチングが発生するかどうかを確認することです。このステップサイズでスイッチングが発生した場合、次のステップサイズを比較できます。これにより、二国間意思決定アルゴリズムが完了します。以下のテスト結果を見てみましょう。
実行結果
最大テスト
最小値テスト
完全なコード
/ ***@説明:二国間マッチング決定アルゴリズム*/パッケージcom.lulei.twosided.matching.decisionmaking; com.lulei.util.jsonutilをインポートします。 Public Class TwosideDdecision {private int num = 10; //個人の数private boolean maxflag = true; //最大値のprivate int [] [] scorearray; // ab private int [] decumentArray; // b public boolean ismaxflag(){return maxflag; } public void setMaxflag(boolean maxflag){this.maxflag = maxflag; } / ** * @return * @author:lulei * @description:最終決定を取得 * / public int [] getDecisionArray(){return DecisionArray; } / ** * @return * @author:lulei * @description:決定の評価を取得 * / public int getScoreum(){int sum = 0; for(int i = 0; i <num; i ++){sum+= scorearray [i] [decistianArray [i]]; } return sum; } / ** * @param num * @author:lulei * @description:二国間意思決定者の数を設定 * / public void setnum(int num){if(num <1){system.out.println( "numは0より大きくする必要があります);戻る; } this.num = num; } / ** * @param scorearray * @author:lulei * @description:クラスAの個人とクラスB / public void setScorearray(int [] [] scorearray){if(scorearray == null){system.out.println( "scorray is null"); } if(!(scorearray.length == num && scorearray [0] .length == num)){system.out.println( "scorearrays be" + num); } this.scorearray = scorearray; DecisionArray = new int [num]; //最初の決定、斜めの(int i = 0; i <num; i ++){decisionArray [i] = i; } 決断(); } / *** @author:lulei* @description:最適な決定を計算* / private void decision(){if(scorearray == null || decistianArray == null){system.out.println( "in scorearray"); } for(int stepsize = 1; steptize <num; steptize ++){// Exchange while(compare(steptize)); }} / ** * @param steging * @return * @author:lulei * @description:特定のステップサイズの比較、return値は、交換が発生するかどうかを確認します * / private boolean compare(int steptize){for(int i = 0; i <num -stepsize; i ++){int a1 = i; int a2 = i +ステップサイズ。 int b1 = decisionArray [a1]; int b2 = decisionArray [a2]; //元の2つのスコアの合計int score1 = scorearray [a1] [b1] + scorearray [a2] [b2]; int1 = math.abs(scorearray [a1] [b1] -scorearray [a2] [b2]); //交換後の2つのスコアの合計int score2 = scorearray [a1] [b2] + scorearray [a2] [b1]; int2 = math.abs(scorearray [a1] [b2] -scorearray [a2] [b1]); if(maxflag){//最大最終スコアはif(score1 <= score2){//交換後のスコアは以前の交換よりも少ない//交換後のスコアは以前の交換よりも大きいif(score1 <score2 || hitering intery1){score 1){decantionArray [a1] = b2; DecisionArray [a2] = b1; trueを返します。 }}} elles {//最小最終スコアif(score1> = score2){//交換後のスコアは、交換後のスコアよりも少ない//交換後のスコアは、交換後の差はより大きいif(score1>> | score2 | hitering intery1){decisionArray [a1] = b2; DecisionArray [a2] = b1; trueを返します。 }}}} falseを返します。 } public static void main(string [] args){int [] [] scorearray = {{{0,1,2,3,4,5,6,7,8,9,5,6,7,8,9,0}、{2,3,4,5,6,7,8,8,9,0,1}、 {3,4,5,6,7,8,9,0,1,2,2}、{4,5,6,7,9,0,1,2,3、}、{5,6,7,8,9,0,0,1,2,3,4,5}、{6,7,8,8,9,9,0,1,2,2,3,4,5}、 {7,8,9,0,1,2,3,4,5,6}、{8,9,0,1,3,4,5,6,7}、{9,0,1,2,3,4,5,6,7}、{9,0,1,2,3,4,5,6,6,7}、{9,0,1,2,5,3,5,3,5,3,5,3,5,5,6,7}、 TwoSideDDecision test = new TwoSideDDecision(); test.setnum(10); test.setmaxflag(false); test.setscorearray(scorearray); System.out.println( "Optimal Decision"); System.out.println(jsonutil.parsejson(test.getDecisionArray())); System.out.println( "Decision Score"); system.out.println(test.getScoresum()); }}上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。