165 lines
5.7 KiB
Python
165 lines
5.7 KiB
Python
import random
|
|
import numpy as np
|
|
import copy
|
|
import time
|
|
from OptimalBTExpansionAlgorithm_cond2act import Action,generate_random_state,state_transition
|
|
from Examples import *
|
|
import os
|
|
output_path = os.path.join(os.path.dirname(__file__), "outputs")
|
|
|
|
from tools import print_action_data_table,BTTest_act_start_goal
|
|
# from tools import print_action_data_table,BTTest,BTTest_act_start_goal,get_act_start_goal
|
|
|
|
|
|
def get_act_start_goal(seed=1, literals_num=10, depth=10, iters=10, total_count=1000,pre_max=10000):
|
|
|
|
literals_num_set = {i for i in range(literals_num)}
|
|
|
|
act_list = []
|
|
start_list = []
|
|
goal_list = []
|
|
total_action_num=[]
|
|
total_state_num=[]
|
|
|
|
total_time_dic = {"start_to_goal": 0,
|
|
"random_act":0}
|
|
start_time_0=time.time()
|
|
for count in range(total_count):
|
|
# 生成一个规划问题,包括随机的状态和行动,以及目标状态
|
|
action_num = 1
|
|
states = []
|
|
actions = []
|
|
start = generate_random_state(literals_num)
|
|
state_set = {i for i in range(literals_num)}
|
|
state = copy.deepcopy(start)
|
|
states.append(state)
|
|
# print (state)
|
|
|
|
for i in range(0, depth):
|
|
a = Action()
|
|
# a.generate_from_state_local(state, literals_num_set,pre_max)
|
|
a.generate_from_state_local(state, literals_num_set)
|
|
a.cost = random.randint(1, 100)
|
|
if not a in actions:
|
|
a.name = "a" + str(action_num)
|
|
action_num += 1
|
|
actions.append(a)
|
|
state = state_transition(state, a)
|
|
if state in states:
|
|
pass
|
|
else:
|
|
states.append(state)
|
|
# print(state)
|
|
goal = states[-1]
|
|
|
|
k_act_total = int(iters* (2 / 3)/depth)
|
|
|
|
if k_act_total<1:
|
|
k_act_total = random.randint(1, 2)
|
|
|
|
# for k in range(int(iters/depth)):
|
|
for k in range(k_act_total):
|
|
depth_random = random.randint(depth, depth+10)
|
|
for i in range(0, depth - 1):
|
|
a = Action()
|
|
|
|
start_time = time.time()
|
|
# a.generate_from_state_local(state, literals_num_set,pre_max)
|
|
a.generate_from_state_local(state, literals_num_set)
|
|
end_time = time.time()
|
|
total_time_dic["start_to_goal"] += end_time - start_time
|
|
|
|
a.cost = random.randint(1, 100)
|
|
if not a in actions:
|
|
a.name = "a" + str(action_num)
|
|
action_num += 1
|
|
actions.append(a)
|
|
state = state_transition(state, a)
|
|
if state in states:
|
|
pass
|
|
else:
|
|
states.append(state)
|
|
|
|
if not goal <= states[-1]:
|
|
a = Action()
|
|
|
|
# if len(states[-1])==0:
|
|
# a.pre=set()
|
|
# else:
|
|
pre_num = random.randint(0, min(pre_max,len(states[-1])))
|
|
# a.pre = set(np.random.choice(list(states[-1]), pre_num, replace=False))
|
|
a.pre = set(random.sample(states[-1], pre_num))
|
|
|
|
a.add = goal - states[-1]
|
|
def_set = state_set - goal
|
|
|
|
# if len(def_set)==0:
|
|
# a.del_set=set()
|
|
# else:
|
|
def_num = random.randint(0, len(def_set))
|
|
# a.del_set = set(np.random.choice(list(def_set), def_num, replace=False))
|
|
a.del_set = set(random.sample(def_set, def_num))
|
|
|
|
a.cost = random.randint(1, 100)
|
|
a.name = "a" + str(action_num)
|
|
action_num += 1
|
|
actions.append(a)
|
|
|
|
|
|
|
|
|
|
state = copy.deepcopy(start)
|
|
for i in range(0, int(iters* (2 / 3))):
|
|
a = Action()
|
|
|
|
start_time = time.time()
|
|
# a.generate_from_state_local(state, literals_num_set,pre_max)
|
|
a.generate_from_state_local(state, literals_num_set)
|
|
end_time = time.time()
|
|
total_time_dic["random_act"] += end_time - start_time
|
|
|
|
if not a in actions:
|
|
a.name = "a" + str(action_num)
|
|
action_num += 1
|
|
actions.append(a)
|
|
state = state_transition(state, a)
|
|
if state in states:
|
|
pass
|
|
else:
|
|
states.append(state)
|
|
state = random.sample(states, 1)[0]
|
|
|
|
|
|
act_list.append(actions)
|
|
start_list.append(start)
|
|
goal_list.append(goal)
|
|
|
|
total_action_num.append(len(actions))
|
|
total_state_num.append(len(states))
|
|
|
|
end_time_0=time.time()
|
|
|
|
print("Total Time:", end_time_0-start_time_0)
|
|
print("Total Time (start_to_goal):", total_time_dic["start_to_goal"])
|
|
print("Total Time (random_act):",total_time_dic["random_act"])
|
|
print("Average Number of States:", np.mean(total_state_num)) # 1000次问题的平均状态数
|
|
print("Average Number of Actions", np.mean(total_action_num)) # 1000次问题的平均行动数
|
|
# print_action_data_table(goal, start, list(actions))
|
|
return act_list, start_list, goal_list
|
|
|
|
|
|
|
|
# # 设置生成规划问题集的超参数:文字数、解深度、迭代次数
|
|
seed = 1
|
|
random.seed(1)
|
|
np.random.seed(1)
|
|
literals_num = 3
|
|
depth = 3
|
|
iters = 3
|
|
|
|
# total_count = 5
|
|
act_list, start_list, goal_list = get_act_start_goal(seed=seed, literals_num=literals_num, depth=depth, iters=iters,
|
|
total_count=1000,pre_max=10000)
|
|
BTTest_act_start_goal(bt_algo_opt=True, act_list=act_list, start_list=start_list, goal_list=goal_list)
|
|
# BTTest_act_start_goal(bt_algo_opt=False, act_list=act_list, start_list=start_list, goal_list=goal_list)
|