ビットコインの始め方

アルファ値の定義

アルファ値の定義

一次関数は幅広く応用問題があります。「長方形の辺上を点pが動く」なんていう問題だったり、列車の運行状況をダイヤグラムで表してあったり、水槽に水を入れたり抜いたり、
グラフで囲まれた図形の面積云々・・・電気料金などなどいろいろな形で問題が出されます。

Algorithms with Python

今回は、囲碁や将棋のように 2 人が交互に 1 手ずつ指していくゲームを取り上げます。コンピュータにゲームの相手をさせる場合、コンピュータの指し手を決定するためのプログラム、いわゆる「思考ルーチン」が必要になります。この思考ルーチンで使われる基本的なアルゴリズムが「ミニマックス法 (mini-max method) 」と「アルファベータ法 (αβ method) 」です。難しそうな名前がついていますが、ミニマックス法の基本は深さ優先探索ですし、アルファベータ法はミニマックス法を効率化するための枝刈りにすぎません。拙作のページ お気楽 Python プログラミング入門第 3 回 や 集合、グラフ、経路の探索 で説明した基本的な探索アルゴリズムを理解していれば、それほど難しい話ではないのです。

そうはいっても、実際のゲームで強い思考ルーチンを作成するのは簡単な話ではありません。チェスや将棋などに比べると、リバーシの思考ルーチンは簡単だといわれています。ところが、実際にプログラムしてみると、強い思考ルーチンを作るのは本当に難しい、というのが M.Hiroi の実感です。それでも、リバーシは終盤になると最後まで読み切ることができるので、初心者や初級者レベルよりも強いプログラムを作るのは比較的簡単なほうでしょう。

今回は「カラー (kalah) 」という簡単なゲームを題材に、ミニマックス法とアルファベータ法を説明します。まずは、思考ゲームの基本から説明しましょう。

●ゲームの木

二人で対戦するゲームの場合、ゲームの進行状況は盤面の状態で表すことができます。指し手が進むにつれて盤面の状態は変化し、最後にはゲームが終了します。このようなゲームでは、その状態の変化を木構造に対応させることができます。これを「ゲームの木 (game tree) 」といいます。

たとえば、「エイト」というゲームを考えてみます。このゲームのルールは、2 人のプレーヤーが 1 から 3 までの数字を交互に選び、2 人が選んだ数の合計が 8 になったら勝ち、8 を越えたら負けになります。数字の選び方には条件があって、一番最初は好きな数字を選ぶことができますが、それ以降は前回相手が選んだ数を選ぶことはできません。このゲームの木は、手作業でも簡単に作成することができます。下図にゲームの木の一部を示します。

先手は最初に 1 から 3 の中の好きな数字を選ぶことができます。この木は、最初に先手が 2 を選び、次に後手が 1 を選んだ状態のゲームの木を示しています。数字の合計が 8 以上になったらゲームは終了です。木の高さはたかだか アルファ値の定義 アルファ値の定義 6 レベルしかないので、エイトはとても簡単なゲームであることがわかります。

そこで、不完全ですが数レベル分の木を作成します。つまり、数手先読みするわけです。先読みした局面の状態は、ほとんどが勝ちでも負けでもない曖昧なものです。ここで、その局面の状態を評価して、自分が有利であれば 50 点とか不利であれば -10 点という具合に、局面の状態を数値化します。この処理を行う関数を「評価関数」といいます。とりあえず勝ち負けはわかりませんが、この評価値が高くなるように、つまり自分が有利になるように指し手を進めていくわけです。

ひらたくいえば、相手の手を先読みして自分の手を決めるということです。たとえば将棋の場合でも、駒の動かし方がわかる程度の初心者では相手の手を読むことは難しいですが、慣れてくると 2 手 3 手程度の先読みはできるようになります。これがプロ棋士になると、十数手から二十手前後まで考えるというのですから驚きです。

●ミニマックス法

それでは、具体的にミニマックス法を説明しましょう。ここでは、簡単な仮想ゲームを考えてみます。このゲームは、先手後手とも指し手は常に 2 通りあって、そのうちの一つを選ぶことでゲームが進行します。

ミニマックス法を使う場合、局面の評価値が必要になります。評価関数は、先手が有利(後手が不利)な局面ほど大きな値(正の値)、逆に後手が有利(先手が不利)なほど小さな値(負の値)、互角の場合は 0 になるように作るのが一般的です。

探索のレベルは、先手-後手-先手の 3 手先まで読むことにします。先手の局面 R を探索すると、下図に示すゲームの木になりました。

評価値は最も深いレベル、この場合は 3 手指した後手の局面で計算します。3 レベルまで探索すると 8 通りの評価値が計算されますが、この評価値を使って、A と B のどちらの手を指すかミニマックス法で決定します。

R - A - C の局面に注目してください。この局面では、先手は 2 通りの指し手があり、それぞれ G と H という局面になります。この局面の評価値を計算すると、それぞれ 1 と 3 になります。ここでは先手の手番ですから、評価値が最大になるような指し手を選択します。したがって、局面 C の評価値は 3 に定まります。

同様に R - A - D の局面を計算すると、局面 D の評価値は 4 になります。局面 C と D の評価値が決まったので、局面 A の評価値を決めることができます。局面 A は後手の手番ですから、今度は評価値が最小になるような指し手を選びます。局面 C と D の小さい方を選ぶので、局面 A の評価値は 3 になります。

同様に局面 B の評価値を求めると 2 になります。局面 R は先手の手番なので、評価値の大きい指し手を選びます。この場合は、A が有利であることがわかります。このように、先手番では評価値が最大値となる指し手を選び、後手番では評価値が最小値となる指し手を選ぶことで、指し手を決定する方法がミニマックス法なのです。

ただし、ミニマックス法で選んだ指し手が最善手である保証はありません。この例では、ゲームの木を 3 レベル探索して A を選びましたが、もう一段深く探索してみると B の方が有利だった、ということもありえます。ようするに、3 手先までは読んでいたが、その先の手は読んでいなかった、ということです。これは私達がゲームをプレイする場合でもあることですね。

●アルファベータ法

次はアルファベータ法を説明します。ミニマックス法の説明では、木を全て探索するので 8 回評価値を計算しましたが、アルファベータ法を使うと木を枝刈りすることができます。次の図を見てください。

