我在一个相对较小的二维网格上有许多点,它在两个维度上都包裹着.坐标只能是整数.我需要将它们分成最多N个接近在一起的点,其中N将是一个非常小的截止点,我最多怀疑10个.
我正在为游戏设计一个人工智能,而且我99%肯定在所有游戏中使用minimax会给我一个可用的前瞻性约1动作,如果那样的话.然而,在我们通过大量动作展望未来之前,遥远的游戏棋子应该无法相互影响,所以我想将游戏分成N个棋子的多个子游戏.但是,我需要确保我一次选择合理的N个片段,即那些靠得很近的片段.
我不关心异常值是自己留下还是与最远距离的集群混在一起.打破大于N的自然集群是不可避免的,只需要合理.因为这是在具有有限响应时间的游戏AI中使用的,所以我正在寻找尽可能快的算法,并且愿意牺牲性能的准确性.
有没有人有任何关于算法的建议来适应?K-means和亲戚似乎不合适,因为我不知道我想找到多少个集群,但我对我想要的集群有多大的约束.我已经看到一些证据表明通过将点捕捉到网格来近似解决方案可以帮助一些聚类算法,所以我希望整数坐标使问题更容易.基于距离的分层聚类将很容易适应环绕坐标,因为我只需插入不同的距离函数,并且相对容易限制聚类的大小.我还应该关注其他任何想法吗?
我对算法比对图书馆更感兴趣,尽管有很好的文档库可以很好地记录它们的工作方式.
编辑:当我正在为2011秋季AI挑战赛的参赛作品时,我最初问过这个问题,我很遗憾没有完成.我链接的页面有一个相当短的合理的高级游戏描述.
两个关键点是:
在比赛中,每个机器人都有严格的时间限制.我曾经想过使用minimax接近游戏(转弯真的是同时发生,但作为一种启发式,我认为它会没问题),但我担心如果我考虑整个游戏,就没有时间向前看很多动作立刻.但是由于每只蚂蚁每回合仅移动一个方格,两条蚂蚁不能通过最短路径分开N个空间,可能会相互干扰,直到我们向前看N/2次移动.
所以我正在寻找的解决方案是一次选择较小的蚂蚁群并分别对每组进行极小动作的好方法.我原本希望这会让我更深入地搜索移动树而不会失去太多准确性.但显然使用非常昂贵的聚类算法作为节省时间的启发式是没有意义的!
我仍然对这个问题的答案感兴趣,尽管我可以从技术中学到更多的东西而不是这个特别的比赛,因为它已经结束了!谢谢你到目前为止的所有答案.
给出一些如下的数组:
x = ['a', 'b', 'b', 'c', 'a', 'a', 'a']
Run Code Online (Sandbox Code Playgroud)
我希望最终能够显示每个元素按顺序重复多少次.所以也许我最终会得到以下结果:
[['a', 1], ['b', 2], ['c', 1], ['a', 3]]
Run Code Online (Sandbox Code Playgroud)
结果的结构并不重要......可能是其他一些需要的数据类型.
这是一个非常直截了当的问题.我希望答案是"两个",但我担心它们都不是.我仔细检查了SQL开发人员和Cursor的Android开发人员文档,但找不到这个问题的任何明确答案.
我问的情况是我得到一个游标,调用moveToFirst,然后循环,直到isAfterLast返回true.对于我正在编码几次的模式来说非常方便,如果光标有0条记录就可以正常工作并执行循环0次.
或者我是否需要先显式测试空光标?
编辑:一些回复表明人们并没有得到我所要求的.基本上,我想写这个:
cursor = myDb.query(...)
cursor.moveToFirst()
while (!cursor.isAfterLast()) {
processRow(...)
}
Run Code Online (Sandbox Code Playgroud)
但我并不是100%肯定我能.对于这种情况,isAfterLast不能返回任何有用但真实的东西,但这并不意味着它实际上对于空查询返回true.该文档似乎并不指定哪些大部分的光标方法的返回值是如果光标是空的(Android的文档似乎非特异性的很多角落的情况下,实际上)比其他getCount.所以我担心我需要这样做:
cursor = myDb.query(...)
if (cusror.getCount() > 0) {
cursor.moveToFirst()
while (!cursor.isAfterLast()) {
processRow(...)
}
}
Run Code Online (Sandbox Code Playgroud)
这更加混乱,逻辑冗余.请记住,在实际实现中有更多的代码,这是跨多种方法的.其中一个答案现在建议我也需要检查光标null,这完全没有文档...
我只是想知道是否有其他人知道在isAfterLast空光标上调用时的实际行为.
这令我感到困惑,但我无法得到明确的答案.__new__在从DJango模型派生的类中使用该方法(或更准确地说,静态方法).
这是__new__应该如何理想使用(因为我们使用Django,我们可以假设正在使用python的2.x版本):
class A(object):
def __new__(self, *args, **kwargs):
print ("This is A's new function")
return super(A, self).__new__(self, *args, **kwargs)
def __init__(self):
print ("This is A's init function")
Run Code Online (Sandbox Code Playgroud)
从上面的类实例化对象按预期工作.现在,当在Django模型派生的类上尝试这样的事情时,会发生意外情况:
class Test(models.Model):
def __new__(self, *args, **kwargs):
return super(Test, self).__new__(self, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
从上面的类中实例化对象会导致此错误:
TypeError: unbound method __new__() must be called with Test instance as first argument (got ModelBase instance instead).
我无法理解为什么会发生这种情况(虽然我知道由于Django框架,一些类魔法正在幕后发生).
任何答案将不胜感激.
我正在Scala中编写一个Android应用程序,但我无法找到这个问题的明确答案.
我的应用程序包含一个对象,其中包含一些在val中定义的静态数据.数据包括类的实例.
我的问题是,当Android决定杀死活动并稍后重新启动时,我的对象会发生什么?我知道Scala中的对象可以用来实现与Java中静态值类似的目的,但实际上并没有在生成的字节码中实现.那么Android知道在重新启动活动时重新初始化我的对象吗?是否存在不会这样做的情况,或者我必须小心的情况?
如果上面的答案是"一切都很好",我认为由可变数据组成的对象将是完全不同的.在那种情况下,我非常确定我需要显式保存/恢复此类对象以保留状态.但是,保存/恢复始终相同且硬连接到APK本身的数据似乎很愚蠢.
有没有办法在Haskell中创建相当于创建"构造函数别名"的东西?我认为类似于别名,你可以给类型一个不同的名称,但它仍然以各种方式表现为别名类型.
我的用例是一个系统,我将指定的时间作为我正在建模的某些对象的属性,所以UTCTime.其中一些可能是"可变"时间,这意味着它可能尚未分配时间或它所具有的时间是"可移动的".所以Maybe UTCTime.
但只有部分对象具有可变时间.其他人有固定的时间,系统必须作为一个常数; 当前分配给特定时间的时间变量的处理方式与固定时间不同.现在暗示Either UTCTime (Maybe UTCTime); 它可以是固定时间,也可以是未分配的可变时间.
通用类型似乎非常适合我正在尝试建模的东西,所以使用它们感觉很自然.不过,虽然这是什么明显Either UTCTime (Maybe UTCTime) 是,这不是特别明显这是什么意思,所以一些描述性的特殊情况下的名字就好了.
一个简单的type Timeslot = Either UTCTime (Maybe UTCTime)肯定会清理我的类型签名很多,但这对构造函数没有任何作用.我可以使用类似的东西bound = Just来获取构造值的名称,但不能用于模式匹配.
在另一端,我可以用我想要的任何名称定义一个自定义ADT,但后来我失去了Either和Maybe类型的所有预定义功能.或者更确切地说,我将一直来回应用变换(我认为这并不比使用newtype包装器的情况更糟,只是没有效率保证,但我怀疑这无论如何都会成为瓶颈).我想要理解使用泛型Either和Maybe函数操作我的Timeslot值的代码我需要知道标准构造函数映射到我想要使用的任何方式的方式,转换函数将提供一个方便的编译器强制定义的映射.所以也许这是一个很好的方法.
我很确定我知道Haskell很好地说没有构造函数别名这样的东西,但我很好奇是否有一些我不知道的hack,或者其他一些处理这种情况的好方法.
假设我正在cabal install A B C D ... --dry-run全新安装的 GHC 中运行(我刚刚更新了一个新版本)。我看到它想要引入的一些依赖项不是这些包的最新版本,例如:
utf8-string-0.3.8 (latest: 1)
cairo-0.12.5.3 (latest: 0.13.1.0)
glib-0.12.5.4 (latest: 0.13.1.0)
gio-0.12.5.3 (latest: 0.13.1.0)
pango-0.12.5.3 (latest: 0.13.1.0)
gtk-0.12.5.7 (latest: 0.13.6)
Run Code Online (Sandbox Code Playgroud)
现在,这通常是完全正常的(尤其是在最近发布了新版本的 GHC 之后)。我不在乎这里列出的特定软件包。但是当我看到这个时,我想快速检查一下为什么 cabal 无法使用这些软件包的最新版本。通常这意味着我要求它安装的其中一项内容尚未更新,并且仍然依赖于旧版本,有时我实际上并不需要安装它,而是不想让它拖动其他软件包的版本。
有时这些“不是最新版本”很旧,这通常意味着我要求的东西与最近的东西完全不兼容,但已经找到了使用具有非常松散约束的旧版本的解决方案。
我想要做的是找出我正在安装的哪些软件包导致了这种情况。通常我可以看到类似“哦,那些是一堆图形包,可能是 xmonad 或 taffybar 的原因”之类的内容,然后我会在 hackage 上查看最新版本的 xmonad 和 taffybar,看看它们对这些包的限制是什么。但是通常像这样的“明显的罪魁祸首”实际上对这些依赖项没有相关的约束,这意味着问题是其他一些包,它依赖于我要求的东西,并且也依赖于我不是的包获取最新版本的,在那包与 cabal 报告的包的最新版本不兼容。找到这样一个包(以及为什么我真正关心的是依赖于它)可能是一项棘手的任务!
是否有任何工具或技巧可以帮助回答这个问题?我知道http://packdeps.haskellers.com/上的依赖工具很有用,但似乎并没有完全按照我的意愿行事;我可以使用反向依赖列表从 cabal 想要过时版本的包开始并继续工作,直到找到我认可的东西,或者我可以一次查询依赖监视器中的单个包,然后向后工作,直到我找到一个不是最新的软件包。但似乎我问的问题应该更直接可以回答。
我希望能够做的事情如下:
import Data.IxSet
newtype Key a = Key Integer
deriving (Eq, Ord, Show)
data Keyed a = Keyed { key :: (Key a), value :: a }
deriving (Eq, Ord, Show)
instance Indexable a => Indexable (Keyed a)
where empty = ixSet $ ixFun (\k -> [key k]) : _somehow_reuse_indices_of_a_
Run Code Online (Sandbox Code Playgroud)
我的想法是,如果某些数据结构是Indexable,我应该能够Keyed用相同的类型(加上索引Key a)来索引它.
应该很容易将传递给ixFun包装类型索引的函数转换为使用Keyed而不是a:只需要编写value.但我找不到任何方法来实际掌握这些功能.
我也看了一下ixset类型的包; Indexable的版本实际上提供了一个索引列表,而不是一个空的IxSet.这似乎更适合重用索引,但"索引列表"是一个自定义类型,它不会导出它的构造函数,所以我似乎无法得到它们.
我错过了任何支持这种用法的东西吗?
是否可以为包含"空白"的Haskell值提供类型签名以填充类型推断算法?
背景的极为人为的例子:
m = return ('I', (("don't", "really"), "care", ["what", "this"], "type"), "is")
b = isJust m
Run Code Online (Sandbox Code Playgroud)
这有效.使用isJust m在b约束的类型m是Maybe <something>,和m的定义约束的类型m是<something> (Char, ((String, String), String, [String], String), String),并且编译器放在一起的那些信息两块制定出的精确类型m.
但是说我没有应用任何Maybe特定的功能m,所以我需要一个手动类型签名来阻止return多态.我不能这样说:
m :: Maybe a
m = return ('I', (("don't", "really"), "care", ["what", "this"], "type"), "is")
Run Code Online (Sandbox Code Playgroud)
因为那是不对的.该类型是不是Maybe a所有的a,它是Maybe a对一些a我想编译器来推断; 有在节目足够的信息让编译器做到这一点,我们可以从我的第一个例子中看到的编译器是能够放在一起多约束的类型,其中单独没有任何约束足以弄清楚什么类型的,但他们一起完全指定了类型.
我想要的是能够给出类型 …
我试图使用for循环为某些变量分配一些矩阵.但我无法实现.我可能知道我的错误在哪里,但我不知道是否有办法克服它
N = 10;
for i = 1:1:N
P(i) = [x(i)^2 x(i)*y(i);
x(i)*y(i) y(i)^2];
end
K = blkdiag(P);
Run Code Online (Sandbox Code Playgroud)
我想为P(i)分配一个矩阵,然后使用那些P(i)来创建一个块对角矩阵.但似乎我不能这样做.有没有其他方法来创建这样的块对角矩阵?