東京工業大学 ロボット技術研究会

東京工業大学の公認サークル「ロボット技術研究会」のブログです。 当サークルの日々の活動の様子を皆さんにお伝えしていきます。たくさんの人に気軽に読んでもらえると嬉しいです。
新歓特設ページ        ロボット技術研究会 HP        ロボット技術研究会 twitter公式アカウント

CG^2

「ロボット技術研究会」通称「ロ技研」は、その名前の通りロボットの制作や研究はもとより、電子工作や機械工作、プログラミングなどの幅広い分野にわたるものつくり活動を行っています。

カテゴリ一覧: loading

【CG^2】 新歓ゲームAIのちょっとした話

こんにちは。
CG^2研のやけぬる(@jken_ull)です。

新刊展示ではこんな感じのゲームを展示していました。
無題2

↓ゲームの動画


ルールは
・同じ色を4つ並べると消える
・連鎖すると相手におじゃまブロックを送ることができる
・ウィルスを全部消すと勝ち
・ブロックが置けなくなると負け
という感じのゲームです。

制作期間は新歓展示まで半月でした。だらだらと短期間制作なのです。


今回はパズルのAIについて少しお話しようと思います。
先週のrogyゼミで話したことと似たようなお話です。


AI(人工知能)とは、人工的にコンピュータに人間のような知能を持たせようとすることを指します。
今回のゲームではパズルを解くAIを作りました。


では、どうやって解くのかを簡単にお話します。

AIにパズルを解かせるときには、出来る限りクリアできるようなやり方をさせたいと思いますよね。
比較
上の図の例でも、左の置き方よりも、右の置き方をさせたいですよね。

今回のゲームでは置く場所を決めていくわけですが、配置していくブロックは何個か分かっているだけで、それ以上はランダムに決定します。
そのため、事前に全探索してクリアできるように配置の仕方を決めよう、というわけにはいきません。
そこで、与えられたブロックの情報から、より良い配置の仕方を決定していくことになります。
今回は評価関数を使うことにします。

評価関数とは、ゲームの状態を評価して数値に変換する関数のことを言います。
その評価した値を見て、ゲームの状態をより良くするように進めていきます。

今回の場合は、
・できるだけ同じ色を並べていくようにする
・4つ並べると消すことができる
・連鎖したほうがよい
・ウィルスを優先的に消す
ということを意識して評価関数を考えることができます。

例えば、あるブロックを座標xに置いた時の評価関数を
g(x) = { (消せるブロックの数) + 10×(消せるウィルスの数) }×20×(連鎖する数) + (並んでいる同色ブロックの数)
という感じで定義します。
そして、すべての座標xでこの関数で評価してみて、g(x)を最大にする座標xに配置する、としておきます。
これでも、そこそこ良い感じのAIになります。

他にも、何個か先を見たり、乱択アルゴリズムなどいろんなアルゴリズムを使ったり、ゲームの状態によって評価関数を使い分けるなど、いろんなやり方があります。

評価関数はこうすれば必ず強いという定石はなく、プログラマの経験や理解の程度に影響します。
作り方によってAIの強さが変わるので、きちんと調整する必要があります。


最後に、AIを作るにあたって大切なことを書いておきます。

判定を時間内に終わるようにする
探索するAIでは、より多く探索していくと強いAIが作れるのですが、調べすぎて時間内に終わらないことがあります。
今回のゲームの場合、AIとして分かっている4個のブロックの配置状態をすべて探索するようにすると、その時の最適な置き方が分かり強いAIが作れるのですが、時間的に膨大な時間がかかります。 
この時、メインルーチンで処理している場合には、探索処理が時間内に間に合わないと次の処理に移れないため、ラグが発生してしまいます。
ラグはプレイヤーのゲームプレイのテンポを崩したり、誤操作してしまう原因になってしまうため、できるだけ避けたいものです。
また、別スレッドで処理している場合にも、探索処理が時間内に終わらない時でもブロックは動き続けるため、ゲームの状態によっては計算が終わる前に配置が決まってしまう可能性があります。
そのため、うまく枝刈りする(無駄な計算をしないようにする)などの処理を行い、探索の時間を減らす必要があります。
最悪の計算時間でも時間内で終わるようにAIを作るようにしましょう。