アルファベータ法を使うと、×で示した箇所で枝刈りが行われます。評価値の計算が 5 回で済んでいますね。もちろん、結果(選択した指し手)はミニマックス法と同じです。それでは、なぜ枝刈りが可能なのか説明しましょう。

基本はミニマックス法と同じです。今、C の評価値 3 が決定し、D の評価値を決めるため I の評価値を計算します。その結果、評価値は 4 になりました。この時点で、J の評価値は計算しなくてもいいのです。次の図を見てください。

今、後手が指し手を選ぶところなので、小さな評価値の方を選びます。C の評価値は 3 なので、ここで選択される指し手の評価値は 3 より大きくならないことがわかります。なぜなら、局面 D の評価値が 3 より大きいのであれば、C が選択されることになるからです。

ところが、D の評価値は I の評価値が 4 になった時点で、この値よりも小さな値にはなりません。というのは、I と J アルファ値の定義 を選ぶのは先手なので、大きな評価値の指し手を選ぶからです。したがって、J が 3 より小さな値になったとしても、 D の評価値は 4 になります。また、J の評価値が I より大きくなったとしても、C の評価値 3 より大きな値になるので、けっきょく C が選択されることになります。指し手を決めるために、J の評価値を調べる必要はないのです。

このように、J の枝を枝刈りすることができます。このようなタイプの枝刈りをベータカット (β cut) といい、そのとき基準になる値をベータ値といいます。

これで、局面 A の評価値は 3 に決まりました。次に、B の評価値を求めます。ここでも局面 A の評価値を基準にした枝刈りが可能です。次の図を見てください。

今、先手が指し手を選ぶところなので、大きな評価値の方を選びます。A の評価値は 3 なので、B が選ばれるには 3 より大きい値でなければいけません。まず最初に E の評価値を求めます。これは、K と L の評価値を求めて大きい方を選びます。ここで、E の評価値が 2 に決まると、F の評価値を求める必要はなくなります。

E と F は後手が指し手を選ぶところなので、評価値の小さな指し手を選びます。そして、それが局面 B の評価値になります。したがって、局面 B の評価値は 2 より小さな値にしかなりません。ところが、A と B は先手が指し手を選択するので、大きな評価値の指し手を選びます。A の評価値は 3 で、B の評価値は 2 以下の値にしかならないので、F の評価値を調べなくても A アルファ値の定義 を選ぶことができるのです。

このように、F の枝を枝刈りすることができます。このようなタイプの枝刈りをアルファカット (α cut) といい、そのとき基準になる値をアルファ値といいます。

●ゲーム「カラー」の説明

それでは、例題として取り上げるゲーム「カラー (Kalah) 」を説明します。このゲームはルールこそ単純ですが、展開がスリリングで面白いゲームです。

上図に示すように、カラーの盤面は 6 個の穴が向かい合って並んでいます。左右にはカラー (kalah) と呼ばれる穴があり、右隣が自分のカラーです。初期状態では、各穴に 6 個ずつ石が入っていて 2 つのカラーは空の状態です。ゲームの目的は、自分のカラーに過半数以上の石を集めることです。

  1. 自分のカラーに入ったならば、続けて自分の石を配ることができる。
  2. 最後の石が自分の空の穴に入り、向かいの穴に相手の石がある場合は、両方の石を自分のカラーに入れることができる。このあと、手番は相手に移る。

このドキュメントでは 2 番目のケースを「両取り」と呼ぶことにしましょう。これ以外の場合は、自分の番は終わり相手の番になります。それから、もう一つスペシャルケースがあり、自分の穴に石が無くなった場合は、相手の穴に残った石を全て相手のカラーに入れてゲームを終了します。

カラーは最大でも 6 通りの指し手しかないので、ゲームの木が簡単で扱いやすいこと、それから単純な評価関数でも探索レベルを増やすと相当に強くなること、などの理由からミニマックス法の枠組みによく当てはまります。例題にはちょうどよい思考ゲームなのです。

●プログラムの作成

クラス名は Board としました。盤面の実体は配列 (Python のリスト) で、インスタンス変数 board に格納します。穴との対応はルールの説明でも示したように、先手側の穴は左側から 0 - 5 でカラーの位置は FIRST_KALAH (6) になります。後手側の穴は反時計回りに 7 - 12 で、カラーの位置は SECOND_KALAH (13) になります。このように定義すると、穴に石を配るときには添字をひとつずつ増やしていけばいいので処理が簡単になります。FIRST_KALAH と SECOND_KALAH は手番を表すのにも使います。

メソッド __getitem__ は角カッコ [ ] で盤面の要素にアクセスするために定義します。メソッド copy は Board のオブジェクトをコピーするために使用します。

●Board のメソッド

次は盤面を操作するメソッドを定義します。最初に、石を配るメソッド distribute を作ります。

この処理は簡単です。引数 turn は手番を、pos は石を取り出す穴の位置を表します。まず、pos 番目の穴にある石の数を変数 num にセットし、その穴を 0 にクリアします。あとは while ループで石を一つずつ配っていきます。pos が盤面の範囲を越えたら 0 に戻します。このとき、pos が相手のカラーでないことを確かめて、穴にある石の数を一つ増やしていきます。最後に配り終わった位置 pos を返します。

次は両取りのチェックを行う check_capture を作ります。

check_capture は両取りの条件をそのままコーディングしただけです。引数 turn は手番を、pos はチェックする穴の位置を表します。まず pos の条件をチェックします。turn が FIRST_KALAH であれば pos は 0 - 5 の範囲で、SECOND_KALAH であれば 7 - 12 の範囲であることを確認します。次に、pos の穴に石が一つあり、向かいの穴に石があることを確認します。向かいの穴の位置は 12 - pos で計算できます。

条件を満たしているのであれば、両取りする石の数を num にセットしてカラーに追加します。pos と向かいの穴は 0 にクリアして True を返します。両取りできない場合は False を返します。

次は、終了をチェックするメソッド check_gameover を作ります。

count_stone は turn 側の穴の石を数えるメソッドです。先手側の穴に石がなければ後手側にある石を全てカラーに入れます。逆に、後手側の石が無くなれば、先手側の石を全てカラーに入れます。put_stone_into_kalah は指定されたサイドの石を全てカラーに入れるメソッドです。それから、どちらかのカラーが過半数 EVEN (36)より多くの石が入っているならばゲーム終了です。ゲーム終了の場合は True を返し、そうでなければ False を返します。

これらのメソッドを使って、石を動かすメソッド move_stone を作ります。

引数 turn は手番を、pos は石を動かす穴の位置を表します。最初に、distribute アルファ値の定義 で石を配る処理を行い、最後の石が入った穴の位置を pos にセットします。次に、check_capture を呼び出して両取りのチェックを行います。それから、ゲーム終了を判定する check_finish を呼び出します。

ゲーム終了の場合は GAMEOVER を返します。そうでなければ、最後の石がカラーに入ったかチェックします。turn はカラーの位置で表されているので、turn と pos が等しいのであれば、最後の石がカラーに入ったことがわかります。この場合は KALAH を返します。それ以外であれば NORMAL を返します。

●ゲーム木の探索

それでは、ゲームの中心となるゲーム木の探索処理を作成します。カラーの場合、最後の石がカラーに入った場合の処理が少々厄介です。指し手は 1 手とは限らず、複数になる場合もあるからです。

この処理を繰り返しで実現しようとすると面倒なことになってしまいますが、再帰を使うとあっさりと実現できます。探索レベルと手番を変えずに、そのまま再帰するだけでいいのです。したがってゲーム木を作成する場合、交互に手番が移るときはゲーム木の高さと探索レベルは一致しますが、この処理が含まれるとゲームの木はいっきに高さを増すことになります。探索レベルが 2 の場合でも、お互いに最後の石がカラーに入る局面では、木の高さは 10 を越えることもあるでしょう。

あとは、石をカラーに入れたときの指し手を集めておけばいいわけです。指し手は配列に格納して返すことにしましょう。先手の指し手を求める関数を move_first、後手の指し手を求める関数を move_second とします。これらの関数は評価値と指し手の配列を返します。一般に、ミニマックス法で必要なのは評価値だけで、指し手はなくても動作するのですが、今回は指し手も返すことにします。

関数 move_first は次のようになります。

引数 depth はゲーム木の探索レベルを表します。引数 board は現在の局面を表します。カラーのように、1 手指すたびに局面の大部分が変化するようなゲームでは、局面をコピーしてから石を動かして新しい局面を生成するといいでしょう。逆に、局面の一部分しか変化しないゲームでは、局面を直接書き換えて新しい局面を生成する方法が一般的です。 この場合、バックトラックするとき新しい局面から前の局面に戻す処理が必要になります。

depth が 0 になったとき、board の評価値を計算して返します。カラーの場合、評価関数は先手番のカラーと後手番のカラーの差 (board[FIRST_KALAH] - board[SECOND_KALAH]) としました。もしも、勝負がついている場合は FIRST_WIN (99) または SECOND_WIN (-99) を返します。とても単純な関数ですが、これでも十分に機能します。実際、探索レベルを上げると、M.Hiroi はほとんど勝てなくなります。評価値はメソッド value_func で計算し、その結果と空の配列を return で返します。

次に、ミニマックス法で指し手を求めます。変数 value は評価値を格納し、評価値の最小値 MIN_VALUE (-100) で初期化します。先手は評価値の高い手を選択するので、最初に調べた手は必ず選択されることになります。あとは、評価値を比較して、高い手を選択すればいいわけです。変数 move は選択した指し手を格納します。

次の for ループで、実際に石を動かして探索を行います。最初に pos の位置に石があるかチェックします。次に、局面をコピーしてから アルファ値の定義 アルファ値の定義 アルファ値の定義 アルファ値の定義 move_stone で石を動かし、その結果を result にセットします。result が GAMEOVER の場合は、value_func で評価値を計算して変数 v にセットします。

KALAH の場合は石が自分のカラーに入ったので、move_first を再帰呼び出しします。このとき、depth の値はそのままで、新しい局面 b を渡します。返り値は v と m に格納します。NORMAL の場合は、手番が後手に移るので、move_second を再帰呼び出しします。depth を -1 して局面 b を渡します。この場合、評価値だけが必要なので、指し手は無名変数 _ で受け取ります。

次の処理がミニマックス法の心臓部です。先手は評価値の大きい方が有利なわけですから、いちばん大きな評価値(マックス)の指し手を選びます。選んだ指し手は move に格納し、その評価値は value に格納しておきます。評価値 v が value よりも大きい値であれば、その指し手を選べばいいわけです。最後に return で value と move を返します。

次は後手の指し手を選ぶ関数 move_second を作ります。

後手番の場合、先手とは逆にいちばん小さな評価値(ミニマム)の指し手を選択することに注意してください。変数 value は評価値の最大値 MAX_VALUE に初期化します。石がカラーに入った場合は move_second を再帰呼び出しして、カラー以外の穴に入った場合は move_first を再帰呼び出しします。そして、ミニマックス法では v が value よりも小さい場合に value と move の値を更新します。あとは、全ての指し手を調べるだけです。とても簡単ですね。

●ゲームの進行

引数 first_depth は先手の探索レベル、second_depth は後手の探索レベルです。最初に初期状態の盤面を生成して変数 board にセットします。変数 turn は手番を表します。あとは while ループの中で思考ルーチンを呼び出してゲームを進めます。

思考ルーチンの返り値を value, move で受け取ります。そして、move から指し手を一つずつ取り出して、メソッド move_stone で石を動かします。盤面の表示はメソッド print_board で行います。あとは play を呼び出すだけです。

●アルファベータ法のプログラム

引数 limit がアルファベータ法で使用する基準値です。この値は 1 手前の局面の評価値です。変数 value は評価値を格納します。これはミニマックス法と同じです。この値が次の局面(後手番)での基準値となります。

石を動かした結果が KALAH であれば move_first を再帰呼び出しします。このとき、depth だけではなく、limit もそのまま渡します。アルファベータ法では相手番の評価値が基準点になるので、この再帰処理では基準点として value を渡すのではなく、limit をそのまま渡すことに注意してください。

アルファベータ法の処理は簡単です。ミニマックス法で指し手を選択したあと、value が limit 以上の値になった時点で、for ループから break で抜けるだけです。value が limit よりも大きな値になった時点、つまり value > limit で枝刈りしても正常に動作しますが、value >= limit としたほうが効率よく枝刈りできるようです。まだ評価値が求まっていない場合、limit は 1 手前(後手番)の局面の評価値ですから MAX_VALUE がセットされています。MAX_VALUE より大きな評価値はないので、アルファベータ法により枝刈りが実行されることはありません。

