Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save DiogenesAnalytics/5cb230aa79ce09ec1331e2a5f51c53b8 to your computer and use it in GitHub Desktop.
Save DiogenesAnalytics/5cb230aa79ce09ec1331e2a5f51c53b8 to your computer and use it in GitHub Desktop.
Sun Bin's, the descendant of Sun Tzu, generalized solution for how General Tianji should race his horses against the King of Qi.
"""
References:
+ Shu, J. (2012). On Generalized Tian Ji's Horse Racing Strategy.
Interdisciplinary Science Reviews, 37, 187 - 193.
+ Leng, M., & Parlar, M. (2006). Game-theoretic analysis of an ancient Chinese
horse race problem. Comput. Oper. Res., 33, 2033-2055.
"""
def get_horses(n):
for horse in range(1, n+1):
yield horse
def get_strategy(n):
# g(x), h(x), and f(x) definitions
g = lambda x: x - 1
h = lambda x, n: n * (0 ** (x - 1))
f = lambda x, n: g(x) + h(x, n)
# use generator for horses
for horse in get_horses(n):
# calculate optimal horse pairs
yield (horse, f(horse, n))
def print_choice(n):
# loop over choice pairs
for matches in get_strategy(n):
# pretty print matches
print(f'race: {matches[0]:{len(str(n))}} -> {matches[1]}')
# executable
if __name__ == '__main__':
# get argparsing lib
import argparse
# describe
parser = argparse.ArgumentParser(
description='Calculate optimal horse racing strategy.'
)
# add arguments
parser.add_argument('horses', metavar='n', type=int,
help='number of horses to race')
# now get args
args = parser.parse_args()
# finally execute
print_choice(args.horses)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment