crawler.py 3.8 KB

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