強すぎず、弱すぎず
AIは作り方によってはすごく強いAIができたり雑魚なAIができたりします。
強すぎるAIを作ってしまうとプレイヤーの心が折れてしまい、弱すぎるとプレイヤーにすぐ飽きられてしまいます。
これではゲームとしてあまり良くないものになります。
きちんと調整した、ほどほどの強さのAIがちょうど良いのです。


今回の話はここまでです。


次のゲームは何作るか決めてませんが、工大祭にはきっと何かできてると思うのでお楽しみに。
ではでは _(:3」∠)_

【CG^2】遺伝的アルゴリズム

CG^2所属のysk(@yskcon)です.
自己紹介として作ったゲームの紹介をしておくと,去年の工大祭(東工大の学園祭)ではFlashの3Dシューティング「テックスペース」を制作・展示しました.
ysk_techspace
図1.テックスペース

 
突然ですが,今回は「遺伝的アルゴリズム」について説明します.

遺伝的アルゴリズムとは,生物の遺伝の仕組みを再現することで問題のより良い解を求める手法です.
適当な解に対して特定の操作を繰り返していくとより良い解が得られます.
解の「良さ」を数値化でき,かつ病的でない問題であれば適用可能です.

具体例として,「理想的なテックちゃん」を求める問題を考えます.
テックちゃんには,遺伝子として「髪」,「目」,「口」,「アクセサリー」などの要素があるものとします.
また,理想的なテックちゃんは言うまでもなく「水色でアホ毛つきの髪」,「水色の目」,「V字形の口」,「片耳ヘッドフォン」です.
(今回は最適解が既知なので遺伝的アルゴリズムを用いる必要はないのですが,実際には未知の問題に対して適用します)
ysk_gene_idol
図2.理想的なテックちゃん

テックちゃんの「理想度」は,テックちゃんがどれだけこの要素を持っているかどうかで判断することにします.

まず,ランダムにテックちゃんの集団を生成します.
ysk_gene_group
図3.ランダムなテックちゃん集団

次に,「選択」 「交叉」 「突然変異」の3つの手法を適当に用いて,新たな集団を生成します.

「選択」では,既存の集団から理想度が高そうなテックちゃんを1人ランダムに選んで新たな集団に加えます.
ysk_gene_move
図4.選択

「交叉」では既存の集団から理想度が高そうなテックちゃんを2人ランダムに選んで両方の遺伝子をランダムに持つ新たなテックちゃんを生成し,新たな集団に加えます.
ysk_gene_cross
図5.交叉

「突然変異」では既存の集団から理想度が高そうなテックちゃんを1人ランダムに選んで一部の遺伝子をランダムに変化させ,新たな集団に加えます.
ysk_gene_mutant
図6.突然変異

これらの操作により,どちらかといえば既存の集団よりも新たな集団のほうが個々のテックちゃんの理想度が高くなります.
そしてこれを複数回繰り返すと,平均的にはより理想的なテックちゃんの集団が得られます.
ysk_gene_improve
図7.より理想的なテックちゃんの増加



本当は新歓向けに遺伝的アルゴリズムを使ったタワーディフェンス風のゲームでも作ろうかなと思ったのですが,ネタがまとまらないのと尊敬すべき先輩の作品の1つとかぶるので結局日の目を見ることはありませんでした.
ですが,今年の工大祭あたりまでにはなにかそういうようなゲームを作りたいと考えています.
それでは.

※ 「テックちゃん」は工大祭の公式マスコットキャラクターであり,一切の著作権は工大祭実行委員会に帰属します.

【CG^2】Boidsアルゴリズムを用いたゲーム制作

どうも、卒論提出まであと10日。ニックさん(@nikku12312)です。
本日はロボット技術研究会のゲーム制作集団であるCG^2に所属している私が
卒論からの現実逃避に作っているゲームの進捗についてお話します。

現在制作しているのは、「Boidsアルゴリズムを用いたRTS(リアルタイムシミュレーション)」です。
開発環境はJava+OpenGLで、実装はJavaScriptを用いてスクリプトを書いています。

