【发布时间】:2015-04-23 04:33:32
【问题描述】:
我正在尝试使用 Intel TBB parallel_reduce 来计算对 Connect 4 游戏中用户移动的最佳响应。我写了一个简单的函数,当传递一个列号时,它会返回一个与玩该动作的效用相对应的启发式分数。我的意图是并行调用这个函数,然后返回返回结果的缩减。减少将是启发式得分最高的移动。
但是我发现我得到的结果不一致。我希望从并行减少中返回第 0 列的移动(因为我已经编写了启发式得分函数,使其返回 7 - 列号作为得分)。
我已附上 C++ 代码。这是它产生的示例输出:
返回移动0
返回移动 1
返回移动 2
返回移动 6
返回移动 4
返回移动 5
比较动作5返回动作3和6
比较第 3 步和第 4 步
比较第 3 步和第 5 步
比较第 2 步和第 3 步
最佳步数是 2
我已经多次查看代码,无法理解为什么它并不总是返回 0 作为最佳移动。它有时会返回零,但并非总是如此。正如您在上面看到的,移动 0 被评估,但归约 lambda 函数永远不会将其作为输入。任何帮助将不胜感激。我有一个模糊的怀疑,我使用的 0 的身份,可能不对。但是我不确定它应该是什么。
#include <tbb\blocked_range.h>
#include <tbb\parallel_reduce.h>
#include <iostream>
#include <vector>
int getMoveHueristicScore(int columnCounter) {
int returnValue = 7 - columnCounter;
return returnValue;
}
int bestHeuristicScore(int numberOfColumns) {
std::vector<int> moveScores(numberOfColumns, -1 * INT_MAX);
return tbb::parallel_reduce(
tbb::blocked_range<int>(0, numberOfColumns),
0,
[=, &moveScores](const tbb::blocked_range<int>& range, int bestMove)->int {
int bestScore = -1 * INT_MAX;
for (int columnCounter = range.begin(); columnCounter != range.end(); ++columnCounter) {
moveScores.at(columnCounter) = getMoveHueristicScore(columnCounter);
if (moveScores.at(columnCounter) > bestScore) {
bestScore = moveScores.at(columnCounter);
bestMove = columnCounter;
}
}
std::cout << "Return move " << bestMove << std::endl;
return bestMove;
},
[=, &moveScores](int bestMove1, int bestMove2)->int {
std::cout << "Compare moves " << bestMove1 << " & " << bestMove2 << std::endl;
if (moveScores.at(bestMove1) > moveScores.at(bestMove2)) {
return bestMove1;
}
else {
return bestMove2;
}
}
);
}
int main() {
int bestMove = bestHeuristicScore(7);
std::cout << "Best move is " << bestMove << std::endl;
return 0;
}
【问题讨论】:
标签: c++ parallel-processing intel tbb