---
# System prepended metadata

title: 'Reinforcement Learning : day 2 Q-Learning'

---

# Reinforcement Learning : day 2 Q-Learning

## 題材
[巡回セールスマン問題](https://en.wikipedia.org/wiki/Travelling_salesman_problem)を強化学習で解いてみたいと思う。

## 問題設定
巡回セールスマン問題を「Framework for Reinforcement Learning」に落とし込む。
使うデータは[ここ](https://amano-tec.com/data/megacities.html)
* State
  * 彼が現在いる国. 状態の数は国の数と一致する
* Action
  * 彼が次に訪れる予定の国. 行動の数は国の数と一致する
* Policy
  * 彼が一度訪れた国は選択できない（一度訪れた国の遷移確率は0である）
* Transition
  * 宣言した国に必ず行ける（確定的行動をとれる）
* Reward
  * **++現在いる国と次に訪れる国との距離++**

この Reward をどう定義するかが学習の鍵だが、、いったんこれで学習する

## 実装
https://github.com/kazukingh01/kkpackages/blob/master/kkreinforce/main/main.py#L10-L19

## 学習
とりあえず学習した。
episode は一連の学習を示す単位である。
ここでは、初期状態から全ての国に到達するまでの過程を1 episode とする。
### episode = 0
![](https://i.imgur.com/qwVgaxG.png)
### episode = 1000
![](https://i.imgur.com/f2gPHwX.png)
### episode = 5000
![](https://i.imgur.com/cIDcz0X.png)

## 課題と考察
問題設定時点で分かってはいたが、彼が学習しているのは、「**次に行く国のさらに次に行く国に近い国があるか**」みたいな指標である。
これは全体距離を最適化するような学習にはなっていない。
全体距離を最適化するには、**過去に行った国に依存した学習が必要不可欠だからだ**。
それを実現しようとすると、状態$s^{(t)}$は次のように行った国に依存する。

現在 80 カ国を定義している。
過去に行った国に依存しない現在のQ-tableの状態は80である。
これに過去に行った国の依存を考慮すると
状態は、国80×過去訪問履歴$2^{80}$×step数80の値になり、とてもじゃないが学習できない。

簡単のため、国の数を7にして、step数を無視してやってみた。
Q-table は下記のように定義してみる。

例
|  | 国1 | 国2 | ... | 国7|
| -------- | -------- | -------- | -------- | -------- |
| 国1,0,0,0,0,0,0,0 | 0.2     | 3     | ... | 2.3 |
| 国1,0,0,0,0,0,0,1 | 0.3     | 3     | ... | 2.3 |
| 国1,0,0,0,0,0,1,0 | 0.4     | 2.2     | ... | 1.3 |
| 国1,0,0,0,0,0,1,1 | 0.3     | 1     | ... | 2.3 |
| ... | ...     | ...     | ... | ... |
| 国7,1,1,1,1,1,1,1 | 0.2     | 3     | ... | 2.3 |


Reward が難しくて（何が正解かわからないが）とりあえず次のようにしてみた。
全ての国を回った時
　合計距離
それ以外
　国と国の距離

結果
![](https://i.imgur.com/oYjMIUO.png)

うーんうまくいかない。
とりあえず実装をのせておく
https://github.com/kazukingh01/kkpackages/blob/master/kkreinforce/main/main.py#L22-L31

[次勉強するための参考]
https://www.slideshare.net/RyoIwaki/ss-87924430
https://qiita.com/panchovie/items/86323946cceca6695e91
https://arxiv.org/pdf/1611.09940.pdf
https://github.com/MichelDeudon/neural-combinatorial-optimization-rl-tensorflow