-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlearn.m
More file actions
36 lines (30 loc) · 1.5 KB
/
Copy pathlearn.m
File metadata and controls
36 lines (30 loc) · 1.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
function [mc] = learn(mc,task,settings,g)
%function simulating the Q-learning of each system
%% calc PEs for each system
for i = 1:settings.nsystems
%% get chosen Q value of system
q_val_chosen = [];
if mc.dims(i) == 1
q_val_chosen = mc.Q{i}(task.chosenstimulus(1,g),end);
elseif mc.dims(i) == 2
q_val_chosen = mc.Q{i}(task.chosenstimulus(1,g),task.chosenstimulus(2,g),end);
elseif mc.dims(i) == 3
q_val_chosen = mc.Q{i}(task.chosenstimulus(1,g),task.chosenstimulus(2,g),task.chosenstimulus(3,g),end);
else
error('undefined model')
end
mc.pe{i}(g) = task.outcome(g) - q_val_chosen;
%% update Q value for chosen state
if mc.dims(i) == 1
mc.Q{i}(:,end+1) = mc.Q{i}(:,end);
mc.Q{i}(task.chosenstimulus(1,g),end) = mc.Q{i}(task.chosenstimulus(1,g),end) + settings.alpha * mc.pe{i}(g);
elseif mc.dims(i) == 2
mc.Q{i}(:,:,end+1) = mc.Q{i}(:,:,end);
mc.Q{i}(task.chosenstimulus(1,g), task.chosenstimulus(2,g),end) = mc.Q{i}(task.chosenstimulus(1,g), task.chosenstimulus(2,g),end) + settings.alpha * mc.pe{i}(g);
elseif mc.dims(i) == 3
mc.Q{i}(:,:,:,end+1) = mc.Q{i}(:,:,:,end);
mc.Q{i}(task.chosenstimulus(1,g), task.chosenstimulus(2,g),task.chosenstimulus(3,g), end) = mc.Q{i}(task.chosenstimulus(1,g), task.chosenstimulus(2,g), task.chosenstimulus(3,g), end) + settings.alpha * mc.pe{i}(g);
else
error('undefined model')
end
end