問題は分割して考えるべき

一般的に、何かの問題を解決したい場合は、解決する道筋を考えて、問題を分割しようとするべきです。
そうすることで、

  • やるべきことが明確になる
  • わからない所が出てきた時に調べやすくなる
  • 作業分担ができるようになる

といったメリットがあります。

これは、プログラミングにも言えることです。
初学者の場合、何かのプログラムを作る時に「何から手をつけたら良いのかわからない」という状態になることがあります。
この状態になった時は、どのように処理を組み合わせれば作りたいものを作れそうか、日本語で良いので列挙することが重要です。
そうすることで、思考を整理できますし、熟練者に質問もしやすくなります。


例として
「Windows端末で、ワンタッチでファイル内の”a”の文字を”b”に置換する」
という問題を考えてみます。

まずは、以下のような2つの問題に分割することができます。

  • どのプログラミング言語で実装するか
  • どのようなロジックで実装するか

「どのプログラミング言語で実装するか」という問題に関しては、今回は手軽さ・性能の高さ・汎用性の高さのバランスが良いC#で実装することにします。

「どのようなロジックで実装するか」という問題については、更に以下の3つの問題に分割することができます。

  • C#のプログラムをワンタッチで実行する
  • ファイルの入出力を行う
  • “a”の文字を”b”に置換する

「C#のプログラムをワンタッチで実行する」については、「Hello World!」と呼ばれる文字を出力するだけの最も簡単なプログラムを実行してみるのが良いです。
今回は、以下のように、batファイルから実行する方法を採用します。これにより、batファイルをダブルクリックするだけでC#のプログラムを動かすことができるようになります。

・フォルダ構成

・execute.bat

・replace.cs

・実行結果

コンソールが立ち上がり、”Hello World!”と出力される。


「ファイルの入出力を行う」については、ファイルを入力して1バイトずつ読み込んでそのまま出力するだけのプログラムを作るのが良いです。
先に作ったプログラムを少し改変してみます。

・フォルダ構成

・replace.cs

・input.txt

・実行結果

filesフォルダの下にoutput.txtが生成され、中身はinput.txtと同じになる。


あとは、読み込んだ文字について「”a”の文字を”b”に置換する」処理を追加すれば、今回の問題は解決します。
先ほどのプログラムを改変してみます。

・replace.cs

・実行結果

filesフォルダの下にoutput.txtが生成され、中身は以下の通りになる。


今回は、新人研修の度に毎回教えていることを記事にしました。
新人研修の時はJavaのプログラムの課題を題材にしていますが、題材を問わず同じことが言えます。

問題を分割して考えられるようになるだけでも仕事を進めやすくなるので、今まで意識できていなかったという方には改めて意識することをお勧めします。

ラポール形成とは

ラポール形成とは、相手との信頼関係を築くことで、コミュニケーションを円滑に進められるようにするためのテクニックです。
元々カウンセリングのテクニックですが、ビジネスにも応用可能です。


自分の立場からの意見を通したり、アドバイスにより相手の行動を変えて欲しいと思っていたりする場合、正論や成功体験を一方的に語るだけでは反感を買うだけとなり、聞き入れてもらえません。
そこで、相手の話を聞き、相手の立場に理解し共感することで、心理的な信頼関係を最初に築くことが重要になります。

まずは、相手を尊重し、相手の言うことに耳を傾けることが重要になります。
その際、相手の言うことを否定せずに、相手を理解しようとすると良いです。
(たとえ、自分の立場や信条、価値観、といったものに相いれない話だとしても、一旦理解することに努めて下さい)
社内外や家族の人間関係のような、プライベートな話までしてくれるようになるのが理想的です。

自分の意見を発したりアドバイスをしたりするのは、このようにして信頼関係を得てからです。
信頼関係を得てからであれば話を聞き入れてもらいやすくなりますし、相手の立場や心理状態に合わせた形でより適切に意見やアドバイスができるようになるという副次的なメリットもあります。


例えば、TOEIC高得点を取りたがっている新人エンジニアに対して、自分は基本情報処理技術者試験を優先して欲しいと思っているとします。
ここで、頭ごなしに基本情報処理技術者試験を優先するように言うのはNGです。

