38 views (last 30 days)

Hi All,

I am trying to solve a game theoretic scenario where I have two players that each have three decision variables. They each have their own individual utility functions with their payoffs depending on what the other one does. As a result, I have to optimize these two equations simulataneously. I've looked into using the gamultiobj tool, and I've tried to follow an example from the MATLAB website, but obviously my scenario is a little bit more complicated. They just had one variable, whereas I have six variables in total, with additional constraints of all variables being nonnegative, and x(5) and x(6) being <=24. I'm not exactly sure where I went wrong, especially since my situation differs quite a bit from the example, so i would greatly appreciate any and all help. I've included my code below (the example, then mine). Thanks in advance!

% Example version

fitnessfcn = @(x)[sin(x),cos(x)];

nvars = 1;

lb = 0;

ub = 2*pi;

rng default % for reproducibility

x = gamultiobj(fitnessfcn,nvars,[],[],[],[],lb,ub)

plot(sin(x),cos(x),'r*')

xlabel('sin(x)')

ylabel('cos(x)')

title('Pareto Front')

legend('Pareto front')

%My version

funx=-0.5*x(1)^2+100*log(x(1)+x(2)-14)-x(5)/2+0.9*(-0.5*(1-x(5)/40)*x(3)^2+100*log(x(3)+x(4)-14))

funy=-0.5*x(2)^2+100*log(x(1)+x(2)-14)-x(6)/2+0.9*(-0.5*(1-x(5)/40)*x(4)^2+100*log(x(3)+x(4)-14))

fitnessfcn = @(x)[funx,funy];

nvars = 2;

lb = [0,0,0,0,0,0];

ub = [Inf,Inf,Inf,Inf,24,24];

rng default % for reproducibility

x = gamultiobj(fitnessfcn,nvars,[],[],[],[],lb,ub)

plot(funx,funy,'r*')

xlabel('funx')

ylabel('funy')

title('Pareto Front')

legend('Pareto front')

Alan Weiss
on 21 Jan 2021

Edited: Alan Weiss
on 21 Jan 2021

Your input data is inconsistent:

nvars = 2;

lb = [0,0,0,0,0,0];

ub = [Inf,Inf,Inf,Inf,24,24];

Your bounds are on your decision variables, not your objective functions. The nvars argument refers to exactly this, so you should have nvars = 6.

Your other errors relate to how to call functions and use ther resulting data. Your fitness functions need initial @x arguments:

funx = @(x)-0.5*x(1)^2+100*log(x(1)+x(2)-14)-x(5)/2+0.9*(-0.5*(1-x(5)/40)*x(3)^2+100*log(x(3)+x(4)-14));

funy = @(x)-0.5*x(2)^2+100*log(x(1)+x(2)-14)-x(6)/2+0.9*(-0.5*(1-x(5)/40)*x(4)^2+100*log(x(3)+x(4)-14));

fitnessfcn = @(x)[funx(x),funy(x)];

Your plot needs to pass the data to the objective functions:

plot(funx(x),funy(x),'r*')

When I ran this code I got other errors relating to the function being complex-valued. You also need to include linear constraints that keep the function from having complex values. But this should get you started.

Alan Weiss

MATLAB mathematical toolbox documentation

Alan Weiss
on 27 Jan 2021

For the problem as you have defined it, the solution has e1 going from 0 to 5, and e2 going from 5 to 0 as follows (in one run, these numbers are stochastic):

solution =

0.0001 4.9999

0.0001 4.9999

0.0825 4.9803

0.1373 4.5127

0.0062 5.0064

5.0000 0

4.3021 0.0542

4.9261 0.0507

0.8771 3.0301

3.8961 0.1244

0.5075 3.3599

0.9395 3.9216

4.4089 0.3093

0.5050 4.5467

4.4039 0.6124

2.2507 2.8033

4.9980 0.0012

0.3360 4.0666

There is a tradeoff between the objective functions; here are the associated values:

objectiveValue =

-1.7589 -3.4199

-1.7589 -3.4199

-2.1381 -3.4105

-2.2649 -3.4015

-1.8919 -3.4192

-3.4200 -1.7100

-3.4068 -2.1589

-3.4141 -2.0828

-2.7837 -3.2735

-3.3886 -2.3142

-2.6281 -3.3282

-2.7051 -3.3026

-3.3813 -2.4178

-2.5004 -3.3607

-3.3472 -2.5573

-3.0143 -3.1138

-3.4198 -1.8165

-2.4708 -3.3717

So I think that it is your interpretation of the solution that is at fault, not the solution.

Note that your expected solution is not even on the Pareto curve (there are better points). Your expected solution has value (-2.9876,-2.9876), but there are points (such as the third to last) with both values smaller than -3.

Alan Weiss

MATLAB mathematical toolbox documentation

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

Start Hunting!
## 0 Comments

Sign in to comment.