main.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. from lottery import *
  2. from threading import Thread
  3. AVG_LEN = 3
  4. KP_STEP=0.05
  5. KP_SEARCH_START=-0.1
  6. KP_SEARCH_END=0.3
  7. KI_STEP=0.05
  8. KI_SEARCH_START=-0.1
  9. KI_SEARCH_END=0.1
  10. KD_STEP=0.05
  11. KD_SEARCH_START=-0.2
  12. KD_SEARCH_END=0.2
  13. EPSILON=0.0001
  14. RUNNING_TIME=1000
  15. #AIRDROP=1000
  16. NODES=1000
  17. high_precision_str = input("high precision arith (slooow) (y/n):")
  18. high_precision = True if high_precision_str.lower()=="y" else False
  19. randomize_nodes_str = input("randomize number of nodes (y/n):")
  20. randomize_nodes = True if randomize_nodes_str.lower()=="y" else False
  21. rand_running_time_str = input("random running time (y/n):")
  22. rand_running_time = True if rand_running_time_str.lower()=="y" else False
  23. debug_str = input("debug mode (y/n):")
  24. debug = True if debug_str.lower()=="y" else False
  25. def experiment(accs=[], controller_type=CONTROLLER_TYPE_DISCRETE, kp=0, ki=0, kd=0, airdrop=0, hp=False):
  26. dt = DarkfiTable(0, RUNNING_TIME, controller_type, kp=kp, ki=ki, kd=kd)
  27. RND_NODES = random.randint(5, NODES) if randomize_nodes else NODES
  28. for idx in range(0,RND_NODES):
  29. darkie = Darkie(airdrop+idx)
  30. dt.add_darkie(darkie)
  31. acc = dt.background(rand_running_time, hp)
  32. accs+=[acc]
  33. return acc
  34. highest_acc = 0
  35. def multi_trial_exp(gains, kp, ki, kd, hp=False):
  36. experiment_accs = []
  37. exp_threads = []
  38. for i in range(0, AVG_LEN):
  39. experiment(experiment_accs, CONTROLLER_TYPE_DISCRETE, kp=kp, ki=ki, kd=kd, hp=hp)
  40. #exp_thread = Thread(target=experiment, args=[experiment_accs, CONTROLLER_TYPE_DISCRETE, kp, ki, kd])
  41. #exp_thread.start()
  42. #for thread in exp_threads:
  43. #thread.join()
  44. avg_acc = sum(experiment_accs)/float(AVG_LEN)
  45. buff = 'accuracy:{}, kp: {}, ki:{}, kd:{}'.format(avg_acc, kp, ki, kd)
  46. print(buff)
  47. if avg_acc > 0:
  48. gain = (avg_acc, (kp, ki, kd))
  49. gains += [gain]
  50. if avg_acc > highest_acc:
  51. highest_acc = avg_acc
  52. with open("highest_gain.txt", 'w') as f:
  53. f.write(buff)
  54. def single_trial_exp(gains, kp, ki, kd, hp=False):
  55. acc = experiment(kp=kp, ki=ki, kd=kd, hp=hp)
  56. buff = 'accuracy:{}, kp: {}, ki:{}, kd:{}'.format(acc, kp, ki, kd)
  57. print(buff)
  58. if acc > 0:
  59. gain = (acc, (kp, ki, kd))
  60. gains += [gain]
  61. if acc > highest_acc:
  62. highest_acc = acc
  63. with open("highest_gain.txt", 'w') as f:
  64. f.write(buff)
  65. gains += [gain]
  66. gains = []
  67. if __name__ == "__main__":
  68. # kp
  69. gains_threads = []
  70. ki_range = tqdm(np.arange(KI_SEARCH_START, KI_SEARCH_END, KI_STEP))
  71. kd_range = tqdm(np.arange(KD_SEARCH_START, KD_SEARCH_END, KD_STEP))
  72. kp_range = tqdm(np.arange(KP_SEARCH_START, KP_SEARCH_END, KP_STEP))
  73. for kp in kp_range:
  74. kp_range.set_description('kp: {}'.format(kp))
  75. # ki
  76. for ki in ki_range:
  77. ki_range.set_description('kp: {}, ki: {}'.format(kp, ki))
  78. # kd
  79. for kd in kd_range:
  80. kd_range.set_description('kp: {}, ki: {}, kd: {}'.format(kp, ki, kd))
  81. multi_trial_exp(gains, kp, ki, kd, hp=high_precision)
  82. #thread = Thread(target=single_trial_exp, args=[gains, kp, ki, kd])
  83. #thread.start()
  84. #gains_threads += [thread]
  85. #for th in tqdm(gains_threads):
  86. #th.join()
  87. gains=sorted(gains, key=lambda i: i[0], reverse=True)
  88. with open("gains.txt", "w") as f:
  89. buff=''
  90. for gain in gains:
  91. line=str(gain[0])+',' +','.join([str(i) for i in gain[1]])+'\n'
  92. buff+=line
  93. f.write(buff)