その代わり、まずはなぜTOEIC高得点を取りたがるのかを聞く必要があります。
そうすると、「今は海外のエンジニアと仕事するのが当たり前なのでTOEICを勉強したい」のような回答が返ってきます。
その気持ちを尊重した上で、「国内で実績を重ねないと海外でも相手されにくい。まずは基本情報処理技術者試験でエンジニアとしての基礎を固めて、国内で実績を重ねてから、海外のことを考えた方が良い」のような形でキャリアパスを提示しながら基本情報処理技術者試験を勧めると、聞き入れてもらえる確率が高くなります。


以前に「IT業界におけるメンタルヘルス対策」という記事を書きましたが、その時に「ラポール形成」については別の記事に書こう、と決めていました。
そう決めたままで今まで投稿していなかったのを思い出したので、投稿しました。

専門的な知識無しにビジネスの場で応用できるテクニックですので、覚えておいて損はないでしょう。

相手の論理に乗っかった主張が最も受け入れられやすい

交渉や議論の場で、相手の主張に対して自分の主張を通したい場面があるとします。
この場合、相手の論理に乗っかった形で展開される主張が一番通しやすいです。

相手は、何かしらの主張を行う際に、論理を積上げます。
その論理の中で何かしらの問題点があれば相手の主張は崩れるので、相手は相手自身の論理を否定することができません。
そのため、相手の論理の中で自分の主張に取り込むことができる部分があれば、その部分は相手に否定されることがなくなります。

例えば、自分が投資商品の販売員だとし、相手が見込客だとします。
そして、相手が、以下のような主張をしたとします。
主張 「私は投資はしない」
論理①「私は心配性なので、リスクは負いたくない」
論理②「投資は金額が減ったり増えたりするので、リスクがある」
論理③「だから、私は、投資せずに全額預金する」

ここで、相手の論理の中には、自分の主張に取り込めるものがあります。
それは論理①です。
預金は見た目の金額は減らないものの、物の値段が上がった時(インフレになった時)に、実質的に金額が減るデメリットがあります。
しかし、金(金属の金)へ投資していれば、物の値段が上がった時に金の値段も上がり、金の値段が上がったタイミングで換金することでそれを防ぐことができます。

以上のことを踏まえると、以下のように論理を組み立てることで、少なくとも論理①の部分については否定されることがない強固な主張となります。
主張 「あなたは金へ投資した方が良い」
論理①「あなたは心配性なので、リスクは負いたくない」←絶対に否定されない
論理②「預金はインフレの時に価値が目減りするリスクがある」
論理③「だから、あなたは、資産の一部を金で持った方が良い」


なお、心理学には似たような概念として、「一貫性の原理」というものがあります。
「一貫性の原理」とは、「人間は、やると決めたことや人に宣言したことを、一貫性をもってやり遂げようとする傾向がある」という原理です。
「その方が社会的に信用を得やすい」という理由と、「その方が判断にかかるコストを少なくできる」という理由により、このような傾向になりやすい、と言われています。

ただし、「一貫性の原理」は、論理について説明した概念というよりは、心理的バイアスについて説明した概念であるため、今回の私の記事で説明したテクニックとは少し趣が異なってきます。
論理を組み立てるというよりは、人間のバイアスを使った少しずるいテクニック、という色が強くなります。


いかがでしょうか。

IT業界においては、設計したりプログラミングしたりするだけでなく、時には交渉や議論が必要になります。
そこで、今回取り上げたようなテクニックが役に立つことがあります。

交渉や議論におけるテクニックはこれからも解説していきたいと思います!

ゲーム理論を現実世界へ適用するにあたっての留意点

ゲーム理論については、前回の記事と前々回の記事で解説しました。

ゲーム理論は話だけ聞くと簡単そうに見えますが、実際に適用しようとするとある壁にぶつかります。
その壁とは、「適用対象をゲームとして正しく認識することが困難」という壁です。
ゲームとしての認識が誤っていると、ゲーム木や利得表を正しく書くこともできなくなり、そこから導き出される分析結果も誤ったものになってしまいます。

今回の記事では、この問題について例を挙げて説明し、どのような落とし穴があるのかを詳しく書いていきます。

【ゲーム理論の3つの前提条件】

ゲーム理論で分析を行うためには、以下の3つの前提条件が必要になります。
「適用対象をゲームとして正しく認識する」を具体的に言うと、「以下の3つの前提条件を正しく設定する」ということになります。

・利害関係のあるプレイヤーの洗い出し

