fix clash in encoding function due to undefined number of extra turns
This commit is contained in:
parent
c394338c24
commit
1f4949c1e5
2 changed files with 19 additions and 11 deletions
|
@ -113,8 +113,6 @@ namespace Download {
|
||||||
const std::vector<Action>& actions,
|
const std::vector<Action>& actions,
|
||||||
size_t num_turns_to_replicate
|
size_t num_turns_to_replicate
|
||||||
) {
|
) {
|
||||||
|
|
||||||
std::cout << "Initialising game with " << +num_players << " players, " << +num_suits << " suits and hand size " << +hand_size << std::endl;
|
|
||||||
auto game = std::unique_ptr<Hanabi::HanabiStateIF>(new Hanabi::HanabiState<num_suits, num_players, hand_size>(deck));
|
auto game = std::unique_ptr<Hanabi::HanabiStateIF>(new Hanabi::HanabiState<num_suits, num_players, hand_size>(deck));
|
||||||
std::uint8_t index;
|
std::uint8_t index;
|
||||||
for (size_t i = 0; i < num_turns_to_replicate; i++) {
|
for (size_t i = 0; i < num_turns_to_replicate; i++) {
|
||||||
|
|
|
@ -406,12 +406,11 @@ namespace Hanabi {
|
||||||
#define RETURN_PROBABILITY \
|
#define RETURN_PROBABILITY \
|
||||||
if (_position_tablebase.contains(id_of_state)) { \
|
if (_position_tablebase.contains(id_of_state)) { \
|
||||||
ASSERT(_position_tablebase[id_of_state] == best_probability); \
|
ASSERT(_position_tablebase[id_of_state] == best_probability); \
|
||||||
} else { \
|
} \
|
||||||
_position_tablebase[id_of_state] = best_probability; \
|
_position_tablebase[id_of_state] = best_probability; \
|
||||||
} \
|
\
|
||||||
return best_probability;
|
return best_probability;
|
||||||
|
|
||||||
|
|
||||||
#define UPDATE_PROBABILITY(new_probability) \
|
#define UPDATE_PROBABILITY(new_probability) \
|
||||||
best_probability = std::max(best_probability, new_probability); \
|
best_probability = std::max(best_probability, new_probability); \
|
||||||
if (best_probability == 1) { \
|
if (best_probability == 1) { \
|
||||||
|
@ -429,6 +428,9 @@ namespace Hanabi {
|
||||||
if(_pace < 0 || _endgame_turns_left == 0) {
|
if(_pace < 0 || _endgame_turns_left == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
if (_position_tablebase.contains(id_of_state)) {
|
||||||
|
return _position_tablebase[id_of_state];
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Have some endgame analysis here?
|
// TODO: Have some endgame analysis here?
|
||||||
|
|
||||||
|
@ -500,8 +502,7 @@ namespace Hanabi {
|
||||||
UPDATE_PROBABILITY(probability_stall);
|
UPDATE_PROBABILITY(probability_stall);
|
||||||
}
|
}
|
||||||
|
|
||||||
_position_tablebase[id_of_state] = best_probability;
|
RETURN_PROBABILITY;
|
||||||
return best_probability;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<suit_t num_suits, player_t num_players, hand_index_t hand_size>
|
template<suit_t num_suits, player_t num_players, hand_index_t hand_size>
|
||||||
|
@ -520,9 +521,18 @@ namespace Hanabi {
|
||||||
id *= max_num_clues + 1;
|
id *= max_num_clues + 1;
|
||||||
id += _num_clues;
|
id += _num_clues;
|
||||||
|
|
||||||
// encode draw pile size
|
// we can encode draw pile size and extra turn in one metric, since we only have extra turns if draw pile is empty
|
||||||
id *= _initial_draw_pile_size;
|
const std::uint8_t draw_pile_size_and_extra_turns = [this]() -> uint8_t {
|
||||||
id += _weighted_draw_pile_size;
|
if(_endgame_turns_left == no_endgame) {
|
||||||
|
return _weighted_draw_pile_size + num_players;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return _endgame_turns_left;
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
|
||||||
|
id *= _initial_draw_pile_size + num_players;
|
||||||
|
id += draw_pile_size_and_extra_turns;
|
||||||
|
|
||||||
// encode positions of cards that started in hands
|
// encode positions of cards that started in hands
|
||||||
id = id << _num_useful_cards_in_starting_hands;
|
id = id << _num_useful_cards_in_starting_hands;
|
||||||
|
|
Loading…
Reference in a new issue