後手の指し手を選ぶ関数 move_second は次のようになります。

先手 (move_first) とは逆に、後手 (move_second) の場合は value を MAX_VALUE で初期化します。これが評価値の中で最大の値となります。後手の場合、ミニマックス法では小さな値を選ぶので、最初に求めた評価値が無条件に選択されます。アルファベータ法の場合も先手とは逆に、vlaue が limit 以下の値になった時点で枝刈りを行えばいいわけです。

あとは、関数 play を修正します。プログラムは次のようになります。

注意する個所は、move_first を呼び出すとき、引数 limit には MAX_VALUE をセットし、move_second を呼び出すときは MIN_VALUE をセットするところだけです。プログラムの主な修正はこれだけです。

結果を見ればおわかりのように、アルファベータ法の比較回数はミニマックス法の 1/2 から 1/9 程度になりました。カラーの場合、アルファベータ法の効果は極めて高いですね。それだけ実行時間も速くなります。

思考ゲームの基本である「ミニマックス法」と「アルファベータ法」を説明しました。今回説明したのは単純なアルファベータ法ですが、簡単な思考ゲームであれば、これだけでも十分な効果を発揮します。今まで M.Hiroi が作成した思考ゲーム (Tcl/Tk GUI Programming : Mini Games 2 [*1] ) は、今回説明したミニマックス法とアルファベータ法が基本となっています。このほかにも、探索効率を上げるためのアルゴリズムが数多く提案されています。興味のある方は 参考文献 1, 2 を読んでみてください。

一次関数について|中学生/数学

アルファはお子さまを全力でサポートします。 アルファはお子さまを全力でサポートします。

この記事では、皆さんが数学で苦戦することの多い一次関数について、"できたを増やす"でお馴染みの家庭教師のアルファが分かりやすくご説明します。
《そもそも一次関数とは?》
関数とは、xとyがあるときに、xの値が決まると、yの値がただ1つ決まることを、
「yはxの関数である」といいます。逆に、yの値が決まるとxの値がただ1つ決まるときは、「xはyの関数である」といいます。
yがxの関数であるとき、xはyの関数であるとは限りません。 アルファ値の定義

  • 一次関数の式は?
  • 一次関数の式の意味
  • 変化の割合って何?
  • 一次関数の式はどうやって出すの?
  • 一次関数の式はどうやって出すの?(2点を通る直線の式)
  • グラフの交点ってどうやって求めるの?
  • 一次関数の利用が難しい・・・
  • まとめ

一次関数の式は?


一次関数の式は、『y=ax+b』という式で表せます。この式は何を表しているかというと、
直線になる、ということです。
比例のところで、比例の式はy=axで、原点を通る式になる、ということを習っていると思います。一次関数と比例の式を比べると、違いは+bのところだけになりますね。
この+bは上下に移動していることを意味します。

一次関数の式の意味

では、一次関数の式 アルファ値の定義 y=ax+b からどんなことが読み取れるのでしょうか。
先ほど、bについては「上下に移動する」と説明をいたしました。
このbは、『切片』と呼ばれます。
xを0にすると、y=ax+bの式は、y=bとなります。
xは0なので、(0.b)の点はy軸上の点です。
bをみるとこの直線がy軸上のどこを通るかがわかります。
前項の「上下の平行移動」ということを踏まえても、原点からbだけ移動した点ですから、
y軸上の点になることがわかります。

次に、aについて、aは『傾き』と呼ばれます。
xが1ずつ増えると、yはaの分だけ増えていきます。この増えかたによって直線の傾き方が決まる、ということです。
aの値が大きいほど、直線の傾斜が大きくなり(y軸に近い直線になり)、小さいほど傾斜もなだらかになります。また、aが正の数なら、直線は右上がりとなり、負の数なら右下がりの直線になります。

無料体験無料体験
資料請求資料請求

変化の割合って何?

変化の割合は、(yの増加量)÷(xの増加量)で求められる数です。
一次関数のところで習うのですが、なんかピンとこないかもしれませんね。
(xの増加量)のところを1としてみましょう。そうすると、「xが1のとき、変化の割合はyの増えた分になる」という意味になります。

ここで、前の項目のaのところをみてください。
「xが1ずつ増えると、yはaの分だけ増えていきます」とあります。
上の分と見比べると、「変化の割合はaになる」ということがわかります。

直線の場合、進み方は一定となるので、変化の割合も一定で、aと同じになります。
変化の割合を求める式は、そのままaを求める式にもなっています。
(注意点)
一次関数は直線の式になるから変化の割合=aとなりますが、直線でない場合(放物線や双曲線など)は、変化の割合が一定ではないので、その都度計算が必要になります。

一次関数の式はどうやって出すの?

解答)
傾きが3であることから、a=3であることがわかります。
この時点でこの式はy=3x+bとなります。
これが(2,4)を通るから、x=2、y=4を代入します。
4=3×2+bになります。
これを解いて、b=-2
よってこの式は、y=3x-2 アルファ値の定義
となります。

解答)
xが2増えると、yは4減少します。これから変化の割合を計算します。
-4÷2=-2 ですので、a=-2になります。この時点での式は、
y=-2x+b になりますね。これに、x=4、y=1を代入します。
1=-2×4+b これを解いてb=9
よって答えはy=-2x+9となります。

一次関数の式はどうやって出すの?(2点を通る直線の式)

2点を通る直線を求めるパターンは頻繁に使います。
解き方のアプローチが2通りあるので、解きやすい方法を選んでマスターするのがいいでしょう。具体的には、
① 変化の割合からaを求めてからbを出す方法。
② 連立方程式を作り、a,bを両方いっぺんに出す方法。

解答①)
xは2から4まで増えているので、xの増加量は2、同様にyの増加量は4なので、
変化の割合=4÷2=2 よってaは2になります。
この時点で、求める式は y=2x+bになります。
この式に(2,5)(4,9)のどちらでもいいので好きなほうを代入して、bを出します。
(2,5)を選んだとして、
5=2×2+b よってb=1
したがって、直線の式は y=2x+1 となります。

解答②)
直線の式 y=ax+b に(2,5)を代入して1つ式を作り、同じように(4,9)をつかってもう一つ式を作ります。

この連立方程式を解くと、a=2、b=1となります。
よって求める式は、 y=2x+1 となります。

グラフの交点ってどうやって求めるの?