ゲーム理論とは、自分が選んだ選択肢と相手が選んだ選択肢の組み合わせで結果がどのように分岐するのかを分析する理論である。
そのため、まずは結果に影響を与えるような利害関係のあるプレイヤーを洗い出す必要がある。

・各プレイヤーが持つ選択肢

前述の通り、ゲーム理論とは選択肢を選んだ結果を分析する理論であるため、その「選択肢」を洗い出す必要もある。

・選択肢を選んだ結果得られる利得

ゲーム理論における「結果」は「利得」と呼ばれているが、その利得の大小も定義する必要もある。

【前提条件を設定する難しさ】

上記の前提条件は、ゲーム理論の例題では自明です。
しかし、現実世界の問題では前提条件は自分で設定する必要があります。
(スポーツ・ボードゲーム・コンピューターゲーム等のような実際に遊ばれているゲームに対してゲーム理論で厳密に分析する場合にも、前提条件を疑う必要があります)

これらの前提条件を設定するのは意外と難しいです。
以下では、ゲーム理論の代表的な例題である囚人のジレンマでの例を挙げて説明します。

・利害関係のあるプレイヤーの洗い出し

一見利害関係がありそうなプレイヤーは実は利害関係がなかったり、逆に意外なプレイヤーと利害関係があったりします。
囚人のジレンマの例では、相手の囚人の行動が自分の量刑に影響しないのであれば、相手の囚人をプレイヤーとして仮定するのは不適です。
また、被害者の気分で量刑が変わるのであれば、被害者をプレイヤーとして見立てるべきです。

・各プレイヤーが持つ選択肢

発想を膨らませると、選択肢も色々なものが想定できます。
囚人のジレンマの例では「黙秘」「自白」のみが選択肢として与えられていますが、囚人の能力や状況次第では「賄賂支払」「脱走」といった選択肢も想定する必要があります。

・選択肢を選んだ結果得られる利得

各プレイヤーの目的や価値観、心理的バイアス、外部から与えられた要素等によって、実際に感じる利得は変化します。
例えば、囚人のジレンマにおいては、プレイヤーには「刑を免れる」以外の目的はないことが前提として置かれています。
しかし、現実世界では「正義の主張」という目的が潜んでいる可能性があります。
この場合、自白をすることで「正義の主張」という目的を果たすことができ、それがプレイヤーの主観的な利得に影響を与え、そのプレイヤーにとっては自白一択になる可能性があります。

【ゲーム理論を現実世界で用いる上での心構え】

ここまでで述べたように、ゲーム理論の前提条件の設定には難しさがあります。

ゲーム理論を現実世界で用いるためには、現在のゲームがどのようなゲームなのか、メタ的な目線で分析することが欠かせません。
囚人の量刑を決める場面で常に囚人のジレンマが発生するとは限りません。
先入観に捉われず、現在の状況をゲームに置き換えるとどうなるのか、というのをその場その場で考える必要があります。

その上で、ゲームを作り変える、という視点があるとより有効にゲーム理論を活用することができます。
例えば、囚人のジレンマの例で言うと、予め財を成しておけば、「賄賂支払」という選択肢が選択肢が生まれ、相手の選択肢に関わらず無実を勝ち取れるゲームを作り出すことができます。
どのようにゲームを作り変えれば良いのか、を考える上でも、ゲーム理論の現状分析は役に立つと思います。


いかがでしたでしょうか。

長くなりましたが、ゲーム理論に関する一連の記事は以上になります。

ゲーム理論は情報処理技術者試験のような試験で勉強する内容ですが、せっかくであれば試験対策だけでなく実際に活かした方が良いと思っています。
今回の記事では、実際に活かすにあたって注意するべきことを挙げてみました。

これからも、実践に即した記事を書いていきたいと思います!

ゲーム理論(二人・二択)の混合戦略の確率の求め方

ゲーム理論については前回の記事で触れましたが、今回の記事はその続きです。

今回の記事では、混合戦略の確率の求め方について、詳細を書いていきます。

混合戦略は、何度も同じゲームを繰り返す場合において、相手がどのような確率で選択肢を選んだとしても、全ゲームで得られる平均の利得を一定にすることを意図したものです。
長期的な目で見て、利得が下がるリスクを最も軽減できる戦略です。

この戦略の実現方法について直感的に書くと、リスクの高い選択肢(相手が選ぶ選択肢によって利得が大きく変わる選択肢)を選ぶ確率を少なめに、リスクの低い選択肢(相手が選ぶ選択肢によって利得が大きく変わるらない選択肢)を選ぶ確率を多めにすると、混合戦略に近くなります。

