我正在编写一个玩游戏Word链的AI。如果你不知道这是什么a:wikipedia link。
所以我想通过能够访问整个字典并根据我的参数搜索单词来改善我的AI。我怎样才能通过eclipse访问整个字典,使用java?
答案 0 :(得分:1)
鉴于主游戏规则是下一个单词应该以前一个单词的最后一个字母开头,你肯定想要预先准备数据结构,然后在O(1)中访问它。因此,我建议使用字母大小的数组(例如英语为26),其元素是HashSet实例,表示以相应字母开头的单词包。
HashSet<String>[] words;
实际上,给定一个数组,您可以立即访问以该字母开头的单词集(位置0 - > A,位置1 - > B ...)。作为数组的替代,您可以使用HashMap,其键是一个字母,其元素也是可能单词的HashSets。
HashMap<Character, HashSet<String>> words;
因此,仍然在O(1)中授予访问权限。
关于HashSets,你希望同时具有持续访问时间和持续删除时间,因为在游戏过程中不能重复单词,因此,在使用它们之后,你想要将它们从HashSet中删除。
如果你的字典足够小(或者从另一个角度看,你有足够的资源),你可以完全预取字典。如果你不这样做,建议的结构仍然可以适应:事实上,数组(或HashMap)不会改变,而HashSet也提供恒定的添加时间。因此,您可以计划不时重新填充HashSet(例如,在给定数量的删除操作之后)。
在所有情况下,您始终可以获取HashSet中的第一个元素或引入一些随机化;请记住,作为一般规则,对HashSet元素的访问不会以任何特定顺序发生。
阅读单词的来源很容易就是一个文件,或者更好的是一个文件袋,每个字母一个,这样你就可以知道在哪里阅读,你可以打开所有这些文件,并减少开销打开,关闭或搜索文件:每个文件打开和关闭一次,你的搜索只是线性的。
最后,如果您还想仅提议属于给定类别的单词,您可能希望在字典预取期间过滤掉不属于该类别的单词(假设您拥有每个单词所属的类别)。
如果您的问题还包括寻找&#34;相关&#34;在运行时,你可能想要使用 Feature vectors ,这样你仍然可以有可接受的计算时间来计算游戏中的相关性。
答案 1 :(得分:0)
尝试谷歌搜索&#34;单词列表&#34;。这是一个很好的:http://wordlist.aspell.net/
将其中一个保存为文件,并使用java将其加载到内存中。我会更具体,但你会根据你想要搜索单词的方式将它加载到内存中。
答案 2 :(得分:0)
你想要建立什么样的人工智能?它是学习代理吗? 根据我的理解'搜索基于参数的单词',我想你的意思是你想把单词放到不同的类别中,这样你的AI就能生成一个可以解决的单词列表。
要创建单词域,您始终可以将单词列表存储到散列映射中,并将“参数”作为键。由于您试图存储整个字典,为什么不将信息存储到非关系数据库(如果适用),这样您就不必每次为游戏加注时都准备AI。
可以使用Java轻松实现非关系数据库。我知道这个易于配置的是RIAK。您可以在此处查看说明和教程:http://basho.com/riak/。使用非关系数据库,如果类似于使用“关键字”搜索事物。
希望这就是你所要求的。
答案 3 :(得分:0)
在这种情况下,我认为您需要与dict服务器通信才能访问整个字典 这是我的代码
import java.net.*;
import java.io.*;
import java.util.*;
public class Dictionary {
public static void main(String[]args) {
String host = "dict.org";
try {
Socket soc = new Socket(host,2628);
OutputStream out = soc.getOutputStream();
String request = "DEFINE ! yourwordhere";
out.write(request.getBytes());
out.flush();
soc.shutdownOutput();
InputStream in = soc.getInputStream();
Scanner s = new Scanner(in);
while(s.hasNextLine())
System.out.println(s.nextLine());
soc.close();
} catch (UnknownHostException e) {
System.out.println("Cannot found the host at "+host);
} catch (IOException e) {
e.printStackTrace();
}
}
} 如果是这样,您不必进行任何搜索,这将减少执行程序的时间