タスクスケジューラを作ってみた

2023年07月23日

プログラミング
タスクスケジューラを作ってみたのサムネイル画像

今日何しようかな、

明日はどうしようかな、

そもそもやること何があったっけ、

どれをいつまでにやるんだっけ、

いつやればいいんだっけ、

あれはどれくらいやればいいんだっけ、

とりあえずスマホ見るか・・


… あー昼だ・・・ご飯食べよ・・


一息ついて・・   


え、もう夕方???今日終わりじゃん・・。

夕ご飯どうしようかな・・。


そろそろ夕食食べるか・・。風呂も入って・・。

あ、友達からゲームの誘い来た。

やるかー。


………。


今日終わってる!?!?!?




はい、よくある光景かなと思います。


これを解決するために、今日やるべきことを自動的に設定するツールを作成しました。

そもそもの予定組で迷いたくない!



タスクの分解

この世界には2種類のタスクしかない。

①定期的なタスクか

②期限ありのタスクだ。


自分の抱えているタスクを見直したとき、上記の①か②に大別できるのではないかと考えました。

例えば洗濯や買い物、風呂、食事などは定常的なタスクですし、逆に資格試験の勉強をするとか楽しみにしている本を読むなどは期限ありのタスクです。


ツールの構成

googleカレンダーから予定を取得し、予定がすでに入っている時間帯はほかの作業が入れられないものとして扱います。

定期的なタスクと期限付きのタスク、タスクの関係から†最適化†を行い、結果をgoogleカレンダーに戻します。


†最適化†

モデル



モデルの説明

目的関数:タスクごとに評価値を用意しておき、タスクをどれくらいこなせたかで評価。

制約:

・同じ時間に2つのタスクはできない

・寝ている間はタスクはできない

・1日のタスクには上限時間と下限時間がある(例:ランニングを1日12時間はできない)

・開始時間より前、または終了時間より後にはそのタスクはできない(例:朝6時から晩ごはんは食べられない)

・期限付きのタスクを目標時間できたら報酬を与える

・数日おきに決まった時間やらなければいけないタスクをこなしている

・休日平日それぞれでやるべきタスクをこなしている

・タスク間に時間が必要な場合はインターバルを入れる(例:プールで水泳と家で読書はすぐに切り替えることはできない)


結果

頑張る。。頑張れるかこれ・・?





おまけ


課題

・旅行などが入って長期で予定が入ると実行可能解が見つからない。

 ⇒制約ではなく、目的関数のペナルティにすべき?

・目標が遠い場合計算対象の期間を延ばす必要があり、計算時間がかかる

 ⇒目標遠ければ、いったん仮の目標を立てるように分割する?

・ふと予定が入ったときに動かしづらい

 ⇒毎回全体計算するわけじゃなくて、局所的に入れ替えるようなアルゴリズムを実装すべき?

・天気などの考慮ができない

 ⇒天気も何かAPI叩いて取得する?既存の予定が変更になることもある。

・残業で予定が狂う

 ⇒変わりうる予定はどう対策すればいいんだろうなぁ。未定

・気分が乗らないことがある

 ⇒どうすればええんやろなぁ