mieki256's diary



2012/08/02(木) [n年前の日記]

#1 [javascript] 長方形の詰め込み問題についてまだまだ実験中

とりあえず、BLF法(Bottom-Left-Fill)については動いた。

_長方形詰込み問題のテスト用ページ (2013/10/06 リンク先をDropboxから自宅サーバ内ページに変更)

最初、 _こちらの講義資料のページ のサンプルプログラムを、意味も分からず書き写したのだけど。説明用pdfを、自分が分かるように写経(?)したら、何をやってるか理解できた。写経したpdfは以下。

_BL安定点候補についての説明pdf
_BL法チェックについての説明pdf

ただ、問題があることも分かったわけで。以下が結果画像だけど。

BLF法で詰め込んだ際の結果画像


赤い点が、BL安定点候補の座標。 *1

明らかに、「そこにはもう矩形が置けないだろう… (´・ω・`)」という場所に、BL安定点候補が作られてる。

そして、この全ての候補群に対し、矩形が置けるか、置いたとして他の矩形と重なってないか、てなことを判断していくわけだから…。矩形の数が少ない場合は、他の方法と比べてそんなに処理時間は違わないのだけど。配置済みの矩形が増えるにつれて、どう見てもモリモリと遅くなっていくはずで。

どうせ扱う矩形数は少ないのだからこれでいいじゃん、という気もするのだけど。しかし、もうちょっとどうにかならんか、BL安定点候補を減らせないか、という気もしてきたり。

さて、どうすればいいんだろう?

ちょっと思いつくのは…。 とか。でも、前者はともかく、後者はかえって遅くなるんじゃないのかという気も。新しく置いた矩形の上下左右に4回その処理を行うから、4回ソートすることになるだろうし。うーん。

とんでもない勘違いをしてた。 :

BLF法で矩形数を増やして実行すると、矩形数が増えるにつれて遅くなるなあ、と思っていたのだけど。ふと、BL安定点候補の描画を無効にしてみたら、サクサクと処理が進むように。内部計算が遅いのではなくて、canvasの描画処理が遅かったのか…! トホホ。

それはそれとして。矩形を一つ置いて、BL安定点候補群を得るたびに、それら候補群の1つ1つが、配置済み矩形の中に入っているか調べて、入っているなら除去するようにしてみたり。…画面に表示される候補群がグンと少なくなった。

JavaScriptの乱数は初期化ができないのか。 :

Math.random() に種を与えて初期化できないのかな、初期化できれば毎回同じランダムな矩形群が得られて実験しやすいのだけど。と思ったけれど、JavaScript の乱数って種を与えることはできないようで。

ということで、 _Mersenne Twister in JavaScript (mt.js) を使わせてもらったり。おそらくこれなら、種を与えることで、乱数の再現性が得られるだろうと。

乱数というか、疑似乱数だけど。

*1: 赤い線は、BL安定点候補が、どの矩形と判定し合ってそういう結果を出したのかを示す線。…BL安定点ってのは、Bottom(下)にもLeft(左)にも、それ以上矩形を配置しようがないだろう、と思われる点のこと。自分の作ったページは上下が逆なので、上にも左もそれ以上を矩形を配置できないと思われる点が、BL安定点の候補、になる。そして、このBL安定点候補の一つ一つに対して、まだ配置してない新しい矩形を置けるかな? 置けないかな? と判別処理をしていくことで、詰め込みができるわけで。

以上です。

過去ログ表示

Prev - 2012/08 - Next
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project