ヘキサ日記 Blog

 

2017年1月24日

いまが一番育つとき

        

やられてます。
TVでは『最強』という名前も付いてしまった寒波
そんな寒さにやられっぱなしの日々でございます!
こんにちは、ハラです。

 

私は、割と年賀状が好きだったりします。
そのせいか、メールも併用するのですが、比重としては年賀状の方が多いです。
1月下旬ではありますが、その年賀状での話を少々。

 

既に社会に出てから両手では数えられない年数が過ぎてますが、
その間、学生時代の先生には年賀状を出し続けています

 

年賀状というと、自分の近況の写真だったり、一言添えて合ったりと、それぞれの個性が出ます。
その中でも、先生からの年賀状は、友人や先輩後輩とは違う個性が出ていて、
毎年ちょっと興味が沸く瞬間でもありました。

 

その先生達からの年賀状。
今年は、その中の1通に印象深い1文がありました。

 

 

『いまが一番育つとき。頑張れ。』

 

 

元の文体は少し違うのですが、要約するとこんな感じ

 

私自身は、とある俗説で言うと既に定年を迎えている年齢  
以前と比べると色々と衰えを・・・・・さほど感じてはいないのですが、
先々にそういう時が来るかなぁと思う時が無いことも無い。

 

そんな自分としては、染み渡る1文でした。

 

弊社のブログを読んで頂けるような人には言わずもがな、かもしれませんが、
日々勉強&進化が求められるゲーム開発でございます

 

先生からの言葉が、ゲーム開発ではなくもっと別なことを指しているかもしれませんが・・・
今年は、この言葉を励みにしてみようかと思います。

 

 

いまが一番育つとき。

 

うん、なんとなくそんな気がしてきた


2017年1月23日

良くしていこう!

        

こんにちはソーテイです

 

久々のblogなので少し昔の話題となりますが、みなさんはgoogle翻訳使っていますか?

 

昨年末にgoogle翻訳の精度が向上したと話題になりました。

Google翻訳、新システムで精度向上 Googleが正式発表

 

私はgoogle翻訳をよく利用するので翻訳が改善するのは嬉しい限りです。

 

ただプログラム関連のドキュメントを翻訳する場合

専門用語含めて正しく翻訳されないケースがままあります

 

仕方ないので自分で修正をかけることになりますが

その際google翻訳のページ内で編集&フィードバックを送信すると

Google翻訳コミュニティのリンクが表示されます。

 

先日長文の翻訳中に気になってこの招待リンクに飛んでみました

翻訳コミュニティは画像のようなページになっています。

翻訳

 

ここでは未登録のワードに対する翻訳を提案したり

他の方の翻訳が適正かどうかを判定できるため

多くの知見を翻訳改善に利用できるようになっています

 

さらに翻訳/検証を多くこなすとマイバッヂ(実績のようなもの)がもらえますので

積極的に活動するモチベーションにもつながります

 

個人的にはタグ情報などとセットで翻訳できるようになると

希望するドキュメントに応じた精度に近づくと思います

何にせよ頻繁に利用する機能ですし、より良くなっていってほしいですね

 

自分たちが作るゲームも過去の作品より良くなるよう意識していきたいと思います

 


        

こんにちは

チャラメガネです

 

今日は寒いですね

 

チャラメガネは寒いのが苦手なので、こんな日は外に出たくないです

しかし、家にこもりすぎるのも良くないので、

体を動かして温まりたいところです

 

 

 

 


 

 

そういえば、以前、LARPという体感型ゲームを紹介させていただきました

LARPのチャンバラ戦闘って、結構ハードなので、温まるんですよ

戦闘のある体感型ゲームを体験できる場所は少ないので

改めておすすめいたします

 

 キャプチャ

 

 


 

 

戦闘のある体感型ゲームと言えばサバイバルゲームも有名ですよね

これも温まりそうです

ただ、「BB弾痛そうだなー」「怖いなー」「子供にはやらせたくないなー」という印象もあったりします

そういった方向けだと、アメリカ発祥のNerfというトイガンが発売されています

児童向け玩具なのですが、SFチックなデザインと、その安全性から、大人にも人気があり、

