HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0413
moフォルダの階層のようなデータの管理方法3未解決


mo

リンク

2007/4/13(Fri) 14:37:26|NO.7355

すっごくわかり辛いかもしれません。。

まず やろうとしてた事は、
オセロの手順をフォルダで示して、勝敗によって最下層に勝利者のファイルを置き、
コンピュータが手を選ぶ時に、現在までの手順から
その階層以下にある自分の勝利ファイルが幾つあるかを元に優先度を決定したかったのです。

しかしこの方法ではディスク容量はいらないが、無駄にフォルダが増えて
一旦ある程度まで増殖すると、フォルダを消す事が容易じゃなくなる(数が多過ぎるため)。

そこでこの構造をそのまま単一のファイルに出来ないかと思ったんですが、その方法がわかりません。
(例えばzipファイルの中にフォルダを作っていくイメージ。)
まぁファイルにした所で、プログラム内では多次元配列変数に格納するんでしょうが、果たして何次元必要なのかもわかりません。

こういった木構造をファイル(または多次元配列)で管理するにはどういった手があるでしょうか。



この記事に返信する


ふほ

リンク

2007/4/13(Fri) 15:17:49|NO.7356

・・・・・リスト構造?



Drip

リンク

2007/4/14(Sat) 00:10:56|NO.7411

Dripです。

 moさん、こんにちは。
データファイルはできるだけ少なくして、ユーザーフレンドなデータ管理を行っていきたいですね。
 さて、ファイルをばらばらにせずに済ます方法として、保存する変数自体のサイズを保存ファイルに
付与する方法が考えられます。これによりデータサイズが変化してもロード、セーブに支障がありません。
(例)
dim arraySize,1:arraySize=length(ary)
bsave "file.dat",arraySize //配列の数保存
bsave "file.dat",ary,,4 //配列を保存

 フォルダ階層のように管理するのなら、再帰を使ってデータの読み込み、書き出しを管理すると
良さそうですね。
 木構造について学ぶには、再帰による木の画像を作成するなど、簡単な再帰処理から勉強していくと
わかりやすいと思います。がんばってみてください。



mo

リンク

2007/4/14(Sat) 17:20:20|NO.7447

Dripさん どうもありがとうございます。

むむむっ、難しくなってきましたね。。
再帰は自身を呼び出す事でしたっけ…
普通のオセロの最善手の探し方に使われたりしてたような・・何手先まで読むかってやつ。

今一理解しきれないので、念の為この方法に至った経緯と、実際やっている事を
書いておきます。

まず、オセロのAI(学習型)を作ろうと思い、
ゼロから対戦を重ねる毎に強くなる事が目的です。

普通のオセロゲームや将棋などのコンピュータの思考は、
現在打てる手をすべて調べて
何手か先までシミュレート(たぶんこの時再帰を使うと思う)した結果
最も良い物を選んでいるのだと思っているのですが、
この方法は上手にプログラミングしないと処理が遅かったり、深く読めなかったりします。

私の場合、今までそんなの組んだことないし、難しそうだなって事で別の道を考えました。
それが、
・手順と勝者を覚えて蓄積し、その経験データから自分の勝利データが多い手順を選ぶ
という物です。

具体的な方法は、
まず、石を置く事が出来る場所のリスト番号を手順とする。
 走査方法は左上から下向きに右下までで、
 最初の状態なら、黒の置ける場所は
 ○●
 ●○
 左上の白の左が1番、上が2番。
 左下の白の下が3番、右が4番になります。
これを勝負がつくまで記憶しておいて、勝者が決まるとディレクトリに

c:\root\1\2\1\2\3\2\4\...(60手分)\2\1.txt←勝者ファイル。2pなら2.txt

という風に保存しています。(一度に最大で60個フォルダが出来る)

この方法のメリットは、
・既にフォルダがある場合は新しく作らない(作れないし)のでデータの重複がない。
・読み出す時は、対戦中手順通りにカレントフォルダを移動していって
 その先にまだフォルダがあれば既に辿った手筋で勝者が決まっているので
 その勝者が自分であればフォルダ通りに、なければ(相手より少なければ)
 辿った事がない道を選ぶという単純な手の決め方が出来る為、思考時間が短くてすむ。
 ただし数万回分の対戦データを持っていると、最初の方ではファイル検索に結構掛かるが…
・またサイズ0バイトの、フォルダとファイルのみで知識として蓄えられるので
 ディスク容量を気にしないですむ。
・上記の為、Windowsにフォルダの数の制限がなければ、全ての道筋を記憶する事も可能。
 これが出来れば、オセロを完全解析したようなものなので究極目標である。

しかしデメリットがあり、先に述べた
・フォルダが多過ぎて、対戦データの初期化が容易じゃない。
・フォルダの数や階層が深すぎて、Windowsの制限に引っかかる可能性もある。

といった致命的な面があり、なんとかファイルに出来ないかと模索中である。

そして一番最初に思いついたのが、
これをこのままzipファイルに圧縮すればいいんじゃないかと。
厳密には、プログラム内でzip圧縮までして保存すればいいんじゃないかと。
しかし、zipファイルにこのようなディレクトリ構造を構築する方法が分からないので
Windowsはどうやってディレクトリ情報を管理しているんだろう? となったんです。

単純に思いつく方法として、
・ディレクトリパスを全て列挙して何処かに保存している。
 現在はこの方法でオセロの対戦データを保存していますが、
 何万件も記憶すればすぐに1Mバイトを超え、データを探すだけで結構時間が掛かってしまいます。
 それでも2回目以降はフィルタリングする候補が激減していくので、問題は最初の1回。

と ここまで考えて、
残すデータを厳選(定石化)する事でとりあえずオセロの件はもういいんですが、

このディレクトリ情報の管理方法が気になってしまったので、今回スレを立てるに至りました。
今試したのですが、
いくつかフォルダを作ってzip圧縮するとzipファイルはサイズが多少ありました(当然か…)
この時に気になる点として、
zipファイルの中身はやはりパスの列挙なのか、別の方法なのかという事を知りたいんです。

長々と書いてしまいましたが、もし分かればで結構です。
圧縮ファイルに詳しい方とか、ご存じないでしょうか…



ONION software Copyright 1997-2023(c) All rights reserved.