DensanWiki
プロコン
跡地。

え?今日再試合!?

というわけで再試合があった。
結果だけ書くと6位。予選落ち。

敗因

語られない伝説

総評

もうちょっとルールを考えてほしかったかな。。。(全体的に浅い)
みんな経路がかぶるかぶる。。あとは運という。。。
ま、エキシビジョンでのプログラムでは1年かけても計算できなかったであろう経路探索を
わずか3秒で計算できたことに満足した。
(てか、高速化に無駄に力入れすぎた感もあるが。。)
以上

再試合用プログラムRC版公開

デバッグ作業頼んだ。

使用方法
ものを置いてCalc→Walk
右下で最短経路トップ10を切り替え
自分が使うソフトなので、入力チェックとかいちいちしません。

実装内容

全面書き直し(前回があまりに醜いコーディングしてたから)
A*を用いて、ノード(荷物)間の距離テーブルを生成
巡回セールスマン分岐限定法を用いながら丁寧に解いている
・厳密解の計算なので確実に最短経路
・得られた最短経路トップ10を保持 切り替え可能
・経路の距離を表示
・バイトコードレベルの計算の高速化(数100%の高速化を図ってる。測ってないから具体数はないが)
・そのため荷物13~5個位までなら実用レベルの計算量に抑えている。

まとめると

100%最短経路を提示する
・荷物の積載を含めた計算を行ってない為、コスト最良解ではない。
・が、どーせ取り合いですし、簡単にならExcelで計算可能。
・また、一度戻って取ってくる場合には非対応(ほとんどこれが最適解になることはないし)

今後に向けて

・やる気ない

再試合に向けて

前回のエキシビジョンからどう変えるか
現状
・全通り探索
・計算量が酷い
・人間の意志の反映量が大きすぎる気がする

現在考えてる案
・荷物と荷物のルート探索(A*)をあらかじめ全荷物に対して行う
・GA使って巡回セールスマンを解く。
・できれば多数生成して、競わせた中で一番いいルートを選ぶ

が、面倒だから全通り探索の計算量を低減させて使うことになりそう。
相手の動きを読む?部分がまったく欠落してしまうけどね。
ま、どーせ運ですし。

分かりやすいデータ

graph.png

青の所で戦わないと予選通過は厳しい か。
ルート探索精度に差があまりないからやっぱり運ですね。

大まかな流れとか

簡単に言うと
とりあえず最初にいく目的地を決める

最短でそこまでいく
追記:最初は遠い方がいいかも。最後に近場の荷物を拾う方が効率よさそう。

着いたら荷物拾って次へ(ここから先はなるべく近い順に回った方がいいかもね)
追記:どうも障害物が多くなるとちゃんと考えないと遅くなっちゃうねぇ。。面倒だねぇ('A`)

ループ

荷物を全部回ったらゴール
(まだ荷物が余ってた場合そこまでいってもいい。ただそれで有利になるかといえば微妙)

こんな感じが一番処理も少なくてシンプルかつ融通のきくプログラムが書けるような気がする

まぁ結局は運も大事。

というわけで書いてみた。

言語はJava。んーJavaがインターフェース作るの楽っ♪(Swing使用)
バグとか結構放置気味だけど、なかなか楽しめる。
大体三日位で書いてみた。(1000行弱)
ま、デバッグ兼ねて公開中
どんな迷路でもサクサク解くのでお試しあれ。(まぁフィールドのサイズは常識の範囲内で)

Java入れてないミジンコはこちらからダウンロードしてくれ
あなたと JAVA,今すぐダウンロード☆

10/5 改良

私的メモ
線形リストで保持してるもの:荷物。探索されたマス。
内部で距離の取得もやってる。
上記外で計算部で保持してるもの:プレイヤーの位置。開始位置。フィールド。最近のルート。別スレッドの有無~



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS