I am writing a code for demand side management using game theory .But I am getting some errors in calculate utility line.

5 views (last 30 days)
% Define the number of players (consumers) and their strategies
numPlayers = 5;
numStrategies = 2; % Two strategies: Reduce consumption or maintain current consumption
% Define the payoffs matrix (how much each player gets based on their choice and others' choices)
payoffs = rand(numStrategies, numStrategies);
% Initialize players' strategies randomly
playerStrategies = randi([1, numStrategies], 1, numPlayers);
% Define a function to calculate each player's utility based on their strategy and others' strategies
calculateUtility = @(playerId, strategies) sum(payoffs(strategies(playerId), setdiff(1:numPlayers, playerId)));
% Number of iterations for the game
numIterations = 100;
% Play the game for a number of iterations
for iteration = 1:numIterations
newStrategies = playerStrategies;
for playerId = 1:numPlayers
% Evaluate the utility of switching strategies
currentUtility = calculateUtility(playerId, playerStrategies);
% Try switching to a random strategy and evaluate the utility
newStrategy = randi([1, numStrategies]);
newStrategies(playerId) = newStrategy;
newUtility = calculateUtility(playerId, newStrategies);
% Decide whether to switch or not based on utility
if newUtility > currentUtility
playerStrategies(playerId) = newStrategy;
end
end
end
Index in position 2 exceeds array bounds. Index must not exceed 2.

Error in solution>@(playerId,strategies)sum(payoffs(strategies(playerId),setdiff(1:numPlayers,playerId))) (line 12)
calculateUtility = @(playerId, strategies) sum(payoffs(strategies(playerId), setdiff(1:numPlayers, playerId)));
% Display the final strategies chosen by the players
disp('Final player strategies:');
disp(playerStrategies);

Answers (1)

recent works
recent works on 8 Sep 2023
Edited: Walter Roberson on 29 Oct 2023
The error message is saying that the index 2 exceeds the array bounds. This is because the setdiff() function returns a vector with all the elements from the first vector that are not in the second vector. So, the setdiff(1:numPlayers, playerId) function will return a vector with all the players except for playerId.
The sum() function then tries to sum the elements in the payoffs matrix at the index of playerId and the index of the first element in the setdiff() vector. However, the index of playerId is 2, and the first element in the setdiff() vector is 1. So, the index 2 exceeds the array bounds of the payoffs matrix.
To fix this error, you can change the sum() function to max(). This will ensure that the utility of each player is always calculated correctly, even if they are the only player in the game.
% Define the number of players (consumers) and their strategies
numPlayers = 5;
numStrategies = 2; % Two strategies: Reduce consumption or maintain current consumption
% Define the payoffs matrix (how much each player gets based on their choice and others' choices)
payoffs = rand(numStrategies, numStrategies);
% Initialize players' strategies randomly
playerStrategies = randi([1, numStrategies], 1, numPlayers);
% Define a function to calculate each player's utility based on their strategy and others' strategies
calculateUtility = @(playerId, strategies) max(payoffs(strategies(playerId), setdiff(1:numPlayers, playerId)));
% Number of iterations for the game
numIterations = 100;
% Play the game for a number of iterations
for iteration = 1:numIterations
newStrategies = playerStrategies;
for playerId = 1:numPlayers
% Evaluate the utility of switching strategies
currentUtility = calculateUtility(playerId, playerStrategies);
% Try switching to a random strategy and evaluate the utility
newStrategy = randi([1, numStrategies]);
newStrategies(playerId) = newStrategy;
newUtility = calculateUtility(playerId, newStrategies);
% Decide whether to switch or not based on utility
if newUtility > currentUtility
playerStrategies(playerId) = newStrategy;
end
end
end
Index in position 2 exceeds array bounds. Index must not exceed 2.

Error in solution>@(playerId,strategies)max(payoffs(strategies(playerId),setdiff(1:numPlayers,playerId))) (line 9)
calculateUtility = @(playerId, strategies) max(payoffs(strategies(playerId), setdiff(1:numPlayers, playerId)));
% Display the final strategies chosen by the players
disp('Final player strategies:');
disp(playerStrategies);
  2 Comments
Walter Roberson
Walter Roberson on 29 Oct 2023
numStrategies = 2; % Two strategies: Reduce consumption or maintain current consumption
payoffs = rand(numStrategies, numStrategies);
payoffs is a square matrix indexed by strategy number for rows and columns. In particular 2 x 2
numPlayers = 5;
%...
for playerId = 1:numPlayers
calculateUtility = @(playerId, strategies) max(payoffs(strategies(playerId), setdiff(1:numPlayers, playerId)));
1:numPlayers is 1:5 and you setdiff that with the current playerID, which is one of 1:5 . So the result of the setdiff() is going to be a vector of 4 elements, the maximum of which is going to be either 4 or 5.
That vector of 4 elements with a 4 or 5 in it is going to be used as the second index of payoffs -- which is expecting a strategy number rather than a player id.

Sign in to comment.

Categories

Find more on Number games in Help Center and File Exchange

Products


Release

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!