未知の問題への取り組み方モデル
未知の問題への取り組み方モデル
ここでいう問題とは
数学的な問題も物理的な問題も含む
競技プログラミングのAtCoder_Beginner_Contestで提示される問題などもそう。
さらにはイラストなどの創作における問題も指す。
全てにおいて有効というわけでは無いが、未知の問題に対抗するために有力な取り組み方とはなる。
1. 具体例で実験し、そのモデルの振る舞いを知る。
図に書き起こして可視化するとよい
振る舞いがすでに見えている場合にはこの段階をスキップできることもある。
(定石問題・典型問題)
1. 性質が見えない時・そもそも実験が困難な時は
a. 実験する規模を部分的・矮小にする
b. 問題で起こっている現象が何を述べているかについて、論理式として理解する
c. さらに簡単な形にすることを狙う
限界
性質の捉え方・フレームワークが備わっていない
大量に実験を行うことで捉え方を見出すこともできるが....
そのような知識がない状態では時間を大量に消費することは避けられない。
学んで、その時間を短縮することも大事
専門知識は考える時間を大幅に短縮するためにある
そもそも論理式として理解できていない
2. アナロジー・アブダクション・必要条件によって解決の方針を立てる。
ここの方針立てにはさまざまな方法が使える
必要条件から探索範囲を絞る
固定して考えた方がわかりやすい
ゴールから逆に辿る
3. 解答の方針に最も適した形で問題を書き下す
その方針が正しいか証明することにも繋がる。
競技プログラミングだと特に正しいかどうかを考えずに実装に移れてしまう
その方針が正しいか?を確認しないと、後でバグに苦しむことに。
しかし、時間が迫っていると、わたわたとして何をしたらいいかわからなくなりがち
自分が試験系のものが苦手な理由
ここでやることを明確にする。
問題を解く時にわたわたしたら、全体像を扱いやすい形に置き換えることをまず目的にする
わたわたしている時は、そもそも問題がどうなっているかわかっていないことが多い。
例
ABC313 E - Takahashi Quest
ABC 072 D - Derangement
動的計画法はDAGの最短経路問題に帰着して扱える
全ての解答・入力パターン・戦略などを数学的に扱いやすい方式で表現する。
線図・グラフ・表など
そうすれば、とっかかりをもって議論しやすくなる。
そもそも「置き換えやすい形」が思い浮かばなければ...先人の知識を頼ろう。
4. その方針で正しそうかを実際にやってみる
プログラムで実装する部分であれば、競技プログラミングでバグった時のためのチェックリストを参考にしながら。
5. if その解法で困難が生じた
ここでいう困難
代数的にうまくいかなさそう
うまく行っても解法がとても汚くなりそう
今までの自分はここがうまくできていなかった。appbird.icon
5-1. なぜこの困難が生じたか言語化する。
2024-03-31の自分は、ここが難しいと感じている。
この部分を練習したい。
5-2. 1.に立ち戻り、この困難を回避するように性質を理解する。
6. うまく行けたら万々歳
演習問題に取り組んでいて、解答例がある場合には?
基本的には10分経っても1か2で止まっている場合は解答を見た方がいい
実験をしても、問題を解くのに有用な法則を抜き出しにくい問題もある。
そもそも実験しづらいことも。
自分の知識量、バイアスなどもあり、正しいモデルを探し出すのには多大な時間がかかる。
自分には思いもよらない捉え方・フレームワークが載っている可能性が高い
c.f. ABC335 D -- Pylamid
車輪の再開発をするよりも先人から知識を学ぶほうが時間効率的には良い
自力で思いつくことも大事
だが、思いつく能力を涵養するメリットが、本来の目的に対してどれぐらいの利益になっているかは時間経過で非線形に変化すると捉えることも大事
二次関数的なんじゃ無いかと思っている
自分は道具を与えられた時にそれの使い方を自力で見出すのが苦手
--> 例をたくさん学んで考え方のフレームワークを抽出して、より多くのものに応用できるようにすることが大事になる。
4. で止まっている場合は、開始してから15分経つまでそのまま続けてみる
バグ取りとか
ただし、埒が開かないと思ったら困難だとみなして回答を見てみる。
4.で15分以上経ってたら諦めて回答を見るのがいい。
4.で、自分の思いもよらない楽な方法がある可能性がある
そもそも「困難」だと認識できていない可能性もある
c.f. D - Polyomino - AtCoder Beginner Contests 322
ここの記述に影響を受けているappbird.icon
基本へさかのぼって考える.(i.e. 「定義」に立脚して解く.)
現象そのものをあるがままに見つめる.(i.e. 実験する)
計算を合理的に行う.
https://hirose-math.com/study_method/ 広瀬教育ラボ -- 勉強法総論
前のモデルからの改善
大学受験・これまでの大学生活を通して、1.と2.をなんとか会得しつつある。
しかし、それでも問題が解けない...それはなぜか?
高校の友達「困難を捉えようとしていないのが原因では」
典型問題ならともかく、世の中で実際に出会う問題は一発目で編み出した手法がうまくいかないことも多々ある。
一発目から良い方法を編み出すことはとても難しい
困難を「無理やり」乗り越えるものではなく、うまく避けるものとして捉え直した姿勢を強めたモデルへと考え直した。
問題を楽に楽に解こうとする怠惰な姿勢
実践例
簡単な例:畳み込み演算に対して直感的なイメージをLTIシステムのイメージをもとに得る
メタ解析
単純な具体例をまず試して方針を得て、
そこから行き着いた変数変換から本質を理解しようとしたけどうまくいかなさそうだった
これを「困難」と捉え諦めて
もう一度単純な具体例をもとに話を進めてみた結果
単純な具体例をもとに一般の例においても議論できることに気づいた
問題が完全に解決した