一次関数の問題の中で、「2つの直線の交点を求めなさい」という問題もよく出てきます。
仮にその2つの直線を、直線m、直線nとし、その交点をpとします。
点pは、直線m上の点ですので、直線mの式に代入しても成り立ちます。
同様に、点pは、直線n上の点でもありますので、直線nの式に代入しても成り立ちます。
よって、点pは、直線m、nのどちらに代入しても成り立ちます。
これを言い換えると、2つの式を同時に満たす数が、点pの値、つまり、連立方程式の解ということになります。

無料体験無料体験
資料請求資料請求

一次関数の利用が難しい…


一次関数は幅広く応用問題があります。「長方形の辺上を点pが動く」なんていう問題だったり、列車の運行状況をダイヤグラムで表してあったり、水槽に水を入れたり抜いたり、
グラフで囲まれた図形の面積云々・・・電気料金などなどいろいろな形で問題が出されます。

数学の問題は一次関数に限らず、まず文章からどんな式が作れるか、が第一関門になります。
それがたまたまy=ax+bの形になれば、一次関数の式となり、グラフが直線になる、ということがわかる、という流れになります。
式さえ作れれば、その式を使って問題を解いていけばいいので、あとは解き方や、計算に慣れていくことが重要です。
「連立方程式の利用」や「一次関数の利用」が難しいと感じる生徒はたくさんいますが、そのほとんどの生徒が「式さえできてしまえばできる」といいます。
まずは、文章からちゃんと式を作ることができるように頑張ってみましょう。

まとめ
~一次関数の対策は、色々な問題を解いてみること~

一次関数は、問題の中に連立方程式を必要としたり、また二次関数と複合したりと様々な問題を出しやすい分野でもあります。
一次関数に限った話ではありませんが、色々な問題をたくさん解いてみることが重要です。
一度経験したことのあるパターンの問題なら解きやすいですし、またそうでない問題でも、ほかの問題で考えて解いた分の経験を生かして、解答できることが多くなるでしょう。

さて、この記事をお読み頂いた方の中には
「中学生になってから苦手な科目が増えた」
「部活が忙しくて勉強する時間がとれない」
「このままだと高校受験が心配」 アルファ値の定義
といった、お子さまの勉強に関するお悩みを持たれている方も多いのではないでしょうか。
中学生は授業のペースがどんどん早くなっていき、単元がより連鎖してつながってきます。
そのため、一つの単元につまづいてしまうと、そこから連鎖的に苦手意識が広がってしまうケースが多いのです。

家庭教師のアルファが提供する完全オーダーメイド授業は、一人ひとりのお子さまの状況を的確に把握し、学力のみならず、性格や生活環境に合わせた指導を行います。もちろん、受験対策も志望校に合わせた対策が可能ですので、合格の可能性も飛躍的にアップします。
「教育を通じて社会のできたを増やす」をミッションとする私たちは、ADHDや自閉症などの発達障害を持つ中学生のお子さまの指導にも対応しています。
中学生のお子さまの勉強についてお困りの方は、是非一度、プロ家庭教師専門のアルファの指導を体験してみてください。下のボタンから、無料体験のお申込みが可能です。

無料体験無料体験
資料請求資料請求

こちらの記事の監修者

浅井保 (あさい たもつ)
・北海道大学文学部卒
・家庭教師のアルファ 講師部長 アルファ値の定義
・山手中央高等学院 学院長

アルファテストとベータテストの違い

アルファテストは、ソフトウェアを開発している組織内のユーザーによって実行されます。 これはラボ環境で行われ、ユーザーの行動を測定し分析することができます。 その目的は、ソフトウェアを一般に公開する前に、実際のユーザーがそのソフトウェアを使用およびナビゲートする能力を測定することです。 アルファテストには、単体テスト、コンポーネントテスト、およびシステムテストが含まれます。 開発者は、デバッガソフトウェアまたはハードウェア支援デバッガのいずれかを使用して、システム内のバグをすばやく見つけることができます。

ソフトウェアがアルファテストに合格すると、ベータテストの準備が整います。 ベータテストはプレリリーステストと見なされ、商用リリースの前に行われます。 これはテストの最後の段階です。 ソフトウェアがベータテストに合格すると、その後、一般に公開することができます。

ベータテストは、一般的に限られた数の外部ユーザーを含みます。 現時点では、プログラムに実際のテストを実施するために、ベータテスト版のソフトウェアが選択された外部ユーザーのグループに配布されています。 これは、製品に障害やバグがほとんどないこと、および対象とするユーザーが通常の使用方法を処理できることを確認するために行われます。 フィードバックを増やすために、ベータ版が一般に公開されることがあります。 観客がバグや欠陥を見つけた場合、彼らはそれを開発者に報告し、開発者はその後問題を再現してリリース前に修正します。 このプロセスは、正式なテスト計画で見逃していた欠陥を識別して軽減するのに役立ちます。

ベータテストはまた、発売後に必要となるカスタマーサポートのリソースやプロセスを設定するのにも役立ちます。 それはまた、一般向けにソフトウェアのプレビューを提供するのに役立ち、それはソフトウェアのリリース前に話題を作るのに役立ちます。 聴衆がソフトウェアを好む場合、彼らは彼らの同僚とそれについて議論し、彼らのソーシャルネットワーキングサイト、ブログなどにそれを投稿し、そしてそれ故に彼ら自身で製品を宣伝するのを助けるでしょう。

アルファチャンネルとマットについて

Adobe Photoshop、ElectricImage、FLV、TGA、TIFF、EPS、PDF、Adobe Illustrator など、多くのファイル形式でアルファチャンネルを含むことができます。「数百万色+」の色深度で保存された AVI や QuickTime 形式も、これらのコンテナに格納されている画像の生成に使用されたコーデック(エンコーダー)によっては、アルファチャンネルを含むことができます。After アルファ値の定義 Effects は、Adobe Illustrator、EPS、および PDF ファイルの空白部分を自動的にアルファチャンネルに変換します。

出力イメージの色深度を指定するときのプラス記号(「数百万色+」など)は、アルファチャンネルを表します。同様に、32 bpp への出力を選択した場合は、4 つのチャンネル(RGBA)それぞれの出力の色深度が 8 bit/チャンネルになります。

1 つの画像に複数のアルファチャンネルを保存できるプログラムもありますが、After Effects では、4 番目のチャンネルだけがアルファチャンネルとして変換されます。

