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
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