タグ

algorithmに関するsugyanのブックマーク (75)

  • 世界四連覇AIエンジニアがゼロから教えるゲーム木探索入門 - Qiita

    Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? はじめに 書籍化 記事を元に ゲームで学ぶ探索アルゴリズム実践入門~木探索とメタヒューリスティクス という書籍を出版することになりました! 記事を読んで気になっていただけたらご購入をご検討いただけるとうれしいです! この記事で得られる技術 ゲームルールに適した探索アルゴリズムを選択する ゲーム木探索をするのに適したクラス設計 主要なゲーム木探索アルゴリズムの実装 この記事の特徴 汎用アルゴリズムの実装例による他ゲームへの応用力と、実際に動作可能なサンプルコードによる具体的実装イメージの両視点でわかりやすくした(片方しか記載のない記事

    世界四連覇AIエンジニアがゼロから教えるゲーム木探索入門 - Qiita
  • 高速な詰将棋ソルバー『KomoringHeights』v0.4.0を公開した

    この表より、探索速度が大幅に向上していることがわかる。v0.2.1と比較して、v0.4.0での解答速度は1.3倍~8.9倍になっている。 このように、v0.4.0では探索性能が大幅に改善されている。以下ではその中から主要な3項目について説明する。 df-pn+ #探索速度の根的な改善のために、df-pn+アルゴリズム1を導入した。df-pn+アルゴリズムは、初めて訪れた局面の(pn, dn)を一様に(1, 1)で初期化するのではなく、局面の詰みやすさに応じて値を増減させるアルゴリズムである。展開前の局面に対して値に差をつけることにより、より詰みに近い局面を優先して子局面の展開を行うことができる。素朴な発想のヒューリスティックではあるが、局面の詰みやすさをうまく評価できれば探索性能が大きく向上することが知られている。KomoringHeightsのdf-pn+評価関数の設計は、GPS将棋2

    高速な詰将棋ソルバー『KomoringHeights』v0.4.0を公開した
  • 6x6リバーシの神 - まめめも

    絶対に勝てない6x6リバーシを作りました。あなたは黒番、AIが白番です。 絶対に勝てない6x6リバーシを作りました! ぜひ挑戦してみてくださいhttps://t.co/Ul5n3q9jMp— Yusuke Endoh (@mametter) December 30, 2021 これは何? 6x6の盤面のリバーシは後手必勝 *1 であることが知られています。 このAIは白番(後手)で完璧にプレイします。つまり黒番のあなたは絶対に勝てません。無力感を楽しんでください。 技術的な話 このAIWebAssemblyになっているので、全部あなたのブラウザの上で動いてます。真のサーバーレスです。 AIのソースコードはRustで書きました。わりと堅実なゲーム木探索になってます。UIは普通にTypeScriptとthree.jsで実装しました。 github.com 作った順に説明します。 盤面の表現

    6x6リバーシの神 - まめめも
  • Rustでネコチャンを点描する

    この記事はLivesense Advent Calendar 2021の15日目の記事です。 先日こんなツイートを見かけました。 ネコチャン! カワイイ! いやぁ、可愛いですね。これを見たとき、ぜひ自分でも実装してみたいと思いました。なんといってもネコチャンの柔らかい輪郭とゆるゆる動く点描の相性がとても良いので。 それで、この論文を見つけたわけですがこちらを見る限り、鍵となるアイデア自体はそこまで複雑なものではないようで、これならできるかも? とか思っていたわけです。 もともとのアルゴリズムはこちらのリファレンス実装にある通り、GPUを利用して計算されるもので、ちょっと大変なのですが、今回はGPUを使わずにエッセンスを再現してみようと思います。そのために動画の処理は諦め、静止画の変換処理を近似的に再現します。 (一応付言しておくと、上述の論文をヒントに似ているけれど全然別のアルゴリズムを実

    Rustでネコチャンを点描する
  • Rustでつくる詰将棋Solver - すぎゃーんメモ

    ついカッとなって先週からRustで詰将棋ソルバを書き始めてしまい、ようやくdf-pnで何らかの解答を出せるようになったところ。ここからもうちょっと調整していくぞ、、 pic.twitter.com/XM9iPJqocv— すぎゃーん💯 (@sugyan) November 2, 2021 というわけで突然Rustで詰将棋ソルバを作りたくなり、作った。 github.com 現時点ではまだ完成度は低くて6割ほどかな…。 とはいえそこらの素直な詰将棋問題なら普通に解けると思う。 冒頭の画像は看寿賞作品の3手詰「新たなる殺意」を2秒弱で解いたもの。 先行事例 将棋プログラムの多くはC++で書かれていて 最近はRustも増えてきているのかな? しかし「詰将棋を解く」ことに特化しているものはあまり多くはなさそうだった。 なかでもRustで書かれているものはna2hiroさんによるものくらいしか無さ

    Rustでつくる詰将棋Solver - すぎゃーんメモ
  • 詰将棋に対するdf-pnアルゴリズムの解説 | コウモリのちょーおんぱ

    長手数の詰将棋の探索に用いられるdf-pnアルゴリズムについて、その概要と実用上の課題を解説する。 概要 #詰め将棋において、各局面の平均着手可能数は5.8手程度と言われている1。単純にこれを全探索することを考えると、\(n\) 手詰を解くためには \(5.8^n\) 局面を調べることになる。例えば、現時点で最長の詰将棋であるミクロコスモス(1525手詰)を解くためにはざっくり \(10^{1164}\) 局面を調べることになってしまう。このように、愚直な全探索では長手数の詰将棋を現実的な時間内で解くことはできないことが分かる。 しかし、ある局面が詰むことを示すだけならここまで膨大な探索は必要ない。例えば以下の局面を考える。 この局面の合法手は63金打、53金打など全部で9通りあるが、この局面が詰みであることを示すためには次の手順だけ探索できていればよい。 この探索結果より、玉方がどのよう

    詰将棋に対するdf-pnアルゴリズムの解説 | コウモリのちょーおんぱ
  • 「998244353 で割ったあまり」の求め方を総特集! 〜 逆元から離散対数まで 〜 - Qiita

    1. なぜ 998244353 で割るのか? 最初はこのような設問を見るとぎょっとしてしまいますが、実はとても自然な問題設定です。 $998244353$ で割らないと、答えの桁数がとてつもなく大きくなってしまうことがあります。このとき以下のような問題が生じます: 多倍長整数がサポートされている言語とされていない言語とで有利不利が生じる 10000 桁にも及ぶような巨大な整数を扱うとなると計算時間が膨大にかかってしまう 1 番目の事情はプログラミングコンテストに特有のものと思えなくもないですが、2 番目の事情は切実です。整数の足し算や掛け算などを実施するとき、桁数があまりにも大きくなると桁数に応じた計算時間がかかってしまいます。実用的にもそのような巨大な整数を扱うときは、いくつかの素数で割ったあまりを計算しておいて、最後に中国剰余定理を適用して復元することも多いです。 なぜ 9982443

    「998244353 で割ったあまり」の求め方を総特集! 〜 逆元から離散対数まで 〜 - Qiita
  • How We Made Bracket Pair Colorization 10,000x Faster In Visual Studio Code

    Version 1.93 is now available! Read about the new features and fixes from August. Bracket pair colorization 10,000x faster September 29, 2021 by Henning Dieterichs, @hediet_dev When dealing with deeply nested brackets in Visual Studio Code, it can be hard to figure out which brackets match and which do not. To make this easier, in 2016, a user named CoenraadS developed the awesome Bracket Pair Col

    How We Made Bracket Pair Colorization 10,000x Faster In Visual Studio Code
  • 『フカシギの数え方』 おねえさんといっしょ! みんなで数えてみよう! - YouTube

    「フカシギの数え方」おねえさんといっしょ!みんなで数えてみよう! ※LINEスタンプ「フカシギお姉さんと仲間たち」をリリースしました。※ "The Art of 10^64 -Understanding Vastness-" Time with class! Let's count! LINE sticker "Combinatorial Explosion!" has been launched! http://line.me/S/sticker/1143771 「フカシギの数え方」で紹介している、組み合わせ爆発の例です。 「それでもね。私はみんなに「組み合わせ爆発のすごさ」を教えたいの!止めないで!」 お姉さんと子どもたちが実際に数え上げる大変さを伝えます。 This is an example about combinatorial explosion. "I want to de

    『フカシギの数え方』 おねえさんといっしょ! みんなで数えてみよう! - YouTube
  • 複数のビットフィールドを持つ数値の並列演算

    並列化といえばHadoopだSparkだMPIだといったキーワードが世の中を賑わせているが、古典的な話としてゲームなどのグラフィクス処理界隈ではMMX命令などのSIMDを使う事なくデータ並列性を引き出すことによって高速化していた。 このテクの一部を扱った傑作記事が気づいたら検索で辿れなくなっていてWebArchive入りしてしまっていたので一つの機会として解説記事を書くことにした。 古株のエンジニアからすれば見慣れたテクニックではあるが知らない人から見るとパズルのような面白みがあり応用の幅もある面白いテクニックである。 複数のビットフィールドとは スーパーファミコンのように表示可能色が32,768色に制限されている環境というのは、内部的には1色を15bit(2^15=32,768)を使って表現している事が多い。当然この色数で自然界のあらゆる物を自然に描写するのは難しいが、ゲーム用途などでは

    複数のビットフィールドを持つ数値の並列演算
  • 二項係数 mod 素数を高速に計算する方法 [累積和, フェルマーの小定理, 繰り返し二乗法, コンビネーション, 10^9+7] - はまやんはまやんはまやん

    要望 nCk mod 10^9+7を高速に計算したい n,k≦10^5 追記:llはlong longのことです 使ってるテンプレートはこんな感じです。 #include<bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<b;i++) using namespace std; typedef long long ll; 高校で習うやり方でやると… ll mod = 1000000007; //--------------------------------------------------------------------------------------------------- ll C(int n, int k) { ll res = 1; rep(i, 0, k) res = (res * (n - i)) % mod; rep(

    二項係数 mod 素数を高速に計算する方法 [累積和, フェルマーの小定理, 繰り返し二乗法, コンビネーション, 10^9+7] - はまやんはまやんはまやん
  • AtCoder Heuristic Contest 001 (AHC001) 初心者向け解説 - TERRYのブログ

    AtCoder Heuristic Contest 001 (AHC001) の参加記を書くはずだったのですが、記念すべき第1回ということで「マラソンに初めて参加したけど、感想戦TLで周りが何を言っているか分からない……。」という方が多そうな気がして、気付いたら初心者向け解説記事*1を書き始めてしまっていました。 ふぁぼ圧、強すぎませんか https://t.co/DuGViXzI80— TERRY (@terry_u16) 2021年3月15日 参加記はまた後日書きます。→書きました。 www.terry-u16.net 問題概要 はじめに 正の得点を得る(823,090点) 山登り法を導入してみる(452億点) ちょっと改善してみる(469億点) 焼きなまし法を導入してみる(477億点) さらなる改善 Tips 手元でテストケースを回す コンテスト序盤は特に丁寧にコードを書く 愚直判定

    AtCoder Heuristic Contest 001 (AHC001) 初心者向け解説 - TERRYのブログ
  • The Eisel-Lemire ParseNumberF64 Algorithm

    The Eisel-Lemire ParseNumberF64 Algorithm Summary: ParseNumberF64, StringToDouble and similarly named functions take a string like "12.5" (one two dot five) and return a 64-bit double-precision floating point number like 12.5 (twelve point five). Some numbers (like 12.3) aren’t exactly representable as an f64 but ParseNumberF64 still has to return the best approximation. In March 2020, Daniel Lemi

  • 高速逆平方根(fast inverse square root)のアルゴリズム解説 - 滴了庵日録

    高速逆平方根とは? C言語のコード 検証 アルゴリズムの要点 [1] 逆平方根の計算を対数・指数の計算に置き換える [2] 浮動小数点型の内部表現を利用した対数・指数の近似計算 [2.1] 対数の近似 [2.2] σの最適値 [2.3] 整数型での解釈 [2.4] 逆平方根の計算とマジックナンバー0x5F3759DF [3] ニュートン法による収束で精度アップ 感想 高速逆平方根とは? 高速逆平方根(fast inverse square root)とは、平方根の逆数 を高速に計算するアルゴリズムです。平方根の逆数は逆平方根とも呼ばれます。逆平方根はベクトルの正規化などに用いられるので、これを高速に計算できるアルゴリズムには大きなご利益があります。 参照: Fast inverse square root - Wikipedia C言語のコード 高速逆平方根の関数を示します。0x5F375

    高速逆平方根(fast inverse square root)のアルゴリズム解説 - 滴了庵日録
  • N番目の素数を求める - すぎゃーんメモ

    SNSなどで話題になっていたので調べてみたら勉強になったのでメモ。 環境 Pythonでの実装例 例1 例2 例3 エラトステネスの篩 Rustでの実装例 試し割り法 エラトステネスの篩 アトキンの篩 おまけ: GMP Benchmark 高速化のテクニック 上限個数を見積もる Wheel factorization オチ Repository References 環境 手元のMacBook Pro 13-inchの開発機で実験した。 2.8 GHz Intel Core i7 16 GB 2133 MHz LPDDR3 Pythonでの実装例 例1 最も単純に「2以上p未満のすべての数で割ってみて余りが0にならなかったら素数」とする、brute force 的なアプローチ。 import cProfile import io import pstats import sys def m

    N番目の素数を求める - すぎゃーんメモ
    sugyan
    sugyan 2021/02/06
    書いた
  • 素数列挙について - MugiCha

    Competitive Programming Advent Calendar 3日目は、数学っぽい話をしたいと思います。 N以下の素数をすべて求めよ。 N以下の素数の個数を求めよ。 A以上B以下の素数の個数を求めよ。 こんな感じの問題を見たことがあると思います。また問題としてでなくても、解く過程にこのようなサブ問題を解かなければいけない場合もよくあると思います。素数については説明しなくてもいいですよね? このような問題を素数列挙と呼ぶことにします。素数列挙ができれば、大きい数の素数判定や素因数分解をめっちゃ高速化したり、トーティエント関数、メビウス関数等、数学系のいろんな関数を求めたりできます。最近のもので素数列挙がほぼ必須のものだと Codeforces Beta Round #86 (Div. 1 Only) C. Double Happiness ICPC 国内予選 2011 A

    素数列挙について - MugiCha
  • Bit Twiddling Hacks

    By Sean Eron Anderson seander@cs.stanford.edu Individually, the code snippets here are in the public domain (unless otherwise noted) — feel free to use them however you please. The aggregate collection and descriptions are © 1997-2005 Sean Eron Anderson. The code and descriptions are distributed in the hope that they will be useful, but WITHOUT ANY WARRANTY and without even the implied warranty of

  • AWS認定試験の受験失敗とAWSしりとり - 見返すかもしれないメモ

    記事は、はてなエンジニア Advent Calendar 2020 の17日目の記事です。昨日は id:papix さんでした。 papix.hatenablog.com AWSの資格試験を受けようとして失敗した話と、その副産物であるAWSしりとりについて書きます。 AWS認定資格試験の、Solutions Architect Associateを受験しようとしていました。受験には試験会場まで行く方法と自宅でオンラインで受ける方法があり、出かけるのが面倒だった私はピアソンVUEのオンライン受験を予約しました。 PCの要件は満たしていてシステムチェックも通ったけど、実際受けたら失敗したので、その体験談です。 1回目 監督者の方とチャットが繋がり、「それでは試験を送ります」と連絡をもらったところまでは順調でした。 試験案内のページに移り、チャットで「ページは切り替わりましたか?」と確認されま

    AWS認定試験の受験失敗とAWSしりとり - 見返すかもしれないメモ
  • 桃太郎電鉄の「いけるかな」を実現する高速なアルゴリズムの実装と考察 - Qiita

    この記事は「データ構造とアルゴリズム Advent Calendar 2020」16日目の記事です。 15日目の記事はyurahunaさんの「木分解上の動的計画法」で、 17日目の記事はtsukasa__diaryさんの「Lawler の K-Best 列挙アルゴリズム」です。 この記事内で使用しているプログラムやそのテストプログラムは全て以下のGitHubリポジトリで閲覧可能です。プログラムの詳細に興味がある方はこちらをご覧ください(ついでにStarを押していってくれると喜びます🙂)。 Github: ashiba/Imprementation_of_IKERUKANA: Momotaro Dentetsu is a game. 変更履歴 2020/12/21に「最終的に貧乏神が付かない移動方法 ~貧乏神持ちの場合~」, 「最終的に貧乏神が付かない移動方法 ~貧乏神がついていない場合~

    桃太郎電鉄の「いけるかな」を実現する高速なアルゴリズムの実装と考察 - Qiita
  • 競技プログラミングで解法を思いつくための典型的な考え方 | アルゴリズムロジック

    競技プログラミングの問題を解くためには2つのステップがあります。 問題で要求されていることを言い換える知っているアルゴリズムやデータ構造を組み合わせて解く 必要な(知っておくべき)アルゴリズムやデータ構造は色々なところで学ぶことができます。 しかし、「問題の言い換え」や「アルゴリズムを思いつく」というのは、非常に様々なバリエーションがあり、問題をたくさん解かないとなかなか身につきません。 そこで、この記事は以下のことを言語化し、練習のための例題を提示することを目標とします。 問われていることを、計算しやすい同値なことに置き換える方法アルゴリズムを思いつくための考え方競技プログラミングで「典型的」と思われる考え方 ※一部問題のネタバレを含むので注意 ※良く用いられるアルゴリズムやデータ構造については競技プログラミングでの典型アルゴリズムとデータ構造 を参考にして下さい。 入力の大きさ(制約)

    競技プログラミングで解法を思いつくための典型的な考え方 | アルゴリズムロジック