Nerfを使ったサバイバルゲームを行うこともあるようです

(ちなみにチャラメガネも一丁持ってます

 55196110-8BD3-40CE-9554-515661BC46FC

 

 

 


 

 

あとは、新宿にinSPYreという謎解き体感型アトラクションがあります。

ダウンロード

持ち時間約20分の間に、施設内に設置された謎を解いていくゲームです

限られたヒントを元にずっと歩き回っているので、これが意外と体力を使うのです

チャラメガネも一度プレイしたことがありますが

残念ながらクリアならずでした

が、汗が滲むくらいには温まりました

次こそは、クリアしたい

 

 

 


 

 

さて、これだけ体を動かせば、寒い外でもへっちゃらですかね

 

 

うーん、やっぱり寒い

部屋でゲームしよっと

 


        

こんちゃーす、最近肩こりに悩まされているゆっきーです

 

そう、最近肩やら首やら腰やらが痛くて悲しい思いをしていました。

風の噂で聞いたのですが、体が硬いとそういうのになったりするとかしないとか。

何を隠そうこの私、体ガッチガチやぞ

 

というわけで先週から始めました。

「体が硬い人でも必ず開脚が出来るようになるストレッチ」

ババーン

 

なんか、4週間で股割りできるという話を聞いたので、毎日継続中です。

先週の月曜日から始めて1週間、みるみる内に変化が…

 

わからない

 

いや、効いてる感じはするんですよね。

気持ち足開くようになった気がするし。

うおー!めっちゃ体ふにゃふにゃになったぞー!みたいな感じはない。

まぁそんな急にフニャフニャになったら怖いけども。

 

デスクワークをしてると体硬くなりがちですが、これで体柔らかくなるといいなー。

次のブログで報告しようと思っているので期待しておいてください。

フニャフニャになってたら皆さんも是非オススメしたいですね。

 

まぁ4週間で一段落みたいな感じですが、次僕がブログ書くの3ヵ月後とかですけどね。

 

ではでは、また次の機会にお会いしましょう。

ゆっきーでした


        

厳冬の候、いかがお過ごしでしょうか。
たけき者も遂にはミッツです

 

いわゆる「ゲームの作り方」について学ぶための本というと、
一言では表せず、実態はとても色んな本があったりします
例えば……
 ・キャラの3Dモデル作成の本、
 ・レベルデザインの本
 ・ゲームクリエイターの仕事に関する教本
 ・ゲームアイデアのネタ本
 ・ゲーム業界の巨匠たちの体験録
 ・プログラム言語やグラフィックエンジンの本
 ・RPGツクールの使い方の本
これらは総じてどれも立派な「ゲームの作り方」の本です。
そしてどれも全然違うアプローチでゲーム作りを紹介します。

 

あまり、扱っている書籍が少ない分野の1つに
いわゆる「ルールの作り方」を扱った本というのがあります
自分なんかはよくそういう本を本屋で探してみたりするのですが、
中身を読んでみると、ちょっと知りたかったこととは違った内容で、
う~んと落胆することも多い次第です。

 

今回紹介する『Half-Real』という本は、昨年発売していた
数少ないゲームルールにフォーカスした珍しい本の1つなのです 
よっ、待ってました

 

20170118_image01
※タイトルのせいでSF小説に見えて、表紙帯がないとゲーム開発の本とも分からない

 

 

実は、この本よりも以前に、ゲームルールの作り方を事細かに扱った
有名な本に『Rules of Play』というのがありました。
これはこれでゲームのルールをとても深いところまで掘り下げた
大切な本なのですが、高額(上下で8800円)、その殺人的な分厚さと
難解でモゴモゴした気持ちになる文体、縦書きという手引書に珍しい
書式と、なかなか精神破壊してくる禁書でもあります
はたして、何人のゲームデザイナーが、この禁断の知識に手を出し
心折られてきたことでしょうか…。
私自身、下巻はもう頭に入りきってなかったような気がします

 

20170118_image02 
※厚さに加えて上下巻の圧倒的『Rules of Play』。腕につけて盾によし、浅漬けの漬物石によし

 

 

そこで、前述の『Half-Real』なのですが、
こちらは『Rules of Play』ほど分厚くないですし、また1冊完結です。
それに、『Half-Real』の前半部は『Rules of Play』でも扱った内容を
今風に整理したのがメインで、内容もヒケをとらない深さでした。
特に「ゲームに対する新定義」は、これまでに方々の論文で提唱
されていたものを整頓して6つに総括したものですが、
いわゆる「ゲーム性」という謎単語で終始しない、とても明確な形に
整えられていて、おおむね腑に落ちる気持ちの良いものでした。

 

また、『Half-Real』が従来のゲームデザインの本とけっこう珍しげな
スタンスを取っているのは、本書が「コンピュータゲームにおける
ルール」をかなり専門として扱っている点でしょう
(他のゲームデザイン本は、古典ということもあってアナログを主軸に
デジタルを一分野として扱った書き方が多いのです)。
なかでも、『Half-Real』のタイトルのとおり、コンピュータゲームが作る
“半分現実、半分虚構”というゲーム内フィクションへの考え方は、
ルールを作る人だけでなく、ゲームのUIをデザインする人にとっても
一読してみてほしいと思います。
ゲーム画面の3Dフィールド上で光る青い矢印が納得できるものとして
映るか、違和感のあるものとして映るか様々な角度で論じてます。
このようなコンピュータゲームにおけるフィクション作りの心構えや
捉え方は、既存作品にはない新たなUIデザインをこねくりあげる上で
役立つかもしれません。

 

この本は、他のゲームの作り方の本のように、いざゲームを作る時に
すぐ役立つようなものではありません。
しかし、ゲーム作りによくある
 ・お約束を無自覚に踏襲してしまっていること
 ・なぜか面白くならないゲームのルール
などを振り返り、正しい形か吟味する時に考えを明確にしてくれます。
こうした本を読んでおいて、自分の中にある「ゲームではこれが当然」を
一度きちんと整理しておくのもいいでしょう


        

いきなりの激強な寒波いかがお過ごしですか?

家の中で息が白いという体験を

全力で子ども型オサえもんと楽しんでいる

う~ふ~ふ~、ぼ~く、オサえもんです

 

昨日のブログでも書かせていただきましたが

皆さん、先日発表されました

SWITCHはチェックしましたか?

 

コントローラが小さめで子どもも持ちやすそうだな

旅行等、渋滞のお供になりそうだな

シガーソケットで充電できたりするかしら?

そんなことを考えておりました

 

母ちゃん、これは買ってくれませんかね?

買ってくれませんかね!!!

 

そしてSWITCHから離れ、

オサえもんは

去年一つのあやまちを犯していましたことを、

ここに懺悔します…

 

オサえもんと言えばレトロゲーム

そう、去年の後半に発売されました

社長の松下も入手した(というか社内のミドル層は大体買った)

ニンテンドークラシックミニ ファミリーコンピュータです

 

いやね、ちゃんと予約してたの、

某密林のごときネットショッピングさんで

 

予約してから心待ちにしていたある日
他にこっそりフィギュア(エッチなのじゃないよ)予約してたんですが
お小遣いと相談して、ふむ、一旦断念しよう

とキャンセルしたところ

あれ?

フィギュア残ってる、遅延とかあるのかな

あれ?

なんか、別なの消えてる

消えてるー!!!

クラシックミニをキャンセルしちゃった!

なんとオサえもん、発売日に入手しそびれてしまいました

 

あわてて再予約しようとするも

時すでにタイムアウト…

 

なんでなん?

なんでなーーーん!?

 

レトロゲームの神よ、私に試練をお与えですか?

今買おうとするとちょっとプレミアついちゃってますね…

 

それでも頑張って探してみると

あれ、安いじゃん、売ってるじゃーーん

と思ったら

赤白で色味は一緒で形も似てる

だけど微妙に違って、ゲームが100種類以上入っているやつ!

危うく2次災害を起こしてしまうところだった

 

く、再販はまだか…

実はここに売ってるよとか、情報は随時募集してマス

 

ほんとは悔しいから

このまま、怒りにまかせた

クラシックミニ収録タイトルのレトロゲーム探訪しようと思ったんですが

長くなっちゃったんで

ちゃんと入手したらやります

やりますよぉ

期待しててくれよな!オサえもんとの約束だぞ

 

あと、ここぞという時の指さし確認な!

これもオサえもんとの約束だぞ


2017年1月16日

SWITCH発表!

        

こんにちは。イノウエです。

 

本日は、ゲーム業界的には触れないわけにはいかないネタでいきます
(ブログに書くネタが来てよかったー!

 

ということで、SWITCHの発表、ありましたね
発売日や価格、ソフトラインナップが出たことで、
お財布との相談を始めた方も多いのではと思います

 

個人的には、ローンチタイトルで子供と一緒にできそうな
「1-2-Switch」と「SUPER BOMBERMAN R」を購入予定です
自分用にゼルダも買うし…
マリオカートとスプラトゥーンも発売されたら買うよなぁ…

 

と、なかなかの誘惑されっぷりに家計が危ういです…
直近発売以外の物でも好きなタイトルがあり、
これはもう頑張って稼ぐしかないですねという状況。。
(予算的には辛いですがゲームソフトの充実は嬉しいという複雑なゲーマー心

 

ハードウェアとしては、据え置きと携帯両方の特性を兼ね備えるという、
面白い試みになっていますね
家族がプレイする事を考えたら、お父さんは通勤用として持っていけないのかな…
という一抹の不安はありますが、その辺は、
父の仕事はゲーム開発!だからこれは勉強のために必須なんだ!
と説得を試みます。
こういう時、ゲーム業界にいるといいイイワケが出来て便利です

 

という事で、発売日の3/3を楽しみに待っています


        

皆さん、こんにちは。店長です

 

以前書いた記事 League of Legends の世界大会(WCS)を紹介させてもらいました。

 

今回は、その記事に続いて日本リーグの紹介をしたいと思います。

 

LJL 2017 Spring Split

日程:2017年1月20日(金) ~ 3月25日(土)

 

LJLはRiot公式の日本リーグです。

このリーグを勝ち抜いたチームが世界大会へのチケットを手に入れることが出来ます。

 

そして、去年のSummer Split では

Rampageが1位。DetonatioN FocusMeが2位。

という結果になったのですが、

今年はなんと、

1月20日の初戦でこの2チームがぶつかります

いきなりクライマックスな展開です

 

オフシーズンの間に各チーム、選手の入れ替えや新規加入があったり、

去年とはまた違った環境になっていることもあって、どういう展開になるのかすごく楽しみです。

 

 ますます盛り上がっているe-Sports界隈。

 

皆さんも是非観戦してみてください


2017年1月12日

123D MAKEとFusion 360

        

こんにちはKayanuma.です。
今回は工業系のCGソフト、CADの話です。

オートデスクの製品で123D Makeというアプリがあります。
170112_01_cadサンプルのサイの顔

これはすでに出来上がっている3Dモデルをペーパークラフトなどに利用しやすい形態に加工するソフトウエアです。(と解釈してますけども)

元のモデルを
170112_02_cadこのようにスライス状にしたり、
170112_03_cad折り紙のようなペーパークラフトに展開したり。

この様に作成した展開図をベクターでエクスポートできます。

紙に印刷してハサミで切りだしてもいいですが、レーザーカッター等で利用すると絶大な力になります。
しかも無料!で利用できるのでまさに神ソフト。なのですがこんなニュースが

 

123Dシリーズ終了
http://blog.123dapp.com/2016/12/important-news-about-the-next-chapter

123Dシリーズは3月で終了、そのあとは「Tinkercad」「Fusion 360」「ReMake」等に移行
だそうです。
123D Makeはネイティブのアプリケーションですが、特定の機能を使う際にネットにアクセスします。
サービスが終わったらおそらく使えなくなるでしょう。

 

なので今回はFusion 360になれるためちょっと触ってみました。

・Fusion 360
これは有料のソフトなのですが、「教育関係では無料で利用できる」とあります。
なるほどしかし、そうか・・学生じゃないしな・・月々5400円はなかなかのハードル。と思いつつ体験版のリンクをたどってみると
170112_04_cad
趣味、スタートアップ、非営利なら無償との表示が!(助かった)

アカウントを登録して起動します。170112_05_cadかっこいいスプラッシュ
一見してメニューがわかりやすいです。とりあえず円柱を出したりしてみて
170112_06_cad
フィレット的な加工も一発で綺麗にできました。
洗練されたインタラクティブ且つ瞬時に確認できるので使いやすいです。
170112_07_cad170112_08_cad
円柱をねじにしてしまいます。
ねじに見える風ではなく、規格に則ったちゃんとしたねじが作成されます。
さすがCAD。
170112_09_cad170112_10_cad
ブーリアンで演算してみたりしても軽くて正確。
プレビューのレンダリングもやたらに綺麗。

170112_11_cad170112_12_cad

3Dマウスも完全対応していました。170112_13_cad
↑(i5の内蔵グラフィックスですが特に重さは感じませんでした)

CADとして非常に洗練されていると感じました。趣味でこのようなものに触れるなんて幸せな時代ですね。

昔は・・(ry

 


2017年1月11日

32とか16とかその6

        

こんにちは。

 

シュンスケです

 

前回、どれがキレイ(元画像に近い)なのかをプログラムで判断できれば、

数あるパターンから最適なものが見つけられるのではといった話がありました

 

そこで、今回のアプローチは、GA

 

ガーディアンエンジェルではありません。

ギャラクシーエンジェルでもありません。

 

Genetic Algorithmつまり、「遺伝的アルゴリズム」です

 

大まかに説明すると、とある解を求めるにあたって、生物の進化のように、

解候補たちを組み替えながら、正解に近いものは残して、遠いものを淘汰し、

時には突然変異を起こすといった感じで、多くのパターンからより良いものを

導き出す処理方法です

 

と、ここまで来て気付く方も多いと思いますが、正解に近いかどうか、それが今回でいうと、

元画像に近いかどうかということです。

 

その比較方法でお手軽なのがPSNR値を使うものなようなので、今回はそうします。

(ただし、人間の目を相手にするとなると、問題は多いようです)

 

そして今回、果敢にも全ピクセルの全チャンネルに関して、組み換え対象として

実装しました。

つまり、膨大なパターンがあるということです

 

さて、以下実装です。

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;

namespace Pic32bitTo16bitGA
{
	class Program : Form
	{
		struct Gene
		{
			public static void cross(ref Gene a, ref Gene b)
			{
				if( a.buf == null || b.buf == null ) return;

				// 2点交叉
				var r = new Random();
				var index1 = r.Next(0, (a.buf.Length - 1) / PIXEL_BYTES);
				var index2 = r.Next((index1 + 1) / PIXEL_BYTES, b.buf.Length / PIXEL_BYTES);
				for( int i = index1; i < index2; ++i ) {
					var tmp0 = a.buf[i + 0];
					var tmp1 = a.buf[i + 1];
					var tmp2 = a.buf[i + 2];
					var tmp3 = a.buf[i + 3];
					a.buf[i + 0] = b.buf[i + 0];
					a.buf[i + 1] = b.buf[i + 1];
					a.buf[i + 2] = b.buf[i + 2];
					a.buf[i + 3] = b.buf[i + 3];
					b.buf[i + 0] = tmp0;
					b.buf[i + 1] = tmp1;
					b.buf[i + 2] = tmp2;
					b.buf[i + 3] = tmp3;
				}
			}

			// コンストラクタ
			public Gene(int w, int h)
			{
				buf = new byte[w * h * PIXEL_BYTES];
				psnr = -1;
			}

			// ランダムで埋める
			public void fillRand()
			{
				// ランダムで色を埋める
				var r = new Random();
				r.NextBytes(buf);
			}

			// PSNRを算出して保持
			public void calcPSNR(byte[] org)
			{
				psnr = -1;
				if( org == null || buf == null || org.Length != buf.Length || org.Length == 0 ) return;

				// MSE算出
				ulong mse = 0;
				for( int i = 0; i < org.Length; ++i ) {
					long d = (buf[i] - org[i]);
					mse += (ulong)(d * d);
				}
				mse /= (ulong)org.Length;
				if( mse <= 0 ) return;

				// PSNR算出
				psnr = (10 * Math.Log10((double)(255 * 255) / (double)mse));
			}

			// 突然変異
			public void mutation()
			{
				if( buf == null ) return;

				var r = new Random();
				var index = r.Next(0, buf.Length / PIXEL_BYTES);
				buf[index + 0] = (byte)r.Next(0, 256);
				buf[index + 1] = (byte)r.Next(0, 256);
				buf[index + 2] = (byte)r.Next(0, 256);
				buf[index + 3] = (byte)r.Next(0, 256);
			}

			// 値を設定
			public void set(Gene g)
			{
				if( g.buf == null ) return;

				if( buf == null || buf.Length != g.buf.Length ) {
					buf = new byte[g.buf.Length];
				}

				Array.Copy(g.buf, buf, buf.Length);
				psnr = g.psnr;
			}

			public byte[]	buf;
			public double	psnr;
		}

		private const int PIXEL_BYTES				= 4;								//!< 1ピクセルあたりのバイト数

		// エントリポイント
		static void Main(string[] args)
		{
			// 入力受付
			Console.WriteLine("please input picture path...");
			var srcPath = Console.ReadLine();

			// ファイル存在確認
			if( !File.Exists(srcPath) ) {
				Console.WriteLine("file not exists.");
				return;
			}

			// 画像読み込み
			byte[] buf = null;
			int width = 0;
			int height = 0;
			using( var img = Image.FromFile(srcPath, true) as Bitmap ) {
				if( img == null ) {
					Console.WriteLine("file type is not support.");
					return;
				}
				// メモリに保持
				var dat = img.LockBits(new Rectangle(Point.Empty, img.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
				width = img.Width;
				height = img.Height;
				buf = new byte[width * height * PIXEL_BYTES];
				Marshal.Copy(dat.Scan0, buf, 0, buf.Length);

				// 解放
				img.UnlockBits(dat);
			}
			if( buf == null ) {
				Console.WriteLine("buf load failed.");
				return;
			}

			// フォーム開始
			Application.Run(new Program(ref buf, width, height));
		}

		// コンストラクタ
		public Program(ref byte[] buf, int w, int h)
		{
			if( buf == null ) return;

			_org = buf;
			_buf = new byte[buf.Length];
			_img = new Bitmap(w, h);

			// 第1世代生成
			for( int i = 0; i < _curGen.Length; ++i ) {
				_curGen[i] = new Gene(w, h);
				_curGen[i].fillRand();
			}

			// フォームのサイズ設定
			ClientSize = new Size(w, h * 2);

			// フォント作成
			_font = new Font(Font.Name, 10);
			_fontBrush = new SolidBrush(ForeColor);

			// 描画更新開始
			_sec = 0;
			_refreshTimer.Interval = 1000;
			_refreshTimer.Tick += new EventHandler(refresh);
			_refreshTimer.Start();

			// 処理更新開始
			_updateTimer.Interval = 1;
			_updateTimer.Tick += new EventHandler(update);
			_updateTimer.Start();
		}

		// 描画時処理
		protected override void OnPaint(PaintEventArgs e)
		{
			base.OnPaint(e);
			if( _img == null ) return;

			// 元画像描画
			if( _org != null ) {
				var newDat = _img.LockBits(new Rectangle(Point.Empty, _img.Size), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
				Marshal.Copy(_org, 0, newDat.Scan0, _org.Length);
				_img.UnlockBits(newDat);
				e.Graphics.DrawImage(_img, 0, 0);
			}

			// 生成画像描画
			if( _buf != null ) {
				var newDat = _img.LockBits(new Rectangle(Point.Empty, _img.Size), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
				Marshal.Copy(_buf, 0, newDat.Scan0, _buf.Length);
				_img.UnlockBits(newDat);
				e.Graphics.DrawImage(_img, 0, _img.Size.Height);
			}

			// フレーム数表示
			e.Graphics.DrawString("sec : " + _sec, _font, _fontBrush, 0, 0);

			// 世代数表示
			e.Graphics.DrawString("gen : " + _genCnt, _font, _fontBrush, 100, 0);
		}

		// 描画更新
		private void refresh(object sender, EventArgs e)
		{
			// 保持したトップを描画バッファに設定
			if( _topGen.buf != null ) {
				Array.Copy(_topGen.buf, _buf, _buf.Length);
			}

			// 画面をリフレッシュ
			++_sec;
			Invalidate();
		}

		// 処理更新
		private void update(object sender, EventArgs e)
		{
			// 評価値算出
			for( int i = 0; i < _curGen.Length; ++i ) {
				_curGen[i].calcPSNR(_org);
			}

			// 評価値でソート
			Array.Sort(_curGen, (a, b) => {
				if( a.psnr == b.psnr ) return 0;

				return (b.psnr > a.psnr) ? 1 : -1;
			});

			// 1位を保持
			_topGen.set(_curGen[0]);

			// 上位いくつかはそのまま残す
			var newIndex = 0;
			for( int i = 0; i < 2; ++newIndex, ++i ) {
				_nextGen[newIndex].set(_curGen[i]);
			}

			while( newIndex < _nextGen.Length ) {
				// 交叉対象1を選出(上位が選ばれやすいように)
				_cross1Buf.set(_curGen[0]);
				for( int i = 1; i < _curGen.Length; ++i ) {
					var rate = _selectRnd.Next(0, 100);
					if( rate < 10 ) {
						_cross1Buf.set(_curGen[i]);
						break;
					}
				}

				// 交叉対象2を選出(上位が選ばれやすいように)
				_cross2Buf.set(_curGen[1]);
				for( int i = 2; i < _curGen.Length; ++i ) {
					var rate = _selectRnd.Next(0, 100);
					if( rate < 10 ) {
						_cross2Buf.set(_curGen[i]);
						break;
					}
				}

				// 交叉
				Gene.cross(ref _cross1Buf, ref _cross2Buf);
				_nextGen[newIndex].set(_cross1Buf);
				++newIndex;
				if( _nextGen.Length <= newIndex ) break;

				_nextGen[newIndex].set(_cross2Buf);
				++newIndex;
				if( _nextGen.Length <= newIndex ) break;

				// 突然変異対象を選出
				var mutIndex = _selectRnd.Next(0, _curGen.Length);
				_nextGen[newIndex].set(_curGen[mutIndex]);
				_nextGen[newIndex].mutation();
				++newIndex;
				if( _nextGen.Length <= newIndex ) break;

				// そのままコピー
				var copyIndex = _selectRnd.Next(0, _curGen.Length);
				_nextGen[newIndex].set(_curGen[copyIndex]);
				++newIndex;
				if( _nextGen.Length <= newIndex ) break;
			}

			// 次世代を現世代に移す
			for( int i = 0; i < _nextGen.Length; ++i ) {
				_curGen[i].set(_nextGen[i]);
			}
			++_genCnt;
		}

		private Bitmap	_img			= null;
		private byte[]	_org			= null;
		private byte[]	_buf			= null;

		private Timer	_refreshTimer	= new Timer();
		private Timer	_updateTimer	= new Timer();
		private Font	_font			= null;
		private Brush	_fontBrush		= null;
		private int		_sec			= 0;
		private int		_genCnt			= 0;

		private Gene[]	_curGen			= new Gene[64];
		private Gene[]	_nextGen		= new Gene[64];
		private Random	_selectRnd		= new Random();
		private Gene	_cross1Buf		= new Gene();
		private Gene	_cross2Buf		= new Gene();
		private Gene	_topGen			= new Gene();
	}
}

 

このままでは処理速度に難がありそうですが、実行してみます

 

ウィンドウの中で、上が目指す画像で、下が完全ランダム値からはじめて、

最終的には同じ絵になって欲しい部分です。

20170111_01

はじめの方

20170111_02

 

約50分後

 

う、うーん…ダメだ

さすがにパターンが多すぎたようです。

それに、交叉や突然変異の確率、評価処理もかなー、 見直しが必要そうです。

というか、そもそも全ピクセルランダムスタートで辿り着けるのか。。。

 

ただ、薄っすらと緑っぽく近づいてきてはいるので、アプローチの方向はまだ捨てずに

おこうと 思いますが、今回はここまで

 

では


ヘキサブログ ピックアップ



過去の日記はこちら

2017年1月
« 12月    
 1
2345678
9101112131415
16171819202122
23242526272829
3031