DynamicProgramming - kzono/study_haskell GitHub Wiki
ことのおこり
アルゴリズムの初歩はsort法各種だが、その次のステップとして動的計画法というものがあることを知った。ナップサック問題や最短経路問題、スケジュール作成問題など、実用性のあるアルゴリズムらしい。
Haskell にはリスト内包表記があり、離散的な多変数の組合せから評価関数を満たす組合せの集合を簡単に取り出せる。ピタゴラス数が良い例で、実にスッキリと書ける。
「宣言的プログラミング」というらしいが、実現手段ではなく問題(求めたい物、与えられた条件と制約)を記述するだけで答えが出る。 そのことから、Haskellならば動的計画法をスッキリと書けるのではないか、と考えた。
動的計画法は競技プログラミングで頻出するらしい。競技プログラミングではC++が実装言語に選び方ことが多いらしい。恐らく、Haskell と比べるとC++ の方がコード量は多くてその代わり高速且つ省メモリで動くということになると思われる。
できれば実際に同じ問題を複数の言語で実装し、比較してみたい。(Haskell,C++,Rust,Scara,typescript,Elixer,Python)
参考URL
- 動的計画法超入門! Educational DP Contest の A ~ E 問題の解説と類題集
- AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~
- 組合せ最適化・整数計画問題(PDF)
- Programmer Competency Matrix
- Educational DP Contest / DP まとめコンテスト 26問!
- アルゴリズムイントロダクション15章 動的計画法(SlideShare)
- 長方形探索: 最大長方形の面積 Largest Rectangle
- アルゴリズム(2020年度)
切り出し・詰め込み問題
ナップサック問題
- 典型的な DP (動的計画法) のパターンを整理 Part 1 ~ ナップサック DP 編 ~
- ナップサック問題をHaskellで解く
- ナップザック問題をHaskellで解いてみる
- ナップサック問題をHaskellとScalaで
- プログラミングコンテストでの動的計画法(SlideShare)
- ナップサック問題を動的計画法(DP)で解く~最適解も導く~
- 【C#】ナップサック問題の最適値を満たす商品の番号を求める(動的計画法)
- 01ナップサック問題を動的計画法で解く場合の考え方
- 意外と解説がない!動的計画法で得た最適解を「復元」する一般的な方法
- アルゴリズムc 第7回 動的計画法 ナップザック問題
- 欲張り法 [2], 動的計画法
Haskell の文法
Haskell で配列を扱う
Prelude> import Data.Array
Prelude Data.Array> let a = array (1,5)[(i,i^2) | i <-[1..5]]
Prelude Data.Array> print a
array (1,5) [(1,1),(2,4),(3,9),(4,16),(5,25)]
Prelude Data.Array> print $ a ! 3
9
STUArray
- 【Haskell】様々な配列その2(MArray編)
- haskell - 多相型のSTUArray
- Haskellでエラトステネスの篩(STUArray)
- 第20回 更新を高速化するためのSTモナド
- wiki.haskell.org Arrays
- STArray のサンプルコード
- STUArray のサンプルコード
- Haskellの多次元配列パッケージRepaを使ってみました(雑多なまとめ)
- Numeric Haskell: A Repa Tutorial
ビンパッキング問題
- ビンパッキング問題 Wikipedia
- ビンパッキング問題の解き方
- 【Python】ビンパッキング問題
- PuLP による数理最適化超入門
- HaskellでArrayを使用したインプレースなバブルソート
スケジューリング問題
勤務スケジューリング問題
実用性・必要性が高いがゆえに、ライブラリや専用ソフトウェア(solver)が存在する。製品もあるらしい。
python にはこの問題専用のライブラリがあるらしい。(from ortoolpy import shift_scheduling)
ジョブショップ問題
- 組合せ最適化 - 典型問題 - ジョブショップ問題
- スケジューリング問題
- Google Optimization Toolsで組み合わせ最適化
- PuLP による数理最適化超入門
- 2.2 組み立てスケジューリング
経路問題
巡回セールスマン問題
- 巡回セールスマン問題 Wikipedia
- 巡回セールスマン問題から始まる数理最適化
- 巡回セールスマン問題をいろんな近似解法で解く(1)
- 巡回セールスマン問題を遺伝的アルゴリズムを使ってHaskellで解く!
- 簡単そうで難しい組合せ最適化(PDF) -
運搬経路問題
- 運搬経路問題(配送最適化問題,Vehicle Routing Problem) をPuLPで解く
- 運搬経路問題(VRP)を解く 混合整数計画編
- 組合せ最適化 - 典型問題 - 運搬経路(配送最適化)問題