これはKAZOONの不定期日記(チラシの裏)の2022年版です.下に行くほど新しいです. 2022/1/6 mgmg更新 中間表現を使ったString#searchの高速化,Mgmg.#find_lowerbound, Mgmg.#find_upperboundの追加に加え,利便性改善を図る修正を行った. Mgmg.#find_lowerbound 系は安全のために枝刈りをあまりやっていないため,特に複数武具の場合に十分高速とは言えないが,それでも中間表現によって大分マシになった. 段階的に探索することを利用して,探索範囲を狭めても良さそうではあるのだが…… レシピ文字列解釈をC言語でやるのは面倒でやる気がしなかったが,中間表現からC言語の世界に持っていくという手はあるかもしれない. 2022/4/19 更新履歴 CGIのrubyバージョンを3.1.2に更新. 2022/5/14 更新履歴 お気に入りリストを少し更新. チャーシューメンさん.遊戯王はべつにやらないんだけど,ビスクドちゃんの動画,妙に気に入ってしまったんですよね. ポリスさん.独特の雰囲気を持つ方で,その優しさは大変好ましく思います. かがりめさん.Detroit: Become Human ですね. 美しい映像作品を見た後に外を歩くと,その解像度,ダイナミックレンジ,立体感などからくる鮮やかさや眩しさに,酔うことがあります. 今回それを経験したのが,この Detroit: Become Human の実況です. 初見維持のために保留している作品に Undertale があり,これ以上重ねるのは無理ということで,初見プレイの権利は放棄しましたが,なかなかに強い作品でした. プレイ,編集も興味深く,多くを見たわけではありませんが,この実況を体験できたのは非常によかったと思います. 2022/6/2 更新履歴 ブースター性能表を旧表に移行していたが,一部リンクが残っていたので修正. 2022/6/9 mgmg 1.4.2 ようやく重い腰を上げ,ヌシの性能調査と,ついでにmgmgへの強化効果の実装を行った. まずはヌシから.実は新仕様の釣りをやるのも初めて. リアルの釣りは知らないから何とも言えないが,ダメージを与えている間の手応えがないのが少し気持ち悪いな. 料理効果はなかなか強力で,アースドランの氷河酒蒸しで物防87.ドラバーンの35とは隔絶していると言える. 再考レシピの重鎧で言えば,低レベル用の重量9,強化込み5万狙いが,(防120, 道238)から(117, 226)に, 2人クリア用の剣用重量8強化込み10万狙いが(120, 280)から(120, 264)となり,それぞれ約1割の経験値削減が可能となった. 他方,ドロップで容易に手に入るドラバーンと違い,釣りを鍛えなければならないヌシは相応に重く,これくらいの効果はほしいところだろう. ついでに初期の低料理Lv時の料理についても調べてみた. Lv0のウッチの氷酒蒸しでも物防11と,なかなかに強力であるが,焼きネギタマ,☆7サボテン焼きの物防15があることから, これを超えるLv6のガガッチの氷水酒蒸し(物防19)からが本格運用と言えるだろう. 他方,その後の伸びは悪く,Lv12のガガッチの氷河酒蒸し(物防22),Lv15のドランギョの氷河酒蒸し(物防24)と続くが,Lv上げに見合う効果とは言えない. 最終的にLv24のドラバーン(35),Lv27のアースドラン(87)まで行くが,絶望まででは過剰戦力と言えるだろう. 最短日数の希望/絶望動画に取り掛かっているところだが,焼きネギタマかウッチの氷酒蒸しで十分ではないだろうか. 少なくとも,ガガッチ,氷河酒,ドランギョ,ドラバーンを扱えるまでに料理するくらいなら,その分防具製作を鍛えたほうが強くなるだろう. Lv0で料理大会に突っ込んで,Lv6まで稼げるなら狙う価値はあるか? mgmgの新機能としては,これら料理効果(装備にかかる攻撃,物防,魔防のみ)と,パッシブ/アクティブスキルをそれぞれ盛り込んだ. 主に search 時にキーワード引数として与えることで,目標値を予め割り算する手間を省くために使うことを想定している. Wikiでは計算式が登場していたので実装してみたが,正確ではないため,最低料理Lvでのプリセットをいろいろ突っ込むことにした. README.md にも記載したが,以下のような使い方が想定例である. r = '重鎧(皮2綿1)+[帽子(宝1宝1)+[重鎧(玉5金3)+[帽子(宝1宝1)+[重鎧(玉5金6)+[軽鎧(金3骨1)+[重鎧(皮2骨1)+軽鎧(鉄10綿1)]]]]]]' sc = r.search(:phydef, 100_000, reinforcement: %w|物防御UP アースドランと氷河酒の蒸し焼き ガードアップ|) p [sc, Mgmg.exp(*sc)] #=> [[120, 264], 152502] 高料理Lv時の料理を使いたい場合は,料理Lv168で物防139なら,"アースドランと氷河酒の蒸し焼き" の代わりに,Mgmg.cuisine(0, 139, 0) などとする. Wikiの計算式を使う場合は Mgmg.cuisine('蒸す', 'アースドラン', '氷河酒', 168) などと書けるが,物防141と,そこそこずれるので注意が必要. ついでとなってしまうが,お気に入りリストで,ニコニコのkepposさんを追加. キャラ付けのかわいさに加え,本人の「好き」があふれる感じがまさに理想的と言える. 2022/6/22 mgmg 1.5.0 及び装備計算機オンラインの更新 煩雑化していたキーワード引数を取りまとめる変更を行い,伝達漏れのバグの解消及びパフォーマンスの改善をした. 従来とは引数の与え方が変わる,互換性のない変更なので,注意されたい. str.build(left_associative: false) は str.build(opt: Mgmg.option(left_associative: false)) と書くようになった. パフォーマンスの改善として,Enumerable#search において,バグにより中間表現を用いた高速化が十分機能していなかった問題が解消されたことによる影響が大きい. その他,細かい点での修正もあり,全体のパフォーマンスもわずかに改善している. マイナーバージョンアップに伴い,String#min_level(w=0), Enumerable#min_level(w=0) の仕様を大きく変更した. 合成後の重量を目標以下にするための最小鍛冶・防具製作Lvを計算できるようにし,利用しやすくなった. ただし,Enumerableの場合は,鍛冶と防具製作のバランスが発生しうるため,武器と防具を個別に計算する仕様となっている. 目標重量 w が 0 以下の場合,最小重量-w の指定となる.つまり,デフォルトの 0 なら最小重量,-2 なら最小重量より 2 だけ大きい重量を目標とする製作Lvを計算する. 従来では,min_levels(1) で 2 番目に大きいレベルと,min_level(2) で 1 番大きいレベルを比較するなどの手間が必要だったが,これが自動化された. 関連して,String#min_weight, String#max_weight, Enumerable#min_weight, Enumerable#max_weight, Enumerable#min_weights, Enumerable#max_weights が実装された. 従来の Mgmg::Equip#min_level 関連のメソッドは,Mgmg::Equip#min_levels_max, String#min_levels_max, Enumerable#min_levels_max に引き継いだが,あまり利用シーンは思い浮かばない. また,String#min_smith, String#min_comp 等において,製作スキルが必要ない場合の返り値を 0 から -1 に変更した. 合成後の重量を参照する String#min_level, Enumerable#min_level の実装に伴い,重量ベースで探索範囲を指定できるようになった. r = '双短剣(金3皮1)+[杖(水1綿1)+[斧(玉5水1)+[杖(鉄1綿1)+[[斧(木2金3)+剣(鉄10皮1)]+[剣(木2綿1)+双短剣(鉄10皮1)]]]]]' に対し, r.search(:atk_sd, 2000, 68) と,最小鍛冶レベルを明示的に示す必要があったものが, r.search(:atk_sd, 2000, opt: Mgmg.option(target_weight: 9)) r.search(:atk_sd, 2000, opt: Mgmg.option(target_weight: -1)) のように,target_weight キーワードのオプションの指定で済むようになった. タイプ量は増えているように見えるが,必要な鍛冶・防具製作Lvを特定する手間が大きく省かれている. 装備計算機オンラインでは,上記の変更に伴う内部的な修正に加え,前バージョンで追加されたスキル・料理による強化を含められるようにした. スキル名,プリセット料理名による指定のみとなるが,十分だろう. 2022/6/24 mgmg 1.5.1 レシピとオプションはセットとして扱ったほうが便利であると気づいたため,Mgmg::Recipeを創設.ついでに注目パラメータもセットにして取り扱えるようにした. String/Enumerable#to_recipe(para=:power, **kw) で生成でき,オプションオブジェクト生成に渡すキーワードを直接渡すことで,Mgmg.#optionを呼び出さずに済むようになった. 主要なメソッドはMgmg::Recipeのインスタンスメソッドとして定義され,呼び出し時にキーワード引数を渡すことで,一時的な上書きも可能にした. r = '双短剣(金3皮1)+[杖(水1綿1)+[斧(玉5水1)+[杖(鉄1綿1)+[[斧(木2金3)+剣(鉄10皮1)]+[剣(木2綿1)+双短剣(鉄10皮1)]]]]]' r.search(:atk_sd, 2000, opt: Mgmg.option(target_weight: 9)) は,以下のようになる. str = '双短剣(金3皮1)+[杖(水1綿1)+[斧(玉5水1)+[杖(鉄1綿1)+[[斧(木2金3)+剣(鉄10皮1)]+[剣(木2綿1)+双短剣(鉄10皮1)]]]]]' r = str.to_recipe(:atk_sd, target_weight: 9) r.search(2000) また,String#to_recipeに限定して,☆20超えのチェック機構を導入した. ついでに,複数装備時の装備数のシャローコピーバグを修正した. 2022/7/17 mgmg 1.5.6 Version 1.5.1 から 1.5.6 にかけて,見逃してきた,または新たに追加されたバグが修正された. 追加の仕様としては,Mgmg::IR#atk_sd などにおいて,分母が1のRationalを返す場合,代わりにIntegerを返すようにした. 細かくアップデートしたので,バージョン番号だけは増えているが,残りはすべてバグ修正である. 2022/10/15 mgmg 1.5.7 cut_expオプション周りのバグの修正と,Mgmg::Recipe#find_max の追加を行った. Mgmg::Recipe#find_max(max_exp, para: self.para, **kw) は, 経験値の合計がmax_exp以下の範囲で,paraの値が最大となる [鍛冶・防具製作Lv, 道具製作Lv] を返す. これは,Recipe#search がpara値を指定して経験値を最小化するのとちょうど逆の問題を解いていることになる. 最内ループの問題を陽に解くことができることから,Recipe#search より速く, 低重量武器スプレッドシートのように,一定範囲の最適製作Lvを網羅する場合, Recipe#search を使って低Lvから順に列挙するより,Recipe#find_max を使って高Lvから順に列挙したほうが早い. スプレッドシート周りでも少し進展があり,重量5双短剣において, [[双短剣(鉄10金6)+短剣(金3皮1)]+短剣(鉄10皮1)]+短剣(鉄10皮1) [[双短剣(鉄10金6)+剣(金3水1)]+剣(鉄10水1)]+剣(鉄10水1) [[双短剣(鉄10金6)+剣(金3皮1)]+剣(鉄10皮1)]+剣(鉄10皮1) といった金短剣/剣レシピが見つかった.競合レシピは [[双短剣(鉄10金6)+弓(木2皮1)]+短剣(鉄10皮1)]+短剣(鉄10皮3) [[双短剣(鉄10金3)+弓(牙8皮1)]+短剣(鉄10皮1)]+短剣(鉄10皮1) [[双短剣(鉄10金6)+弓(木2皮1)]+剣(鉄10水1)]+短剣(鉄10金3) [[双短剣(鉄10金3)+弓(木8皮1)]+剣(鉄10皮1)]+剣(鉄10皮1) などであり,弓(木8皮1)の必要鍛冶Lvがやや高い36であること,弓(木2皮1)型の必要道具製作Lvが39で,その他が42であることなどが関連している. 双短剣(鉄10金3/6)を重量2で使うことが最適である製作Lv帯であることが条件の一つとなっており, 重量5双短剣という,ややニッチなケースでのみ有用となることから,発見が遅れることとなった. 2022/11/12 mgmg 1.7.0 ようやく重い腰を上げ,String/Enumerable#search/find_maxにおいて,フィボナッチ探索を利用したアルゴリズムに変更した. これにより,探索に時間のかかる,高製作Lv時の計算時間が大幅に短縮された. フィボナッチ探索は,黄金分割探索の離散版で,単峰関数の極値を効率的に探索するアルゴリズムである. ただ,search/find_maxに適用するには課題があり,これらのメソッドで探索する関数は,単峰ではないのである. 大局的には大きく1つの谷/山が形成されることを利用し,極値の一つをフィボナッチ探索で見つけ,その周辺を走査して最適化する. この「周辺の走査」をどの程度行う必要があるかは自明ではなく,comp_ext オプションで制御することにした. 特に証明等は行っていないが,調べた範囲で問題なさそうな値をデフォルト値とした. この範囲が不十分の場合,最適解を見逃すおそれがあるが,範囲が過大だとフィボナッチ探索を導入した意味がなくなる. このジレンマはなかなか難しくはあるが,従来のアルゴリズムでは膨大な時間がかかるケースがあることから,導入に踏み切った. また,自明な多峰性として,多くのレシピでは偶数の道具製作Lvしか探索する必要がないというものがある. これは,合成の計算式に含まれる, [(主装備種別の種別値 + 道具製作Lv)/2] の部分に由来する.ほとんどの装備とパラメータの種別値は偶数であるため,偶数の道具製作Lvのみに興味があることになる. 他方,短剣の攻撃力など,一部の種別値は奇数であり,レシピによっては奇数のみか,両方に興味がある場合がある. この区別には,レシピの構造の深くまで見る必要があり,レシピ文字列のパースに付随して調べる必要がある. これが面倒で腰が重かったが,まあ満足の行く形で実装することができた. また,新しく実装した Mgmg.#find_upperbound のアルゴリズムに大きな誤りがあったため,これを修正した. 数学的な証明を伴う形でアルゴリズムを構築していないため,まだ誤りが残っている可能性はある. その他,いくつか細かい修正も含まれる. 2022/11/17 新レシピ発見 威力追求構成例 https://docs.google.com/spreadsheets/d/1JTTl_ZBhW2vOwawBszV2_hCTeT7XdRMkmrjmaaNd-O8/edit#gid=799099541 において,洗練度の低かった物防の反転レシピを充実させていたところ,反転タネを 重鎧+[軽鎧(金3宝1)+[盾(金3宝1)+[重鎧(皮2宝1)+軽鎧(鉄10皮1)]]] とする構成が異様に強いことが判明した.この構造を有する重量9レシピが,防具製作Lv106~202の,主力レシピをことごとく上回った. 特に防具製作Lv106のレシピは真イールミールの攻撃に対応する際に有用となるレベル帯であり,従来のLv116レシピを駆逐した. 重鎧(皮2綿1)+[サンダル(骨1骨1)+[重鎧(綿1金3)+[サンダル(骨1骨1)+[重鎧(玉5玉5)+[軽鎧(金3宝1)+[盾(金3宝1)+[重鎧(皮2宝1)+軽鎧(鉄10皮1)]]]]]]]/防具製作Lv106レシピ これに基づき,再考レシピを更新している. 最終形は従来どおりの,重鎧をタネとする型であるが,最適性が移る物防が10倍程度となっており,Lv202の新レシピの強さがうかがえる. 重鎧(金3綿1)+[フード(骨2宝1)+[重鎧(金3金3)+[フード(骨2宝1)+[重鎧(金3金3)+[軽鎧(金3宝1)+[盾(金3宝1)+[軽鎧(皮2宝1)+重鎧(鉄10皮1)]]]]]]]/最終形 重鎧(金3綿1)+[フード(骨2宝1)+[重鎧(金3金3)+[フード(骨2宝1)+[重鎧(金3金3)+[軽鎧(金3宝1)+[盾(金3宝1)+[重鎧(皮2宝1)+軽鎧(鉄10皮1)]]]]]]]/新防具製作Lv202レシピ 最初の反転合成である防具製作Lv86も新レシピであるが,構造の異なる反転タネを利用している. 重鎧(皮2綿1)+[帽子(宝1宝1)+[重鎧(綿1金3)+[帽子(宝1宝1)+[重鎧(綿10金3)+[軽鎧(金3骨1)+[重鎧(皮2骨1)+[軽鎧(皮2骨1)+盾(鉄10綿1)]]]]]]]/新防具製作Lv86レシピ また,この構造は攻撃力のI4型の反転タネにも利用できる形であり,単純に種別と材質を置き換えた 斧+[剣(金3牙1)+[双短剣(金3牙1)+[斧(木2綿1)+剣(鉄10皮1)]]] の構造となる. これも非常に強力で,双短剣では鍛冶Lv68~Lv202,斧では鍛冶Lv94~Lv202で新レシピに置き換わった. 双短剣(金3皮1)+[杖(水1綿1)+[斧(玉5水1)+[杖(綿1綿1)+[斧(玉5綿1)+[剣(金3牙1)+[双短剣(金3牙1)+[斧(木2綿1)+剣(鉄10皮1)]]]]]]]/新鍛冶Lv68レシピ 双短剣(金3皮1)+[杖(鉄2綿1)+[斧(玉5鉄1)+[杖(綿1綿1)+[斧(玉5金3)+[剣(金3牙1)+[斧(木2牙1)+[剣(木2牙1)+双短剣(鉄10木1)]]]]]]]/新鍛冶Lv116レシピ 双短剣(金3皮1)+[杖(水1綿1)+[斧(金3水1)+[杖(綿1綿1)+[斧(玉5金3)+[剣(金3牙1)+[双短剣(金3牙1)+[斧(木2牙1)+剣(鉄10木1)]]]]]]]/新鍛冶Lv152レシピ 双短剣(金3皮1)+[杖(鉄2綿1)+[斧(金3金3)+[杖(綿1綿1)+[斧(金3金3)+[剣(金3牙1)+[双短剣(金3牙1)+[斧(木2牙1)+剣(鉄10木1)]]]]]]]/新鍛冶Lv202レシピ 斧(火玉5綿1)+[杖(鉄2綿1)+[斧(木1金3)+[杖(綿1綿1)+[斧(玉5綿1)+[剣(金3牙1)+[双短剣(金3牙1)+[斧(木2牙1)+剣(鉄10木1)]]]]]]]/新鍛冶Lv94レシピ 斧(木2皮1)+[杖(鉄2綿1)+[斧(木1金3)+[杖(綿1綿1)+[斧(玉5玉5)+[剣(金3牙1)+[双短剣(金3牙1)+[斧(木2牙1)+剣(鉄10木1)]]]]]]]/新鍛冶Lv106レシピ 斧(金3水1)+[杖(水1綿1)+[斧(金3水1)+[杖(綿1綿1)+[斧(玉5金3)+[剣(金3牙1)+[双短剣(金3牙1)+[斧(木2牙1)+剣(鉄10木1)]]]]]]]/新鍛冶Lv152レシピ 斧(金3皮1)+[杖(鉄2綿1)+[斧(金3金3)+[杖(綿1綿1)+[斧(金3金3)+[剣(金3牙1)+[双短剣(金3牙1)+[斧(木2牙1)+剣(鉄10木1)]]]]]]]/新鍛冶Lv202レシピ ただし,斧では重量と☆の関係で,この構造をとらないほうが強いケースもあり,鍛冶Lv66,116のレシピは従来どおりのものである. 斧(火玉5綿1)+[杖(水1綿1)+[斧(玉5水1)+[杖(綿1綿1)+[斧(玉5綿1)+[剣(金3牙1)+[斧(木2牙1)+[剣(木2牙1)+双短剣(鉄10皮1)]]]]]]]/旧鍛冶Lv66レシピ 斧(木2皮1)+[杖(鉄2綿1)+[斧(玉5金3)+[杖(綿1綿1)+[斧(玉5金3)+[剣(金3牙1)+[斧(木2牙1)+[剣(木2牙1)+双短剣(鉄10木1)]]]]]]]/旧鍛冶Lv116レシピ 最終形も同じく,従来どおりの 双短剣/斧(金3皮1)+[杖(鉄2綿1)+[斧(金3金3)+[杖(綿1綿1)+[斧(金3金3)+[剣(金3牙1)+[双短剣(金3牙1)+[剣(木2牙1)+双短剣(鉄10木1)]]]]]]]/最終形 のレシピが強いままであるが,新鍛冶Lv202レシピを上回る目標威力が1000万を超えるようになり,主力レシピはほぼすべて置き換わったと言えるだろう. この構造がこれまで未発見だったのには理由がいくつか考えられる. まず,最終形には影響しないものであるため,近似多項式を利用した探索で引っかからなかったことが挙げられる. 最終形については,近似多項式を利用した機械的探索を行っているため,ミスがなければ, これ以上新しいものは出て来ない可能性が高い一方,主力レシピの探索は十分ではなかった. 次に,「盾+重鎧」,「双短剣+斧」の形を有するレシピが有力視されて来なかったことが挙げられる. 種別値差のマイナスが大きくなるこのような組み合わせは,この合成段階では効率が悪い. 上述の近似多項式ベースの探索の結果,剣+斧/軽鎧+重鎧の構造さえ避けるべし,という認識があったのもそれに拍車をかけていた. しかし,実際には以下のような利点があった. まず,反転タネベースに向かって 斧+[剣+[双短剣+X]] の構造を取れるため,重要度の高い,後段の効率が高い. タネを重鎧/斧とする場合や,中間材に 重鎧(金3骨1)/斧(金3綿1) を使う場合の要求鍛冶/防具製作Lvが高いことと合わせ, 斧(木2牙1)+[剣(金3牙1)+双短剣(鉄10木1)]]] の形を取らずに済み,反転タネ全体の☆効率が高いことも要因である. これら,☆配分と鍛冶/防具製作Lv,反転タネベースサイドの種別配置,タネサイドの性能のバランスがよい,この構造が強かったのである. なお,この構造は攻撃力または物防のI4型レシピ特有のものである.第3の種別のない魔力や,第2,第3の種別値差がなく,重量の軽い魔防では有用ではない. I3型やi5型など,反転タネの段数の異なる型では,この構造の出る幕がない. その意味では,重量8のi4型攻撃弓などではこの構造を利用できるが,もともとニッチすぎて探索してこなかった.