Azzera filtri
Azzera filtri

How to define multiple constraints for fmincon?

28 visualizzazioni (ultimi 30 giorni)
Rachel Dawn
Rachel Dawn il 9 Feb 2021
Risposto: Walter Roberson il 9 Feb 2021
Hi, I'm trying to minimize the formula below. I've done most of the code except I can't quite figure out how to account for the constraints. I tried at the end of the code but I think this is for nonlinear constraints? And mine are linear. Also not sure how to account for the bounds.
Anyone know how I can do this? Thanks!
%FORMULA: SC= 3SA + 4SS + 6LA + 4LS
%BOUNDS:
%SA>= 100 locks
%SS>=100 locks
%LA>=100 locks
%LS>=100 locks
%CONSTRAINTS:
%SA + LA = 2000
%SS + LS = 1500
%LA + LS <= 1500
%SA + SS <= 2500
%All variables need to be positive & integers
%load guesses into array
x0=[SA SS LA LS];
%call solver to minimize objective function given the constraint
xopt= fmincon(@objective, x0, [],[],[],[],[],[],@constraint,[])
%retrieve optimized shipping cost
SC_Opt=ship_cost(xopt)
%double check constraints
%function to calculate FendPac total shipping cost
function ship_cost= ship_cost(x)
SA= x(1);
SS= x(2);
LA = x(3);
LS = x(4);
ship_cost=3*SA + 4*SS + 6*LA + 4*LS;
end
%function to calculate shipped locks to Austin
function to_atx = to_atx(x)
SA= x(1);
LA= x(2);
to_atx= LA + SA
end
%function to calculate shipped locks to San Antonio
function to_satx = to_satx(x)
SS= x(1);
LS= x(2);
to_satx= LS + SS
end
%function to calculate shipped locks from Los Angeles
function from_LA = from_LA(x)
LS= x(1);
LA= x(2);
from_LA= LS + LA
end
%function to calculate shipped locks from San Francisco
function from_SF = from_SF(x)
SS= x(1);
SA= x(2);
from_SF= SS + SA
end
%objective function for optimization
function obj=objective(x)
obj=ship_cost(x);
end
%CONSTRAINTS
function [c,ceq]= constraint1(x)
c(1)= 2000- to_atx(x);
c(2)= 1500- to_satx(x);
c(3)=from_LA(x) - 1500;
c(4)= from_SF(x) - 2500
ceq1=[];
end
  1 Commento
Walter Roberson
Walter Roberson il 9 Feb 2021
function to_atx = to_atx(x)
SA= x(1);
LA= x(2);
to_atx= LA + SA
end
No, LA is x(3) not x(2) .

Accedi per commentare.

Risposte (1)

Walter Roberson
Walter Roberson il 9 Feb 2021
Aeq = [1 0 1 0; 0 1 0 1];
beq = [2000; 2000];
A = [0 0 1 1; 1 1 0 0];
b = [1500; 2500]
lb = [100, 100, 100, 100];
ub = [1900, 1900, 1900, 1900]; %min 100, sum = 2000, so max = 1900
xopt = fmincon(@objective, x0, A, b, Aeq, beq, lb, ub)

Categorie

Scopri di più su Get Started with Optimization Toolbox in Help Center e File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by