我有时会编写程序来玩棋盘游戏.基本策略是标准的alpha-beta修剪或类似的搜索,有时通过终结游戏或开放的常用方法来增强.我主要使用国际象棋变体,所以当需要选择我的评估功能时,我会使用基本的国际象棋评估功能.
但是,现在我正在编写一个程序来玩一个全新的棋盘游戏.我如何选择一个好的甚至是体面的评估函数?
主要的挑战是相同的棋子总是在棋盘上,因此通常的材料功能不会根据位置而改变,并且游戏的播放次数不到一千次左右,所以人类不一定玩得太多还没有给出见解.(PS.我考虑过MoGo方法,但随机游戏不太可能终止.)
游戏细节:游戏在10×10的棋盘上进行,每侧固定6个棋盘.这些作品具有一定的运动规则,并以某种方式相互作用,但没有任何一块被捕获.游戏的目标是在棋盘上的某些特殊方块中放置足够的棋子.计算机程序的目标是提供与当前人类玩家竞争或更好的玩家.
artificial-intelligence machine-learning game-theory evaluation-function alpha-beta-pruning
我正在使用R的插入包进行网格搜索和模型评估.我有一个自定义评估指标,它是绝对误差的加权平均值.权重在观察级别分配.
X <- c(1,1,2,0,1) #feature 1
w <- c(1,2,2,1,1) #weights
Y <- 1:5 #target, continuous
#assume I run a model using X as features and Y as target and get a vector of predictions
mymetric <- function(predictions, target, weights){
v <- sum(abs(target-predictions)*weights)/sum(weights)
return(v)
}
Run Code Online (Sandbox Code Playgroud)
这里给出了一个示例,说明如何使用summaryFunction为插入符号train()定义自定义评估指标.报价:
trainControl函数有一个名为summaryFunction的参数,它指定用于计算性能的函数.该函数应具有以下参数:
data是数据框或矩阵的参考,其中包含名为obs和pred的列,用于观察和预测的结果值(回归的数字数据或分类的字符值).目前,类概率不会传递给函数.数据中的值是单个调整参数组合的保持预测(及其相关参考值).如果trainControl对象的classProbs参数设置为TRUE,则将出现包含类概率的数据中的其他列.这些列的名称与类级别相同.lev是一个字符串,其结果因子级别取自训练数据.对于回归,将NULL值传递给函数.model是正在使用的模型的字符串(即传递给train的method参数的值).
我无法弄清楚如何将观察权重传递给summaryFunction.
有一个我用java编程的游戏.游戏很简单(参见下图).有4只鸟和1只幼虫.这是一个2人游戏(AI vs Human).
当比赛开始时,幼虫开始,然后一只鸟可以移动(任何一只),然后是幼虫等......
我已经实现了MiniMax(Alpha Beta Pruning),我使用了以下的evaluate()函数(启发式函数).
让我们给板上的每个方块提供以下数字.
因此,我们的评估功能将是
h(n)=幼虫的位置值 - 鸟的位置值1 - 鸟的位置值2 - 鸟的位置值3 - 鸟的位置值4
幼虫将尝试最大化启发式值,而鸟类将尝试最小化它
例:
但是,这是一个简单而天真的启发式方法.它不会以聪明的方式行事.我是AI的初学者,我想知道如何改进这个启发式功能?
什么是好的/知情的启发式?
artificial-intelligence heuristics evaluation-function minimax alpha-beta-pruning
我有一个“Connect 4”游戏的 Java 实现(具有可变数量的列和行)。
此实现使用(根据用户的选择)Mini-max 的 Mini-max 算法和 Alpha-beta 剪枝,最大搜索深度为maxDepth
我现在的问题是为板的状态设计一个好的评估函数(这是在 maxDepth 处返回的值)。
该值介于-100(最差选择,对应于失败的情况)和100(最佳选择,对应于获胜情况)之间,其中0应该是“平局”情况。
其实我已经实现了两个函数(因为代码很长,我报告了伪代码)
1)
--> 如果表已满 ==> 绘制 (0)
--> 如果表未满 ==> 不确定的情况 (50)
--> 如果我赢了:100
--> 如果对手获胜:-100
2)
Of me:
- InARow[0] = maximum number of pieces in a HORIZONTAL in a row
- InARow[1] = maximum number of pieces in a VERTICAL in a row
- InARow[2] = maximum …Run Code Online (Sandbox Code Playgroud) 我编写了以下自定义评估函数与 xgboost 一起使用,以优化 F1。不幸的是,它在使用 xgboost 运行时会返回异常。
评价函数如下:
def F1_eval(preds, labels):
t = np.arange(0, 1, 0.005)
f = np.repeat(0, 200)
Results = np.vstack([t, f]).T
P = sum(labels == 1)
for i in range(200):
m = (preds >= Results[i, 0])
TP = sum(labels[m] == 1)
FP = sum(labels[m] == 0)
if (FP + TP) > 0:
Precision = TP/(FP + TP)
Recall = TP/P
if (Precision + Recall >0) :
F1 = 2 * Precision * Recall / (Precision + Recall)
else: …Run Code Online (Sandbox Code Playgroud)