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
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
- rcpspdc.rar(222,7 KB)
Valora esta pregunta
0