# How to define constraint in Optimization such that difference in value between two consecutive unknowns is not greater than 50%

조회 수: 2(최근 30일)
Ankur Shah 2021년 10월 6일
편집: Matt J 2021년 10월 6일
Hello everyone,
I have prepared code in matlab for genetic algorithm from toolbox
The function code is a bit long. In summary, There are 30 unknowns with upper and lower bounds as 1.
How to apply a constraint while running such that difference in value between two consecutive unknowns obtained is not greater than 50% ?.
##### 댓글 수: 2표시숨기기 이전 댓글 수: 1
Ankur Shah 2021년 10월 6일
Yes, 50% greater than the previous.

댓글을 달려면 로그인하십시오.

### 답변(2개)

Matt J 2021년 10월 6일
Here is a way to set up the constraint matrices using prob2matrices from,
x=optimvar('x',30,'Lower',0,'Upper',1);
Constraints.diffUB=diff(x)<=+0.5*x(1:end-1);
Constraints.diffLB=diff(x)>=-0.5*x(1:end-1);
p=prob2matrices({x},'Constraints',Constraints)
p = struct with fields:
intcon: [] lb: [30×1 double] ub: [30×1 double] Aineq: [58×30 double] bineq: [58×1 double] Aeq: [] beq: []
##### 댓글 수: 6표시숨기기 이전 댓글 수: 5
Matt J 2021년 10월 6일
The code in my original answer generates the matrices for you. You can use them directly in the call to ga:
x=optimvar('x',30,'Lower',0,'Upper',1);
Constraints.diffUB=diff(x)<=+0.5*x(1:end-1);
Constraints.diffLB=diff(x)>=-0.5*x(1:end-1);
p=prob2matrices({x},'Constraints',Constraints);
x=ga(fun,30,p.Aineq,p.bineq,p.Aeq,p.beq,p.lb,p.ub);

댓글을 달려면 로그인하십시오.

Bjorn Gustavsson 2021년 10월 6일
Perhaps a constraint-function like this would get the job done (might be used with fmincon for example):
function [c,ceq] = your_con(x,a,b)
if nargin < 3
b = 0.1;
end
if nargin < 2
a = 1/2;
end
dx = diff(x);
c = 2*abs(dx)./(max(abs(x(1:end-1))+abs(x((2:end))),...
max(b,...
max(abs(x(1:end-1)),abs(x(2:end)))...
)...
))-a;
ceq = [];
To read up on the details of using this read the help and documentation of fmincon.
HTH

댓글을 달려면 로그인하십시오.

R2020a

### Community Treasure Hunt

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

Start Hunting!

Translated by