ss_5

簡単に言うと、上の画像のように個々のオブジェクトが
相互作用を及ぼし合って群れをつくるゲームです。
現在は群れを作って、群れを指定ライン上を移動させることができるようになりました。

群れの生成として使っているのは「Boidsアルゴリズム」と呼ばれる手法です。
ss_9
簡単には個々のオブジェクトが
  • 結合
  • 整列
  • 引き離し
という3つの簡単なルールに従って移動するというようなアルゴリズムです。
この3つのルールの重み付けを適当に行うことによって、個々の動きは単純でありながら
複雑な群れの挙動を表すことができるようです。

調べてみると合意形成やら非平衡統計力学やらなかなか奥の深そうなアルゴリズムですが、
ゲームなんで難しいことは抜きにしてとりあえず動くものを作ってみようと思います。


現在はBoidsの群れ形成は大凡終わったので、
2Dマップとして作られた地形情報を3D表示することに挑戦しています。

ss_8

4月のロ技研の新歓展示には形になっていると良いですね。
あと卒論も無事に書き終えられたら良いですね。

CG^2紹介

初めまして、CG^2所属のおーま(@OMA_st)です。
CG^2とはロ技研内の研究室の一つであり、ゲーム製作をしている研究室です。
メンバーは各々でゲームを製作しており、それぞれの趣味で様々なジャンルのゲームを作っています。
去年の学園祭ではパズルゲームや3DSTG、ブロック崩し、横スクロールアクション、弾幕STG、ローグライクRPGを展示していました。

今回は僕が去年製作したゲームと、現在製作中のゲームを紹介させていただきたいと思います。

ウィルスバスターテック

これがゲームのスクリーンショットです。弾幕STGです。
なんとなくデジタルっぽいゲームが作りたいなぁと思い作り始めました。
製作を始めたのが夏休みの半ばであったこともあり、学園祭まで時間があまり無かったのでステージは一つだけの非常に単純なゲームとなっています。
その代わりという訳でもないですが、最初から学園祭で展示する用に作っていたので学園祭向けの少し変わったゲームシステムになっていました。
特徴として一つ目に、プレイヤーレベルシステムがあります。これは、学園祭には子供から大人まで老若男女多種多様な人が訪れることを想定し、その誰もが楽しく遊べる適した難易度になるよう、ゲーム中でプレイヤーの腕に合わせて動的に難易度が変化するシステムです。
そして二つ目に、ゲームオーバーをなくしたことがあります。学園祭などではゲームをプレイする人はいても 、このゲームをプレイするために来た!という人は中々いません。そのため、ゲームオーバーしてしまうとそこでやめてしまうことが多くあります。個人的には折角作ったゲームなので最後までやって欲しいので、その欲求を満たすために採用された自己満足のシステムです。
結果としてプレイヤーレベルは予想していたよりはちゃんと働き思ったより良い感じでした。思いつきで実装した機能なのでレベルの決定方法などまだまだ甘いところがあるので、次にやる時は様々な要素をもう少し厳密に設定したいです。

現在はRTSを作っています。これまた何となく作りたくなったので作り始めただけなのですが。
作っているとは言っても、まだゲームのシステムですらはっきりとは決まっていない段階であり、ゲームの基礎的な部分を製作しながらどんなシステムにしようかとのんびり考えております。
完成までにとりあえず必要になりそうなところだけを考えてみるだけでかなりの作業量になりそうであり、また、初めて作るジャンルのゲームなので作り方が合ってるのか確信も持てず今から完成が若干不安でもありますが、頑張っていこうと思います。

今回は以上です。これからもゲームの製作状況などを報告させていただきたいと思いますので、どうぞよろしくお願いします。 
ギャラリー
  • ABUロボコン結果報告
  • スマホから部屋の電気をつけてみた
  • MakerFaireTokyo2017に出展します
  • MakerFaireTokyo2017に出展します
  • MakerFaireTokyo2017に出展します
  • MakerFaireTokyo2017に出展します
  • MakerFaireTokyo2017に出展します
  • MakerFaireTokyo2017に出展します
  • たのしいロボット帝国 製作物紹介
記事検索
最新コメント