各選択肢の選択確率を正確に求めるには、連立方程式や微分方程式等を用いて計算を行う必要があります。
今回の記事では以下の前提で計算を行います。

  • 劣等戦略(相手がどのような選択肢を選んだとしても、他のある選択肢以下の利得しか得られない選択肢)はあらかじめ除外
  • プレイヤーが二人で、選択肢は二択のゲームを想定

【今回の例で取り扱う利得表】

【混合戦略の求め方】

1.連立方程式を解く方法

選択肢Aを選ぶ確率をp、選択肢Bを選ぶ確率を1-pとおく。
混合戦略が成り立つ時、相手が選択肢aを選んだ場合の期待利得と相手が選択肢bを選んだ場合の期待利得は等しくなるため、以下の式が成り立つ。

以上より、選択肢Aを選ぶ確率が0.2、選択肢Bを選ぶ確率が1-0.2(=0.8)の時に、混合戦略となる。

2.微分方程式を解く方法

選択肢aが選ばれる確率pが決まる時、選択肢bが選ばれる確率は1-pという形で一意に求まる。
また、混合戦略の定義は、「相手が選択肢aを選んだ場合の期待利得と相手が選択肢bを選んだ場合の期待利得が等しくなるように選択肢を選ぶ」である。
そのため、混合戦略の定義は、「相手が選択肢aを1の確率で選ぶ場合の期待利得と相手が選択肢aを1-1(=0)の確率で選んだ場合の期待利得が等しくなるように選択肢を選ぶ」と置き換えることができる。

そこで、相手が選択肢aを選ぶ確率をx軸、自分の利得をy軸に置くと、以下のグラフを得られる。
下記のグラフについて、線分A-A’は選択肢Aを選んだ場合の利得、線分B-B’は選択肢Bを選んだ場合の利得、線分C-C’は混合戦略となる場合の利得を示している。

線分A-A’と線分B-B’を式に表すと以下のようになる。

線分A-A’と線分B-B’を微分し傾きを求めると、以下のようになる。

ここで、線分C-C’は混合戦略であり、xの値によらずyは一定のため、傾きは0である。
線分A-A’をpの比率で、線分B-B’を1-pの比率で合成し、線分C-C’を生成する場合、比率pは以下の式で求まる。

以上より、選択肢Aを選ぶ確率が0.2、選択肢Bを選ぶ確率が1-0.2(=0.8)の時に、混合戦略となる。

【検算】

選択肢Aを選ぶ確率が0.2、選択肢Bを選ぶ確率が0.8の時の期待利得を求める。

相手が選択肢aを選んだ場合、自分の期待利得は以下のようになる。

相手が選択肢bを選んだ場合、自分の期待利得は以下のようになる。

①と②が等しいため、選択肢Aを選ぶ確率が0.2、選択肢Bを選ぶ確率が0.8の時に混合戦略となる。

【混合戦略の簡単なイメージ】

教育機関で教えられるのは連立方程式を解く方法で、複雑な状況に対応することを考えるとこちらの方法を用いるべきです。
しかし、プレイヤーが二人で選択肢が二択というような簡単な状況では、微分方程式を解く方法の方が簡単にイメージできます。

傾きを合成して0にするだけなので、簡単に書いてしまうと「選択肢Aの傾き:選択肢Bの傾き*-1」の逆数がそのまま「選択肢Aを選ぶ確率」と「選択肢Bを選ぶ確率」になります。
上記の例で言うと、「4:1」の逆数「1/4:1」=「1:4」=「0.2:0.8」が「選択肢Aを選ぶ確率」と「選択肢Bを選ぶ確率」になります。
手続き型のプログラムで計算できるように計算式を書くと、以下のようになります。


いかがでしたでしょうか。

今回の記事では、前回の記事では簡単にしか触れなかった混合戦略について、詳しく書いていきました。
実際にゲーム理論を応用する場合は、数字や確率で状況を表すことが難しい場合が多いので、「リスクの高い選択肢を選ぶ確率を少なめに、リスクの低い選択肢を選ぶ確率を多めにする」という直感的な理解で問題無いと思います。

ゲーム理論を現実世界に応用する際には、いくつかの注意点があります。
それを、今後の記事で書いていきたいと思います。