discrete.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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(ERC20DRK, 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(random.random()*ERC20DRK/(RND_NODES))
  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. global highest_acc
  37. experiment_accs = []
  38. exp_threads = []
  39. for i in range(0, AVG_LEN):
  40. experiment(experiment_accs, CONTROLLER_TYPE_DISCRETE, kp=kp, ki=ki, kd=kd, hp=hp)
  41. #exp_thread = Thread(target=experiment, args=[experiment_accs, CONTROLLER_TYPE_DISCRETE, kp, ki, kd])
  42. #exp_thread.start()
  43. #for thread in exp_threads:
  44. #thread.join()
  45. avg_acc = sum(experiment_accs)/float(AVG_LEN)
  46. buff = 'accuracy:{}, kp: {}, ki:{}, kd:{}'.format(avg_acc, kp, ki, kd)
  47. print(buff)
  48. if avg_acc > 0:
  49. gain = (avg_acc, (kp, ki, kd))
  50. gains += [gain]
  51. if avg_acc > highest_acc:
  52. highest_acc = avg_acc
  53. with open("highest_gain.txt", 'w') as f:
  54. f.write(buff)
  55. def single_trial_exp(gains, kp, ki, kd, hp=False):
  56. global highest_acc
  57. acc = experiment(kp=kp, ki=ki, kd=kd, hp=hp)
  58. buff = 'accuracy:{}, kp: {}, ki:{}, kd:{}'.format(acc, kp, ki, kd)
  59. print(buff)
  60. if acc > 0:
  61. gain = (acc, (kp, ki, kd))
  62. gains += [gain]
  63. if acc > highest_acc:
  64. highest_acc = acc
  65. with open("highest_gain.txt", 'w') as f:
  66. f.write(buff)
  67. gains += [gain]
  68. gains = []
  69. if __name__ == "__main__":
  70. # kp
  71. gains_threads = []
  72. ki_range = tqdm(np.arange(KI_SEARCH_START, KI_SEARCH_END, KI_STEP))
  73. kd_range = tqdm(np.arange(KD_SEARCH_START, KD_SEARCH_END, KD_STEP))
  74. kp_range = tqdm(np.arange(KP_SEARCH_START, KP_SEARCH_END, KP_STEP))
  75. for kp in kp_range:
  76. kp_range.set_description('kp: {}'.format(kp))
  77. # ki
  78. for ki in ki_range:
  79. ki_range.set_description('kp: {}, ki: {}'.format(kp, ki))
  80. # kd
  81. for kd in kd_range:
  82. kd_range.set_description('kp: {}, ki: {}, kd: {}'.format(kp, ki, kd))
  83. multi_trial_exp(gains, kp, ki, kd, hp=high_precision)
  84. #thread = Thread(target=single_trial_exp, args=[gains, kp, ki, kd])
  85. #thread.start()
  86. #gains_threads += [thread]
  87. #for th in tqdm(gains_threads):
  88. #th.join()
  89. gains=sorted(gains, key=lambda i: i[0], reverse=True)
  90. with open("gains.txt", "w") as f:
  91. buff=''
  92. for gain in gains:
  93. line=str(gain[0])+',' +','.join([str(i) for i in gain[1]])+'\n'
  94. buff+=line
  95. f.write(buff)