Red de conocimiento informático - Material del sitio web - Cómo establecer restricciones de variables para números enteros al resolver valores óptimos usando el solucionador linprog u otros solucionadores de la caja de herramientas de optimización de matlab

Cómo establecer restricciones de variables para números enteros al resolver valores óptimos usando el solucionador linprog u otros solucionadores de la caja de herramientas de optimización de matlab

Puedes usar restricciones de rama para resolver problemas de programación entera, aquí está el código fuente:

función [x, fm] = IntProgFZ(f, A, b, Aeq, beq, lb, ub)

x = NaN;

fm = NaN;

NF_lb = ceros(tamaño(lb ));

NF_ub = ceros(tamaño(ub )); )

NF_lb(:, 1) = lb;

NF_ub(:, 1) = ub

F =

mientras 1

sz = tamaño(NF_lb);

k = sz(2);

opt = optimset('TolX', 1e- 9 );

[xm, fv, bandera de salida] = linprog(f, A, b, Aeq, beq, NF_lb(:, 1), NF_ub(: 1), [], opt); /p> p>

if exitflag == -2

xm = NaN

fv = NaN

fin

if xm == NaN

fv = inf;

end

if fv ~= inf

if fv lt; /p>

if max(abs(round(xm) - xm))lt; 1.0e-7

F = fv

x = xm; >

tmpNF_lb = NF_lb(:,2:k);

tmpNF_ub = NF_ub(:,2:k);

NF_lb = tmpNF_lb;

NF_ub = tmpNF_ub

si está vacío(NF_lb) == 0

continuar

en caso contrario

si x ~= NaN<; /p>

fm = F;

return;

else

si x ~= NaN

fm = F;

retorno;

más

si x ~= NaN

retorno

más

disp('¡No existe una solución óptima! ');

x = NaN;

fm = NaN

retorno

fin

fin;

else

lb1 = NF_lb(:,1);

ub1 = NF_ub(:,1);

tmpNF_ lb = NF_lb(:,2:k);

tmpNF_ub = NF_ub(:,2:k);

NF_lb = tmpNF_lb;

NF_ub = tmpNF_ub;

p>

[bArr, index] = find(abs((xm - round(xm )))gt;=1.0e-7);

p = bArr( 1);

p>

nuevo_lb = lb1;

nuevo_ub = ub1;

nuevo_lb(p) = max(piso(xm(p)) 1, lb1(p)); /p>

nuevo_ub(p) = min(piso(xm(p)),ub1(p));

NF_lb = [NF_lb nuevo_lb lb1];

NF_ub = [NF_ub ub1 new_ub]

continuar

finalizar

else

tmpNF_lb = NF_lb(:, 2:k);

tmpNF_ub = NF_ub(:2:k);

NF_lb = tmpNF_lb;

NF_ub = tmpNF_ub;

si está vacío (NF_lb ) == 0

continuar;

else

si x ~= NaN

fm = F;

return;

else

disp('¡No existe una solución óptima!')

x = NaN

fm = NaN; ;

Regresar;

Fin

Fin

Fin

De lo contrario

tmpNF_lb = NF_lb(:,2:k);

tmpNF_ub = NF_ub(:,2:k);

NF_lb = tmpNF_lb;

NF_ub = tmpNF_ub ;

if isempty(NF_lb) == 0

continuar;

else

if x ~= NaN

fm = F;

return;

else

disp('¡No existe una solución óptima!') )

x = NaN

fm = NaN

retorno

fin

fin

fin

fin

fin

fin