有一个名为PokerPirate的新开源扑克机器人.我对Web应用程序可以检测/阻止/击败扑克机器人的任何创造性方式感兴趣.(这是一个纯粹的学术讨论,与PokerPirate写的一样精神.)
乍一看这个问题听起来很简单,但事实证明它看起来要复杂得多.这让我很难过.
有52c5 = 2,598,960种方法可以从52张牌中选择5张牌.然而,由于套装在扑克中是可以互换的,所以其中许多都是等同的 - 手2H 2C 3H 3S 4D相当于2D 2S 3D 3C 4H - 简单地换掉套装.根据维基百科,一旦你考虑到可能的套装重新着色,有134,459个不同的5张牌.
问题是,我们如何有效地生成所有这些可能的手?我不想生成所有的手,然后消除重复,因为我想将问题应用于更多的卡,以及评估快速螺旋失控的手的数量.我目前的尝试集中在生成深度优先,并跟踪当前生成的卡以确定哪些套装和等级对下一张卡有效,或者广度优先,生成所有可能的下一张卡,然后通过转换每个卡来删除重复通过重新着色来制作"规范"版本.这是我在Python中尝试广度优先的解决方案:
# A card is represented by an integer. The low 2 bits represent the suit, while
# the remainder represent the rank.
suits = 'CDHS'
ranks = '23456789TJQKA'
def make_canonical(hand):
suit_map = [None] * 4
next_suit = 0
for i in range(len(hand)):
suit = hand[i] & 3
if suit_map[suit] is None:
suit_map[suit] = next_suit
next_suit += 1
hand[i] = hand[i] & …Run Code Online (Sandbox Code Playgroud) 有谁知道评估7张扑克牌手的快速算法?比一组7中的每21张5张牌组合更加有效率的东西.
干杯,
皮特
我正在尝试编写一个简单的游戏/实用程序来计算扑克赔率.我知道有很多资源可以讨论这样做的公式,但我想我无法将其转换为代码.特别是,我对Texas Hold-em感兴趣...
我知道有几种不同的方法,一种方法是你可以根据你能看到的牌来计算你手牌的几率.另一种方法是计算你赢得某手牌的几率.第二种方法似乎要复杂得多,因为你必须输入更多的数据(有多少玩家等)
我不是要求你为我写的,但是在正确的方向上的一些推动会有所帮助:-)
我有兴趣用Java构建Texas Hold'Em AI引擎.这是一个长期项目,我计划投资至少两年.我还在上大学,还没有建立任何雄心勃勃的东西,并希望解决一个长期存在我兴趣的问题.我是人工智能领域的新手.从我在大学的数据结构课程中,我知道基本的构建模块,如BFS和DFS,回溯,DP,树,图等.我正在学习正则表达式,为SCJP和SCJD学习,我将很快采取(密集) )统计课程.
问题:
- 我从哪里开始?我应该选哪些书?玩扑克游戏程序的人工智能是什么样的?我可以从哪个开源项目中获取页面?Java中有哪些优秀的AI资源?我也有兴趣学习Lisp,Jatha好吗?
我正在写一个7卡扑克手评估员作为我的宠物项目之一.在尝试优化速度时(我喜欢挑战),我惊讶地发现,与数组索引查找相比,Dictionary键查找的性能相当慢.
例如,我运行了这个示例代码,列举了所有52个选择7 = 133,784,560个可能的7个牌手:
var intDict = new Dictionary<int, int>();
var intList = new List<int>();
for (int i = 0; i < 100000; i ++)
{
intDict.Add(i, i);
intList.Add(i);
}
int result;
var sw = new Stopwatch();
sw.Start();
for (int card1 = 0; card1 < 46; card1++)
for (int card2 = card1 + 1; card2 < 47; card2++)
for (int card3 = card2 + 1; card3 < 48; card3++)
for (int card4 = card3 + 1; card4 < 49; card4++) …Run Code Online (Sandbox Code Playgroud) 它最近出现在一个大型扑克网站上,一些玩家可能通过利用已发现的安全漏洞看到所有对手的牌.
一个天真的骗子会以极快的速度赢得胜利,而且这些作弊通常很快被捕获,如果不能很快被抓住,他们很容易通过他们的手历史快速扫描来发现.
更难的问题发生在骗子表现出情报,诈唬他们必须被召入的地方时,用最坏的牌召唤河牌,基本前提是他们故意丢失底池以掩盖他们看到其他球员牌的能力,他们以合理的现实率获胜.
鉴于:
我们怎样才能合理准确地对这些作弊者进行分类呢?最初的2 + 2线程呼吁创意,我认为SO社区可能有一些有用的建议.
这也是一个有趣的问题,因为它是最新的,并且如果有人找到创造性的解决方案,它在改善世界方面具有真正的应用,因为真正的玩家很有可能在发现识别的骗子时将资金退还给他们.
poker statistics artificial-intelligence classification anti-cheat
我在考虑扑克牌(5张牌)的评价Java.现在我正在寻求简单和清晰,而不是性能和效率.我可能会写一个"天真"的算法,但它需要大量的代码.
我还看到了一些扑克评估库,它们使用散列和按位操作,但它们看起来相当复杂.
什么是扑克手评估的"最干净,最简单"的算法?
我正在尝试使用"RayW手评估器"方法来获得卡组合分数(7个中最好的5个卡).但是我在这个方法上遇到了一些性能问题.根据消息来源 - 使用这种方法,必须能够每秒评估超过300密耳的手!我的结果是1.5秒内10毫秒,这慢了很多倍.
"RayW手评估者"背后的想法如下:
Two Plus Two评估器由一个包含大约三千二百万个条目的大型查找表组成(准确地说是32,487,834).为了查找给定的7张牌扑克牌,您可以在此表中跟踪路径,每张卡执行一次查找.当你到达最后一张牌时,这样获得的值是手牌的官方等值
这是代码的样子:
namespace eval
{
public struct TPTEvaluator
{
public static int[] _lut;
public static unsafe void Init() // to load a table
{
_lut = new int[32487834];
FileInfo lutFileInfo = new FileInfo("HandRanks.dat");
if (!lutFileInfo.Exists)
{throw new Exception("Handranks.dat not found");}
FileStream lutFile = new FileStream("HandRanks.dat", FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 4096);
byte[] tempBuffer = new byte[32487834 * 4];
lutFile.Read(tempBuffer, 0, 32487834 * 4);
fixed (int* pLut = _lut)
{ Marshal.Copy(tempBuffer, 0, (IntPtr)pLut, 32487834 * …Run Code Online (Sandbox Code Playgroud) 我很想知道这个过程是如何运作的.这些网站(http://www.sharkscope.com和http://www.pokertableratings.com)的数据每天都来自安全的扑克网络,如PokerStars和Full Tilt.
他们是否有一个服务器场运行应用程序,打开数百个表(窗口),然后以某种方式蜘蛛/数据正在播放的手?
这是如何工作的,编程明智?
poker ×10
algorithm ×3
c# ×2
java ×2
statistics ×2
.net ×1
anti-cheat ×1
data-mining ×1
jatha ×1
lisp ×1
performance ×1
permutation ×1
probability ×1
python ×1
r ×1
ranking ×1
security ×1
winforms ×1