Matlab - duda optimizacion

   
Vista:

duda optimizacion

Publicado por diego (2 intervenciones) el 10/07/2014 20:35:51
Buenas, el objetivo que tengo es maximizar una funcion con restricciones y lo voy a realizar mediante el comando fmincon.

creo la función a optimizar:

function f=rcpspdc(x)
f=-(((-200)*exp(-0.01*(x(2))))+((-450)*exp(-0.01*(x(3))))+((120)*exp(-0.01*(x(4))))+((170)*exp(-0.01*(x(5))))+((-200)*exp(-0.01*(x(6))))+((130)*exp (-0.01*(x(7))))+((-40)*exp (-0.01*(x(8)))));

Y después creo una función para resolver las restricciones, que aunque son lineales empleo el nonlconstr:
function [c,ceq] = nonlconstr(x)
c = [x(1) - x(2) + 3;
x(1) - x(3) + 3;
x(3) - x(4) + 1;
x(2) - x(5) + 2;
x(3) - x(6) + 2;
x(6) - x(7) + 3;
x(1) - x(8) + 3;
x(8) - x(9);
x(9) - 12];
ceq = [x(1)];

Despues introduzco x0=[0 ; 10 ; 7 ; 8 ; 12 ; 9 ; 12 ; 12 ; 0];

options = optimoptions(@fmincon,'Algorithm','interior-point');

[x,fval] = fmincon(@rcpspdc,x0,[],[],[],[],[],[],@nonlconstr,options;

Y me funciona, ahora viene el problema:

quiero introducir una nueva restricción que la he codificado de la siguiente manera:

En primer lugar he creado la siguiente función para calcular si existe intersección entre dos vectores A y B que usaré posteriormente:

function C=interseccion(A,B)
n=length(A);
m=length(B);
C=0;
for i=1:n
for j=1:m
if A(i) == B(j)
C=1;
end
end
end

Ahora viene la codificación de la nueva restricción que he añadido en la función nonlconstr creada previamente:

d=[0 3 3 1 2 2 3 3 0];
r=[0 2 3 2 3 4 2 1 0];

for t=1:12
s=0;
for i=1:9
A=((t-1):t);
B=(x((i)-d(i)):x(i));
if(interseccion(A,B)==1)
s=s+r(i);
end
s<=5;
end
end

Entonces me dice que "Error running optimization. Attempted to access x(-1); index must be a positive integer or logical."

En primer lugar no se si he hecho bien en meter este tipo de restriccion en la funcion nonlconstr de funciones no lineales a continuación del codigo que tenia previamente o si tenía que haberlo hecho de otra manera.

Por otra parte, Lo he intentado suponiendo un x por ejemplo [0 10 7 8 12 9 12 12 0] para solo ese trozo de codigo y me sigue diciendo lo mismo:

x=[0 10 7 8 12 9 12 12 0];
d=[0 3 3 1 2 2 3 3 0];
r=[0 2 3 2 3 4 2 1 0];

for t=1:12
s=0;
for i=1:9
A=((t-1):t);
B=(x((i)-d(i)):x(i));
if(interseccion(A,B)==1)
s=s+r(i);
end
if (s<=5)
disp('Bien')
else
disp('Mal')
break
end
end
end

"Error running optimization. Attempted to access x(-1); index must be a positive integer or logical."

Añado imagenes del problema de optimizacion en cuestion
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder