From d21b27d2673fdee35e7fe6b245a127b132cf4336 Mon Sep 17 00:00:00 2001 From: washim-uddin-mondal <74007561+washim-uddin-mondal@users.noreply.github.com> Date: Wed, 7 Sep 2022 17:39:16 -0400 Subject: [PATCH] first-upload --- .gitignore | 4 + Display/Fig1a.png | Bin 0 -> 21468 bytes Display/Fig1b.png | Bin 0 -> 16853 bytes Main.py | 80 ++++++++++ Models/Actor.pkl | Bin 0 -> 9047 bytes README.md | 35 +++++ Scripts/Algorithm.py | 341 ++++++++++++++++++++++++++++++++++++++++++ Scripts/Parameters.py | 35 +++++ 8 files changed, 495 insertions(+) create mode 100644 .gitignore create mode 100644 Display/Fig1a.png create mode 100644 Display/Fig1b.png create mode 100644 Main.py create mode 100644 Models/Actor.pkl create mode 100644 README.md create mode 100644 Scripts/Algorithm.py create mode 100644 Scripts/Parameters.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c5b5606 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +Results/ +.DS_Store +.idea/ +Scripts/__pycache__/ \ No newline at end of file diff --git a/Display/Fig1a.png b/Display/Fig1a.png new file mode 100644 index 0000000000000000000000000000000000000000..41bd0c33061fcad71a9edffc71c6004ac3707adf GIT binary patch literal 21468 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 DhM(RU literal 0 HcmV?d00001 diff --git a/Display/Fig1b.png b/Display/Fig1b.png new file mode 100644 index 0000000000000000000000000000000000000000..beb5a31612a98935d3ca42ebdf4925376f514966 GIT binary patch literal 16853 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 MV*J-&{hxLJ2gp?bI{*Lx literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..e9458d4 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# Introduction + +This repository contains codes that are used for generating numerical results in the following paper: + +"On the Near-Optimality of Local Policies in Large Cooperative +Multi-Agent Reinforcement Learning", Transactions on Machine Learning Research, 2022. + +# Parameters + +Various parameters used in the experiments can be found in Scripts/Parameters.py file. + +# Results + +Generated results will be stored in Results folder (will be created on the fly). +Some pre-generated results are available for display in the Display folder. Specifically, +Fig. 1 depicts the percentage error between the values generated by local and non-local policies in an N-agent system +as a function of N. + +# Run Experiments + +``` +python3 Main.py +``` + +# Command Line Options + +Various command line options are given below: + +``` +--train : if training is required from scratch, otherwise a pre-trained model will be used +--minN : minimum value of N +--numN : number of N values +--divN : difference between two consecutive N values +--maxSeed: number of random seeds +``` \ No newline at end of file diff --git a/Scripts/Algorithm.py b/Scripts/Algorithm.py new file mode 100644 index 0000000..89fa20b --- /dev/null +++ b/Scripts/Algorithm.py @@ -0,0 +1,341 @@ +import torch +import torch.optim as optim +import torch.nn.functional as F +import torch.nn as nn +from torch.distributions.categorical import Categorical +import os +import copy + + +class Actor(nn.Module): + def __init__(self, state_size, action_size, hidden_size=32): + super(Actor, self).__init__() + self.state_size = 2*state_size # one-hot state + mean-distribution + self.action_size = action_size + self.hidden_size = hidden_size + self.linear1 = nn.Linear(self.state_size, self.hidden_size) + self.linear2 = nn.Linear(self.hidden_size, self.hidden_size) + self.linear3 = nn.Linear(self.hidden_size, self.action_size) + + def forward(self, state, state_dist): + state_joined = torch.cat([state, state_dist]) + output = F.relu(self.linear1(state_joined)) + output = F.relu(self.linear2(output)) + output = F.softmax(self.linear3(output), dim=-1) + return output + + +def train(args): + actor = Actor(args.num_states, args.num_actions, args.hidden_size) + NumActParam = 2*args.num_states * args.hidden_size + args.hidden_size + args.hidden_size**2 + args.hidden_size + args.hidden_size*args.num_actions + args.num_actions + optimizer = optim.Adam(list(actor.parameters())) + + # Floating point representation of states + states_float = torch.tensor(range(0, args.num_states)).float() + + for j in range(args.J): + + w = torch.zeros(NumActParam) + w_avg = torch.zeros(NumActParam) + + for _ in range(args.L): + + # Initial state distribution + curr_state_dist = torch.ones(args.num_states) / args.num_states + curr_state = Categorical(curr_state_dist).sample().long() + + """ ------------ Sampling (x, mu, u) ------------ """ + FLAG = False + while not FLAG: + if torch.rand(1) > args.gamma: + FLAG = True + """ --------- Update Subroutine -------------- """ + + """ ------------ Current State ------------------- """ + curr_state_one_hot = torch.zeros(args.num_states) + curr_state_one_hot[curr_state] = 1 + + """ ------------- Mean of Current State Distribution ------------- """ + curr_state_dist_mean = torch.dot(states_float, curr_state_dist) + + """ ------------- Current Action ------------------ """ + policy = Categorical(actor(curr_state_one_hot, curr_state_dist)) + curr_action = policy.sample().long() + + """ ------------- Next State --------------- """ + fraction = 1 - (curr_state_dist_mean/args.num_states) + if curr_action == 0: + next_state = curr_state + else: + chi = torch.rand(1) + next_state = curr_state + (chi * fraction * (args.num_states - 1 - curr_state)).long() + next_state_one_hot = torch.zeros(args.num_states) + next_state_one_hot[next_state] = 1 + + """ -------------- Next State Distribution ------------- """ + + next_state_dist = torch.zeros(args.num_states) + for state_t in range(0, args.num_states): + one_hot_state_t = torch.zeros(args.num_states) + one_hot_state_t[state_t] = 1 + + for action_t in range(0, args.num_actions): + dist_vec = torch.zeros(args.num_states) + if action_t == 0: + dist_vec[state_t] = 1 + else: + prob_mass = 1/(fraction * (args.num_states - 1 - state_t)) + total_prob = torch.tensor(1.0) + state_t_plus_1 = state_t + while total_prob > 0 and state_t_plus_1 < args.num_states: + dist_vec[state_t_plus_1] = torch.minimum(prob_mass, total_prob) + total_prob -= torch.minimum(prob_mass, total_prob) + state_t_plus_1 += 1 + + prob = actor(one_hot_state_t, curr_state_dist)[action_t] * curr_state_dist[state_t] + next_state_dist += dist_vec * prob + + """ --------------------- Update ------------------ """ + curr_state = copy.copy(next_state) + curr_state_dist = copy.copy(next_state_dist) + + """ ------------ Sampling Advantage Functions ---------- """ + FLAG = False + SumRewards = torch.tensor([0.]) + + while not FLAG: + if torch.rand(1) > args.gamma: + FLAG = True + """ --------- Update Subroutine -------------- """ + + """ ------------ Current State ------------------- """ + curr_state_one_hot = torch.zeros(args.num_states) + curr_state_one_hot[curr_state] = 1 + + """ ------------- Mean of Current State Distribution ------------- """ + curr_state_dist_mean = torch.dot(states_float, curr_state_dist) + + """ ------------- Current Action ------------------ """ + policy = Categorical(actor(curr_state_one_hot, curr_state_dist)) + curr_action = policy.sample().long() + + """ ------------- Next State --------------- """ + fraction = 1 - (curr_state_dist_mean/args.num_states) + if curr_action == 0: + next_state = curr_state + else: + chi = torch.rand(1) + next_state = curr_state + (chi * fraction * (args.num_states - 1 - curr_state)).long() + next_state_one_hot = torch.zeros(args.num_states) + next_state_one_hot[next_state] = 1 + + """ -------------- Next State Distribution ------------- """ + + next_state_dist = torch.zeros(args.num_states) + for state_t in range(0, args.num_states): + one_hot_state_t = torch.zeros(args.num_states) + one_hot_state_t[state_t] = 1 + + for action_t in range(0, args.num_actions): + dist_vec = torch.zeros(args.num_states) + if action_t == 0: + dist_vec[state_t] = 1 + else: + prob_mass = 1/(fraction * (args.num_states - 1 - state_t)) + total_prob = torch.tensor(1.0) + state_t_plus_1 = state_t + while total_prob > 0 and state_t_plus_1 < args.num_states: + dist_vec[state_t_plus_1] = torch.minimum(prob_mass, total_prob) + total_prob -= torch.minimum(prob_mass, total_prob) + state_t_plus_1 += 1 + + prob = actor(one_hot_state_t, curr_state_dist)[action_t] * curr_state_dist[state_t] + next_state_dist += dist_vec * prob + + """ -------------- SumRewards Update ---------- """ + SumRewards += args.alpha_r * curr_state - args.beta_r * curr_state_dist_mean - args.lambda_r * curr_action + + """ --------------------- Update ------------------ """ + curr_state = copy.copy(next_state) + curr_state_dist = copy.copy(next_state_dist) + + Value_R = 0 + Q_R = 0 + + if torch.rand(1) < 0.5: + Value_R = SumRewards + else: + Q_R = SumRewards + + Advantage_R = 2*(Q_R-Value_R) + + # Gradient Update for the Sub-Problem + log_prob = policy.log_prob(curr_action) + optimizer.zero_grad() + log_prob.backward() + + phi_grads = [] + for f in actor.parameters(): + phi_grads.append(f.grad.view(-1)) + phi_grads = torch.cat(phi_grads) + + h_grads = (torch.dot(w, phi_grads)-Advantage_R)*phi_grads + + w = w - args.alpha * h_grads + w_avg += w/args.L + + count = 0 + for phi in actor.parameters(): + phi.data -= (args.eta/(1-args.gamma))*w_avg[count] + count += 1 + + if not os.path.exists('Models'): + os.mkdir('Models') + torch.save(actor.state_dict(), f'Models/Actor.pkl') + + +def evaluateMARLLocal(args, N): + actor = Actor(args.num_states, args.num_actions) + + if not os.path.exists(f'Models/Actor.pkl'): + raise ValueError('Model does not exist.') + actor.load_state_dict(torch.load(f'Models/Actor.pkl')) + + # Initial state distribution + init_state_dist = torch.ones(args.num_states)/args.num_states + + # Initial infinite population mean-field state distribution + curr_mf_state_dist = torch.ones(args.num_states) / args.num_states + + # Current Joint State + curr_joint_state = Categorical(init_state_dist).sample([N]).long() + next_joint_state = torch.zeros(N).long() + + # Floating point representation of states + states_float = torch.tensor(range(0, args.num_states)).float() + + # Doubly Stochastic Interaction Matrix + W = torch.ones([N, N])/N + + ValueRewardMARL = 0 + curr_gamma = 1 + + for iter_count in range(args.run_eval): + curr_average_reward = 0 + + curr_joint_state_one_hot = torch.zeros([N, args.num_states]) + curr_joint_state_one_hot[range(0, N), curr_joint_state] = 1 + + curr_state_dist = torch.matmul(W, curr_joint_state_one_hot) + + for agent_index in range(0, N): + agent_state = curr_joint_state[agent_index] + agent_state_one_hot = curr_joint_state_one_hot[agent_index, :] + agent_state_dist = curr_state_dist[agent_index, :] + agent_state_dist_mean = torch.dot(states_float, agent_state_dist) + """ ------- Local Policy --------- """ + agent_action = Categorical(actor(agent_state_one_hot, curr_mf_state_dist)).sample() + + agent_reward = args.alpha_r * agent_state - args.beta_r * agent_state_dist_mean - args.lambda_r * agent_action + curr_average_reward += agent_reward/N + + # Next State for the agent + if agent_action == 1: + chi = torch.rand(1) + fraction = 1 - (agent_state_dist_mean/args.num_states) + next_joint_state[agent_index] = curr_joint_state[agent_index] + (chi*fraction*(args.num_states - 1 - curr_joint_state[agent_index])).long() + else: + next_joint_state[agent_index] = curr_joint_state[agent_index] + + ValueRewardMARL += curr_gamma*args.gamma*curr_average_reward + curr_gamma *= args.gamma + + """ --------------- Mean-Field Update ------------ """ + curr_mf_state_dist_mean = torch.dot(states_float, curr_mf_state_dist) + mf_fraction = 1 - (curr_mf_state_dist_mean / args.num_states) + + next_mf_state_dist = torch.zeros(args.num_states) + + for state_t in range(0, args.num_states): + one_hot_state_t = torch.zeros(args.num_states) + one_hot_state_t[state_t] = 1 + + for action_t in range(0, args.num_actions): + dist_vec = torch.zeros(args.num_states) + if action_t == 0: + dist_vec[state_t] = 1 + else: + prob_mass = 1 / (mf_fraction * (args.num_states - 1 - state_t)) + total_prob = torch.tensor(1.0) + state_t_plus_1 = state_t + while total_prob > 0 and state_t_plus_1 < args.num_states: + dist_vec[state_t_plus_1] = torch.minimum(prob_mass, total_prob) + total_prob -= torch.minimum(prob_mass, total_prob) + state_t_plus_1 += 1 + + prob = actor(one_hot_state_t, curr_mf_state_dist)[action_t] * curr_mf_state_dist[state_t] + next_mf_state_dist += dist_vec * prob + + """ ----------- Update -------------------- """ + curr_joint_state = copy.copy(next_joint_state) + curr_mf_state_dist = copy.copy(next_mf_state_dist) + + return ValueRewardMARL + + +def evaluateMARLNonLocal(args, N): + actor = Actor(args.num_states, args.num_actions) + + if not os.path.exists(f'Models/Actor.pkl'): + raise ValueError('Model does not exist.') + actor.load_state_dict(torch.load(f'Models/Actor.pkl')) + + # Initial state distribution + init_state_dist = torch.ones(args.num_states)/args.num_states + + # Current Joint State + curr_joint_state = Categorical(init_state_dist).sample([N]).long() + next_joint_state = torch.zeros(N).long() + + # Floating point representation of states + states_float = torch.tensor(range(0, args.num_states)).float() + + # Doubly Stochastic Interaction Matrix + W = torch.ones([N, N])/N + + ValueRewardMARL = 0 + curr_gamma = 1 + + for iter_count in range(args.run_eval): + curr_average_reward = 0 + + curr_joint_state_one_hot = torch.zeros([N, args.num_states]) + curr_joint_state_one_hot[range(0, N), curr_joint_state] = 1 + + curr_state_dist = torch.matmul(W, curr_joint_state_one_hot) + + for agent_index in range(0, N): + agent_state = curr_joint_state[agent_index] + agent_state_one_hot = curr_joint_state_one_hot[agent_index, :] + agent_state_dist = curr_state_dist[agent_index, :] + agent_state_dist_mean = torch.dot(states_float, agent_state_dist) + agent_action = Categorical(actor(agent_state_one_hot, agent_state_dist)).sample() + + agent_reward = args.alpha_r * agent_state - args.beta_r * agent_state_dist_mean - args.lambda_r * agent_action + curr_average_reward += agent_reward/N + + # Next State for the agent + if agent_action == 1: + chi = torch.rand(1) + fraction = 1 - (agent_state_dist_mean/args.num_states) + next_joint_state[agent_index] = curr_joint_state[agent_index] + (chi*fraction*(args.num_states - 1 - curr_joint_state[agent_index])).long() + else: + next_joint_state[agent_index] = curr_joint_state[agent_index] + + ValueRewardMARL += curr_gamma*args.gamma*curr_average_reward + curr_gamma *= args.gamma + + """ ----------- State Update -------------------- """ + curr_joint_state = copy.copy(next_joint_state) + + return ValueRewardMARL diff --git a/Scripts/Parameters.py b/Scripts/Parameters.py new file mode 100644 index 0000000..b4f4b0d --- /dev/null +++ b/Scripts/Parameters.py @@ -0,0 +1,35 @@ +import argparse + + +def ParseInput(): + parser = argparse.ArgumentParser() + parser.add_argument('--train', action='store_true', help='enable training') + + """ ---------- Simulation Parameters ---------- """ + parser.add_argument('--minN', type=int, default=5, dest='minN', help='minimumN') + parser.add_argument('--numN', type=int, default=20, dest='numN', help='numberN') + parser.add_argument('--divN', type=int, default=5, dest='divN', help='divisionN') + parser.add_argument('--maxSeed', type=int, default=25, dest='maxSeed', help='numberSeed') + + args = parser.parse_args() + + """ ---------- Algorithm Hyperparameters ------- """ + + args.num_actions = 2 + args.num_states = 10 + args.J = 10 ** 2 # Number of iterations for training the neural network based policy + args.L = 10 ** 2 + args.run_eval = 10 ** 2 # Number of iterations for evaluating a policy + args.gamma = 0.9 # Discount factor + + """ --------- Reward Parameters --------- """ + args.alpha_r = 1 + args.beta_r = 0.5 + args.lambda_r = 0.5 + + """----------- Learning Parameters --------- """ + args.alpha = 10**-3 + args.eta = 10**-3 + args.hidden_size = 32 + + return args