アルファチャンネルとは技術的には、RGBA イメージファイル内の 4 番目(A)のチャンネルを表します。そのチャンネルが透明情報をやり取りするのに使用されるかどうかは関係ありません。しかしながら、その 4 番目のチャンネルは透明情報をやり取りするのによく使用されるため、アルファ透明という用語は一般的には同義語として使用されています。このやり取りは任意であり、形式によっては、透明情報用に他のチャンネルを使用したり、4 番目のチャンネルを透明情報以外に使用したりします。

Knoll Unmult プラグインを使用すると、レイヤーの暗い部分を基にアルファチャンネルを作成できます。この方法は、光のエフェクト(レンズフレアや火など)を使用するレイヤーを別のレイヤーの上に合成する場合に有効です。詳しくは、Red Giant Software Web サイトを参照してください。

マスクについて

After Effects で使用するマスクとは、レイヤーの属性、エフェクト、およびプロパティを変更するパラメーターとなるパスのことです。マスクをよく使うのは、レイヤーの各ピクセルの透明度を決めるアルファチャンネルを変更するときです。また、テキストをアニメートするパスとしても使用します(パスに沿ったテキストの作成とアニメートを参照。)

マスクをコピー、カット、保存、再利用、削除する

マスクをコピー、カット、複製、ペーストする

  • 選択したマスクをクリップボードにコピーまたはカットするには、編集/コピーまたは編集/カットを選択します。
  • 選択したマスクを複製するには、編集/複製を選択します。
  • マスクをレイヤーにペーストするには、レイヤーを選択して、編集/ペーストを選択します。マスクを選択している場合は、そのマスクが置き換えられます。

マスクを保存する

  • アニメート化されたマスクを保存するには、保存するマスクキーフレームを選択します。
  • アニメート化されていないマスクを保存するには、そのマスクを選択します。

マスクを再利用する

マスクを削除する

  • 1 つのマスクを削除するには、タイムラインパネルでマスクを選択し、Delete キーを押します。
  • すべてのマスクを削除するには、削除するマスクを含むレイヤーを選択し、レイヤー/マスク/すべてのマスクを削除を選択します。

マスクパスのカラーを制御する

マスクを簡単に区別して操作しやすくするために、コンポジションパネルとレイヤーパネルではマスクパスに色が付き、タイムラインパネルにもマスク名の横に同じ色が表示されます。After Effects アルファ値の定義 の初期設定では、すべてのマスクに黄色が使用されています。各マスクをさらに識別しやすくするために、タイムラインパネルで手動でマスクの色を変更したり、新しいマスクに別の色を適用するように設定できます。

マスクパスの色コントラストを使用環境設定(環境設定/アピアランス)を有効にすると、After Effects はマスクの描画を開始した点の近くの色を分析します。次に、After Effects はその領域の色とは異なるラベルカラーを選択します。また、最後に描画したマスクの色も避けます。

マスクパスのカラーを変更する

マスクパスのカラーを切り替える

マスクのモード

マスクの描画モード(マスクモード)は、1 つのレイヤー内の複数の異なるマスクが相互に作用する方法を制御します。デフォルトでは、すべてのマスクが「加算」に設定されています。加算モードでは、同じレイヤーで重なり合うマスクの透明度の値が加算されます。マスクごとにモードを適用できますが、モードをアニメート化する(マスクモードのプロパティにキーフレームまたはエクスプレッションを設定して時間の経過に伴ってモードを変更する)ことはできません。

マスクモードを使用すると、透明な部分が複数ある複雑なマスクを作成できます。例えば、2 つのマスクを組み合わせるマスクモードを設定し、それらの 2 つのマスクが交差する部分を不透明にすることができます。

A. 元のマスク B. なし C. 加算 D. 減算 E. 交差 F. 比較(明) G. 比較(暗) H.

機能

Mac

Windows

注意:

  • 長方形 ツールや 楕円形 ツールなどの シェイプ ツールを使用して新しいマスクを描画する場合、マウスを操作しながら、これらのキーボードショートカットを押すことができます。
  • ペン ツールを使用して新しいマスクを描画する場合、マスクをクローズする際にのみこれらのキーボードショートカットを押すことができます。クローズする頂点(通常、最初の頂点)の上にポインターを置き、マウスボタンをクリックして押したままにしてマスクをクローズしてから、マウスボタンを放す前にマスクモードのキーボードショートカットを押します。オープンマスクにはモードはありません。 ペン ツールでオープンマスクを描画する場合、これらのキーボードショートカットは機能しません。
  • クローズマスクを変更する場合、マウスボタンを押している間、いつでもこれらのキーボードショートカットを押すことができます。

マスクのエッジを拡張または縮小する

「マスクの拡張」の値は、最大で 32,000、最小で -32,000 までスクラブできます。After Effects の以前のバージョンでは、これらの値は 1,000 までスクラブでき、1,000 を超えた値は、手動で入力していました。

Todd Kopriva が、アドビ web サイトで、マスクの拡張でコーナーが丸くなる理由について、図を示して詳しく説明しています。

マスクのエッジをソフトにする(ぼかす)

ぼかしとは、マスクのエッジから指定した幅だけ透明度をフェードさせ、エッジを柔らかくすることです。マスクのエッジをハードまたはソフトにする(ぼかす)には、「マスクの境界線のぼかし」プロパティを使用します。初期設定では、ぼかしの幅は、エッジをまたがるように内側と外側に半分ずつに設定されています。例えば、ぼかしの幅を 25 に設定すると、エッジの内側 12.5 pixel と外側 12.5 pixel がぼかしの対象になります。

「マスクの境界のぼかし」の値は、スライダーを使用して、最大で 32,000 まで設定できます。

A. ぼかしが 5 pixel のマスクされたレイヤー B. ぼかしが 40 pixel のマスクされたレイヤー C. 5 pixel ぼかした結果 D. 40 pixel ぼかした結果

(オプション)縦と横のぼかしの量が比例して変わるようにするには、マスクのぼかしプロパティの横にある縦横比を固定スイッチ をクリックします。

可変幅のマスクの境界のぼかし

After Effects の以前のバージョンでは、クローズマスクにエッジのぼかしを追加できましたが、ぼかしの幅(範囲)はマスクの周囲で同じでした。新しいマスクの境界のぼかしツール(ペンツールと同じツールメニューで使用可能)が追加され、クローズマスクに沿って、さまざまな幅を持つポイントを定義できます。

