Matlab - Expresar como condición que un número sea entero

   
Vista:

Expresar como condición que un número sea entero

Publicado por Aitor (46 intervenciones) el 17/03/2017 17:47:48
Hola,

Estoy resolviendo un problema de optimización, cuyo resultado ha de ser un vector con elementos de la forma
v = x/N, donde x ha de ser necesariamente un valor de tipo integer positivo que pueda tomar como valores desde el 0 hasta N.

El problema es que no sé cómo expresar esta condición de forma matemática mediante Matlab. Estoy utilizando la función fmincon para resolver el problema de optimización:

https://es.mathworks.com/help/optim/ug/fmincon.html

Y no sé en qué parámetro 'encajar' esta condición adicional. Había pensado en hacerlo dentro de ceq, de la siguiente forma:

1
ceq = v*N - floor(v*N)

Pero no parece estar haciendo nada. ¿Alguien conoce alguna otra idea, por favor?

Si pudiera seros de utilidad, podéis encontrar el resto de mi código en StackOverflow en español:
http://es.stackoverflow.com/questions/56013/encontrar-la-distribuci%C3%B3n-de-1-en-filas-y-columnas-de-una-matriz-de-comprobaci

Muchas gracias de antemano por vuestra ayuda, y un cordial saludo. ¡Que paséis todos un buen fin de semana!
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
Imágen de perfil de JESUS DAVID ARIZA ROYETH

Expresar como condición que un número sea entero

Cuando de optimización se trata con conjuntos discretos como lo son lo números enteros puedes usar algoritmos genéticos , con ellos es más fácil trabajar con números enteros, y es la solución más recomendada, si se te hace complicado trata de redondear tu respuesta al final
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Expresar como condición que un número sea entero

Publicado por Aitor (46 intervenciones) el 17/03/2017 20:59:44
¡Hola de nuevo!

Sí, tienes mucha razón en tu observación. Creo que al final no me queda otro remedio y tendré que utilizar algoritmos genéticos... aunque el problema es que la última vez nunca llegó a terminar de converger (utilicé la función 'ga') y ahora he vuelto a intentarlo y parece ir por el mismo camino... ¿tienes alguna sugerencia?

La verdad es que mi código incluye muchas restricciones no lineales de desigualdad pero son completamente necesarias.

Mucahs gracias de nuevo por tu ayuda, y buen fin de semana a ti y al resto!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function [v] = LP_Irr_LDPC(k,N,Ebn0)
 
%options = optimoptions('fmincon','Display','iter','Algorithm','interior-point','MaxIter', 4000, 'MaxFunEvals', 70000);
% options = optimoptions('patternsearch','Display','iter','PlotFcn',@psplotbestf);
 
fun = @(v) -sum(v(1:k)./(1:k));
 
A = [0, ones(1,k-1); 0, -1*ones(1,k-1)];
b = [N;-N];
Aeq = [];
beq = [];
lb = zeros(1,k);
ub = [0, N*ones(1,k-1)];
nonlcon = @(v)DensEv_SP(v,Ebn0);
 
%v = fmincon(fun,l0,A,b,Aeq,beq,lb,ub,nonlcon,options)
v = ga(fun,k,A,b,Aeq,beq,lb,ub,nonlcon,[1:k]);
 
end

Aquí se incluyen aparte las restricciones no lineales:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function [c, ceq] = DensEv_SP(v,Ebn0)
 
% It is also needed to modify this function, as you cannot pass parameters
% from others to it. 
 
k = 10; % Same as in Complete.m, desired sum of h
M = 19; % Number of integers
h = [0 diff([0,sort(randperm(k+M-1,M-1)),k+M])-ones(1,M)];
h = h./sum(h);
 
syms x;
X = x.^(0:(length(h)-1));
R = h*transpose(X);
 
ebn0 = 10^(Ebn0/10);
Rm = 1;
LLR = (-50:50);
p03 = 0.3;
LLR03 = log((1-p03)/p03);
r03 = 1 - p03;
noise03 = (2*r03*Rm*ebn0)^-1;
pf03 = normpdf(LLR, LLR03, noise03);
sumpf03 = sum(pf03(1:length(pf03)/2));
 
divisions = 100;
 
Aj = zeros(1, divisions);
rho = zeros(1, divisions);
xj = zeros(1, divisions);
%N = 20; % Length(v) -> Same value as in 'Complete.m'
 
for j=1:1:divisions
    xj(j) = sumpf03*j/divisions;
    rho(j) = subs(R,x,1-xj(j));
    Aj(j) = 1 - rho(j);
end
 
c = zeros(1, length(xj));
lambda = zeros(1, length(Aj));
for j = 1:1:length(xj)
    lambda(j) = sum(v(2:k).*(Aj(j).^(1:(k-1))));
    c(j) = sumpf03*lambda(j) - xj(j);
end
ceq = [];
%ceq = v-floor(v);
save Almacen
end
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JESUS DAVID ARIZA ROYETH

Expresar como condición que un número sea entero

te sugiero que plantees tu propio algoritmo genético donde puedas tener mayor control de tu función de evaluación y esos detalles, así estás haciendo un algoritmo genético muy general para tu problema , si me planteas el problema real en palabras ya sea por aquí o por interno puedo recomendarte un método de optimización más eficiente
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Expresar como condición que un número sea entero

Publicado por Aitor (46 intervenciones) el 17/03/2017 22:11:49
Hola de nuevo!

Pues no sé si es posible, pero te puedo dejar la misma duda posteada en StackOverflow por aquí:

http://es.stackoverflow.com/questions/56013/encontrar-la-distribución-de-1-en-filas-y-columnas-de-una-matriz-de-comprobaci

Básicamente necesitaría encontrar un par de vectores h y v de longitudes N y k = N(1-r, 0<r<1) respectivamente que satisfagan las condiciones que aparecen en la imagen colgada. El plan es, más concretamente, hallar v mediante programación lineal como solución de un problema de optimización dado un cierto valor de h.

El plan es construir una matriz de comprobación de paridad H (básicamente una matriz de unos y ceros) con la siguiente información: sus dimensiones (k filas y N>k columnas) y la distribución de los pesos de sus filas (h) y sus columnas, (v). Esto es, si por ejemplo tenemos un valor h_2 = 3/20, quiere decir que 3/20 de todas las filas de H contienen dos '1' y el resto de sus elementos son '0'. Asimismo, si tuviéramos v_5 = 1/6 entonces 1/6 de las columas de H tienen cinco '1' y el resto de sus elementos son 0.

Cuando obtenga los valores de v y de h quiero construir la correspondiente matriz mediante un algoritmo que ya he finalizado. Para que funcione, es necesario que tanto los elementos de v como los de h sean de la forma x/N o y/k, siendo x e y numeros naturales (incluyendo el 0).

Creo que no me dejo nada... Pero si tienes alguna duda estoy a tu disposición, porque estoy desesperado por acabar con esto de una vez...

P.S: Este problema de optimización necesito resolverlo mediante programación lineal pero también necesitaré más adelante hacer lo propio mediante evolución diferencial bajo las mismas restricciones y minizando otra función que dependa tanto de v como de h (que pasarían a ocupar un único vector).

Muchas gracias por tu atención!! Eres muy amable!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad