crawler.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. from lottery import *
  2. AVG_LEN = 3
  3. KP_STEP=0.01
  4. KP_SEARCH=0.5
  5. KI_STEP=0.01
  6. KI_SEARCH=0.05
  7. KD_STEP=0.01
  8. KD_SEARCH=-0.36
  9. EPSILON=0.0001
  10. RUNNING_TIME=100
  11. #AIRDROP=1000
  12. NODES=500
  13. highest_acc = 0
  14. KP='kp'
  15. KI='ki'
  16. KD='kd'
  17. crawl = KP
  18. crawl_str = input("crawl (kp/ki/kd):")
  19. if crawl_str == KI:
  20. crawl=KI
  21. elif crawl_str == KD:
  22. crawl=KD
  23. high_precision_str = input("high precision arith (slooow) (y/n):")
  24. high_precision = True if high_precision_str.lower()=="y" else False
  25. randomize_nodes_str = input("randomize number of nodes (y/n):")
  26. randomize_nodes = True if randomize_nodes_str.lower()=="y" else False
  27. rand_running_time_str = input("random running time (y/n):")
  28. rand_running_time = True if rand_running_time_str.lower()=="y" else False
  29. debug_str = input("debug mode (y/n):")
  30. debug = True if debug_str.lower()=="y" else False
  31. def experiment(accs=[], controller_type=CONTROLLER_TYPE_DISCRETE, kp=0, ki=0, kd=0, distribution=[], hp=False):
  32. dt = DarkfiTable(sum(distribution), RUNNING_TIME, controller_type, kp=kp, ki=ki, kd=kd)
  33. RND_NODES = random.randint(5, NODES) if randomize_nodes else NODES
  34. for idx in range(0,RND_NODES):
  35. darkie = Darkie(distribution[idx])
  36. dt.add_darkie(darkie)
  37. acc = dt.background(rand_running_time, hp)
  38. print('acc: {}'.format(acc))
  39. accs+=[acc]
  40. return acc
  41. def multi_trial_exp(gains, kp, ki, kd, distribution = [], hp=False):
  42. global highest_acc
  43. accs = []
  44. for i in range(0, AVG_LEN):
  45. acc = experiment(accs, CONTROLLER_TYPE_DISCRETE, kp=kp, ki=ki, kd=kd, distribution=distribution, hp=hp)
  46. accs += [acc]
  47. avg_acc = sum(accs)/float(AVG_LEN)
  48. buff = 'accuracy:{}, kp: {}, ki:{}, kd:{}'.format(avg_acc, kp, ki, kd)
  49. print(buff)
  50. if avg_acc > 0:
  51. gain = (avg_acc, (kp, ki, kd))
  52. gains += [gain]
  53. if avg_acc > highest_acc:
  54. highest_acc = avg_acc
  55. with open("highest_gain.txt", 'w') as f:
  56. f.write(buff)
  57. def single_trial_exp(gains, kp, ki, kd, distribution=[], hp=False):
  58. global highest_acc
  59. acc = experiment(kp=kp, ki=ki, kd=kd, distribution=distribution, hp=hp)
  60. buff = 'accuracy:{}, kp: {}, ki:{}, kd:{}'.format(acc, kp, ki, kd)
  61. print(buff)
  62. if acc > 0:
  63. gain = (acc, (kp, ki, kd))
  64. gains += [gain]
  65. if acc > highest_acc:
  66. highest_acc = acc
  67. with open("highest_gain.txt", 'w') as f:
  68. f.write(buff)
  69. gains += [gain]
  70. gains = []
  71. if __name__ == "__main__":
  72. crawl_range = None
  73. start = None
  74. if crawl==KP:
  75. start = KP_SEARCH
  76. step = KP_STEP
  77. elif crawl==KI:
  78. start = KI_SEARCH
  79. step = KI_STEP
  80. elif crawl==KD:
  81. start = KD_SEARCH
  82. step = KD_STEP
  83. step = 0.01
  84. rhs = np.arange(start, start*3, step) if start>=0 else np.arange(start*3, start, step)
  85. lhs = np.flip(np.arange(-3*start, start, step)) if start<0 else np.flip(np.arange(start, -3*start, step))
  86. crawl_range=tqdm(np.concatenate((rhs, lhs)))
  87. distribution = [random.random() for i in range(NODES)]
  88. for i in crawl_range:
  89. crawl_range.set_description("crawling {} at {}".format(crawl, i))
  90. kp = i if crawl==KP else KP_SEARCH
  91. ki = i if crawl==KI else KI_SEARCH
  92. kd = i if crawl==KD else KD_SEARCH
  93. multi_trial_exp(gains, kp, ki, kd, distribution, hp=high_precision)
  94. gains=sorted(gains, key=lambda i: i[0], reverse=True)
  95. with open("gains.txt", "w") as f:
  96. buff=''
  97. for gain in gains:
  98. line=str(gain[0])+',' +','.join([str(i) for i in gain[1]])+'\n'
  99. buff+=line
  100. f.write(buff)