ぼかしポイントを作成するには:

複数のぼかしポイントを選択するには:

ぼかしポイントの選択を切り替えるには

ぼかしポイントを移動するには、次のいずれかを実行します。

  • 選択ツールまたはマスクの境界のぼかしツールを使用して、ぼかしの範囲ハンドルをドラッグします。
  • マスクの境界のぼかしツールをアクティブにして、左向きまたは右向き矢印キーを押して、パスに沿ってぼかしを移動したり、上向きまたは下向き矢印キーを押して、ぼかしの幅を伸縮したりできます。

ぼかしポイントをマスクパスにスナップするには:

ぼかしの衰えを制御するには:

ぼかしポイントによって、ぼかし境界の張力(滑らかさまたは曲率)を調整するには:

Alt キー(Windows)または Option キー(Mac OS)を押しながら、ぼかし範囲ハンドルをドラッグして張力を調整します。情報パネルにハンドルの現在の張力が表示されます。

ぼかしポイントの停止補間(次のぼかしポイントまで一定のぼかしの半径の場合)を設定するには:

Alt キー(Windows)または Option キー(Mac OS)を押しながら、ぼかし範囲ハンドルをドラッグして張力を調整します。情報パネルにハンドルの現在の張力が表示されます。

ぼかしポイントの停止補間(次のぼかしポイントまでの一定のぼかしの半径の場合)を設定するには:

マテリアルのデータ タイプ

マテリアル エディタでのデータ表現と処理を理解することは、Unreal Engine でのマテリアル作成における主要な概念の一つにつながります。マテリアルの物理的な属性を定義するメイン マテリアル ノードの入力は、それぞれ特定のデータ タイプを受け入れるように設計されています。同様に、マテリアルの構築に使用される多くのマテリアル表現式ノードは、特定の種類のデータを入力として受け取らなかった場合は失敗することになります。

このページでは、マテリアル エディタで利用可能な 4 つのデータ タイプの概要について説明し、これらを使用する一般的な例について紹介します。

浮動小数変数

コンピュータ グラフィックスにおいて、浮動小数変数は単一の数値 (正または負) を格納する変数です。「浮動小数」とは「浮動小数点」の短縮形で、値は整数である必要はなく、小数点を含めることができます。例えば、「1.0」や「-0.アルファ値の定義 5」、または「42.0」はすべて浮動小数値です。

極端に言えば、マテリアル エディタのすべてのデータ タイプは浮動小数変数のバリエーションです。それらの違いは格納する値の数にあります。Float (浮動小数) は単一の数値を表し、Float2 は異なる 2 つの浮動小数点値を格納します。例えば、(1.0, 0.5) アルファ値の定義 です。

次は、マテリアル エディタで利用可能な 4 つのデータ タイプを説明した表です。

定数 2 ベクター (Constant 2Vector)

UV または XY 座標、スケール

定数 3 ベクター (Constant 3Vector)

色 (r, g, b) または 3D 座標 (x, y, アルファ値の定義 z)

定数 4 ベクター (Constant 4Vector)、ベクター パラメータ、テクスチャ

アルファ チャンネルを含む色、テクスチャ (r, g, b, アルファ値の定義 a)

Float

前述のとおり、Float には単一の浮動小数点値が格納されます。値は正または負のいずれでもよく、小数点を含めることができます。Float は 2 つのマテリアル表現式を使って定義できます。

定数マテリアル表現式 (Constant Material Expression)

Constant Material Expression ノードには単一の定数浮動小数値が格納されます。定数であるため、この値はマテリアルのコンパイル後にも変化しません。次の画像は、「1.0」の値を保持する Constant ノードです。

Constant Material Expression

スカラー パラメータ

スカラー パラメータ も浮動小数値を格納します。定数とは異なり、スカラー パラメータは、マテリアルのコンパイル後またはランタイム時に、マテリアル インスタンス内で変更可能な名前の付いた変数にすることもできます。次の画像は「Roughness」 (ラフネス) という名前のスカラー パラメータを示しており、そのデフォルト値は「0.6」になっています。これを使ってマテリアルのラフネス属性を定義できる一方で、各アーティストはこの値をマテリアル インスタンス内でオーバーライドすることができます。

Scalar Parameter

定数の代わりにスカラー パラメータを使用すべき状況と使用方法については、「 インスタンス化マテリアル 」ドキュメントを参照してください。

メイン マテリアル ノード の特定の入力は浮動小数で定義されています。例えば、Metallic (メタリック)Specular (スペキュラ)Roughness (ラフネス) の各 入力 は、0 ~ 1 の範囲の浮動小数値を受け入れます。そのため、定数マテリアル表現式またはスカラー パラメータをメイン マテリアル ノードに直接渡し、これらの属性を定義することができます。

Scalar and constant Material Expressions

定数とスカラー パラメータは、エフェクト強度の制御に使用されることが多くあります。次の画像は、ソリッド カラーによって乗算され、Emissive Color (エミッシブ カラー) 入力に値を渡す「Emissive Power」(エミッシブ強度) という名前のスカラー パラメータを示しています。Emissive Power パラメータの値を変更することで、エミッシブ出力の強度を増減できます。

Scalar parameter as Emissive Power

Float2

Float2 は 2 つの数値を格納します。例えば、(2.0, 3.0) です。

マテリアル エディタでは、Float2 の定義に Constant 2Vector (定数 2 ベクター) マテリアル表現式が使用されます。次の画像には、2 つのチャンネルがそれぞれ「2.0」および「3.0」の値に設定されている Constant 2Vector が示されています。

Constant 2Vector node

Constant 2Vector

Constant 2Vector は、2 チャンネルのデータを必要とする属性を定義または変更する場合に非常に便利です。[Details (詳細)] パネルでは、これらの 2 つの値が「R」と「G」と表記されており、RGB カラーにおける赤色と緑色のチャンネルをそれぞれ表しています。ただし、これはほんの一例です。Constant 2Vector では、座標 (UV、XY) やスケール (幅、高さ) アルファ値の定義 などの属性も定義できます。

次の例では、平面上のテクスチャの位置を変更するために、Texture Coordinates ノードに Constant 2Vector が追加されています。最初のスライドでは Constant 2Vector の値がそれぞれ「0」なので、テクスチャの位置は変わりません。

Constant 2Vector の値によってテクスチャの位置を制御します。

texture-coords-01.png

texture-coords-02.png

texture-coords-03.png

[R] の値を「0.5」に変更すると、これがテクスチャの U 座標に追加されるため、テクスチャが水平方向の軸に沿って移動します。これにより、平面の左右のエッジがテクスチャで包み込まれます。[G] の値を「0.5」に変更すると、テクスチャは垂直方向に移動します。テクスチャの中心は平面の 4 つの隅になります。

Float3

float3 は 3 つの数値を格納します。マテリアル エディタでは、Constant 3Vector (定数 3 ベクター) ノードによって Float3 が定義されます。

Constant 3Vector node

Constant 3Vector

Unreal Engine では、赤色、緑色、青色の各チャンネルを表す 3 アルファ値の定義 アルファ値の定義 つの値によってピクセルの色が定義されます。そのため、ソリッド カラーの定義は Float3 の使用例の一つとなっています。

Constant 3Vector ノードをダブルクリックするとカラー ピッカーのダイアログが表示され、カラー ホイールやスポイト ツールを使って色を選択できます。カラー ピッカーには、RGBHSV、または Hex の値を入力するフィールドも備わっており、特殊な色を作成することもできます。カラー ピッカーは、[Details] パネルの「色見本」をクリックすることでも表示できます。

Material Editor color picker

Float3 の 2 つ目のユースケースとしては X、Y、Z 座標の定義があります。例えば、World Position Offset (ワールド位置オフセット) 入力は、ワールド空間での X、Y、Z 軸におけるマテリアルのオフセット量を定義する 3 つの値を受け入れます。

次の 4 つのスライドでは、Constant 3Vector の値がそれぞれ「800」に変更され、球体の位置が変化する様子を確認できます。最初に X 軸上で変わり、次に Y 軸上、3 つ目のスライドでは Z 軸上で変化します。

World Position Offset 入力は 3 つの値を受け取り、X、Y、Z の各軸に沿ってマテリアルをオフセットします。

world-position-offset-01.png

world-position-offset-02.png

world-position-offset-03.png

world-position-offset-04.png

Constant 3Vector をパラメータ化する

Constant 3Vector を右クリックし、コンテキスト メニューから [Convert to Parameter (パラメータに変換)] を選択することでこれをパラメータ化できます。これにより、そのノードがベクター パラメータに変わります。Vector Parameter ノードは 4 つの値 (R、G、B、A) を格納し、これによって Float4 となります。

ただし、Float3 を必要とする入力では最初の 3 つの値が使用され、4 つ目の値は破棄されます。例えば、Base Color (ベースカラー) 入力では Float3 を受け入れますが、Base Color にベクター パラメータをつなげると、R、G、B の各チャンネルが使用されて、4 つ目の値 (アルファ チャンネル) は破棄されます。Unreal Engine ではどのチャンネルを破棄すべきかを把握しているため、Float3 をパラメータ化する必要がある場合は、当該のノードが技術的には アルファ値の定義 Float4 であっても、ベクター パラメータを安全に使用することができます。

Float4

float4 は 4 つの浮動小数点値を格納します。例えば、(50.0, 0.0, 100.0, 0.5) です。一般的に、Float4 の定義には 2 つのマテリアル表現式が使用されます。

Constant 4Vector

Constant 4Vector は 4 つの定数値を格納します。Constant 4Vector が最もよく使用される例としては、アルファ チャンネルを含む RGBA カラーの表現があります。Constant 3Vector と同様に、当該のノードをダブルクリックするか、[Details] パネルの色見本をクリックしてカラー ピッカーを表示します。

Constant 4Vector

ベクター パラメータ

ベクター パラメータ とは、パラメータ化された Float4 を意味します。ベクター パラメータは、パレットまたはカンから直接作成できます。ベクター パラメータ の最もよくあるユースケースとしては、マテリアルで カラー パラメータを作成し、それを各アーティストがマテリアル インスタンス内で簡単にオーバーライドできるようにする場合があります。例えば、ベクター パラメータをテクスチャ上で乗算することで、マテリアルの一部の外観 (ベース カラーやエミッシブなど) の色合いをさらに制御することができます。

Vector Parameter expression

パラメータ化されたマテリアルのワークフローにおける従来のユーティリティに加えて、ベクター パラメータを使用することで追加のメリットを得ることができます。このページで紹介した例とは異なり、ベクター パラメータに含まれるそれぞれのデータ チャンネルには、ノードの右側にある 5 つの出力ピンを通じて個別にアクセスすることができます。上の画像で示されているように、これらは次のとおりです。

RGBA - Float4 のすべての値を出力します。上の画像では (0.0, 1.0, 0.5, 0.アルファ値の定義 0).

RR チャンネルの値のみを出力します。

GG チャンネルの値のみを出力します。

BB チャンネルの値のみを出力します。

AA チャンネルの値のみを出力します。

これは、突き詰めると、マテリアル グラフを通じて渡される情報は「異なるさまざまな方法でパッケージ化されて表現された浮動小数点値である」というマテリアル作成の重要な側面を表しています。ベクター パラメータのチャンネルは、[Details] パネルでは「RGBA」と表記されていますが、実際にマテリアルでそのとおりに使用する必要はありません。

色の表現以外にも、ベクター パラメータを使って、関連する個別の 4 つの値をパラメータ化することができます。ノードのそのような使用例として、Megascans の親マテリアルのケースが挙げられます。この場合は、ベクター パラメータが UV タイリングとマテリアルのオフセットのパラメータ化に使用されます。

Vector Parameter in Megascans Material

上の画像で、RGBA の各チャンネルがそれぞれ [Tiling X]、[Tiling Y]、[Offset X]、[Offset Y] という名前に変わっていることに注目してください。ベクター パラメータのチャンネルの名前は、[Details] パネルの [Parameter Customization (パラメータをカスタマイズ)] > [Channel Names (チャンネル名)] で変更できます。これらの名前は、アーティストがパラメータ値をオーバーライドする際に、マテリアル インスタンス エディタに表示されるものです。

このページで紹介されている 4 つのデータ型は、マテリアル グラフを通過するすべての情報の基礎を形成します。データ型は必ずしも不変ではないことを理解することが重要です。例えば、2つの浮動小数を組み合わせて float2 を形成できます。同様に、大きなデータ タイプから単一の浮動小数を抽出または分離することができます。

関連記事

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次
閉じる