Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Índice con nombre para variables de optimización

Crear índices con nombre

Las variables de optimización pueden usar nombres para indexar elementos. Puede dar los nombres al crear una variable o después. Por ejemplo, dé los nombres al crear la variable.

x = optimvar('x',["United","Lufthansa","Virgin Air"])
x =    1x3 OptimizationVariable array with properties:    Array-wide properties:           Name: 'x'           Type: 'continuous'     IndexNames: {{}  {1x3 cell}}    Elementwise properties:     LowerBound: [-Inf -Inf -Inf]     UpperBound: [Inf Inf Inf]    See variables with showvar.   See bounds with showbounds.  

asigna automáticamente los nombres que especifique a los números de índice en el orden de las variables.optimvar Por ejemplo, corresponde al índice 1, corresponde al índice 2 y corresponde al índice 3."United""Lufthansa""Virgin Air" Mostrar esta última variable para la confirmación.

showvar(x(3))
    [ x('Virgin Air') ] 

Los nombres de índice permiten abordar los elementos de los nombres de índice.x Por ejemplo:

route = 2*x("United") + 3*x("Virgin Air")
route =    Linear OptimizationExpression      2*x('United') + 3*x('Virgin Air')  

Puede crear o cambiar los nombres de índice después de crear una variable. Sin embargo, no puede cambiar el tamaño de una variable de optimización después de la construcción. Por lo tanto, solo puede cambiar los nombres de índice estableciendo nombres nuevos que indexen el mismo tamaño que la variable original. Por ejemplo:

x = optimvar('x',3,2); x.IndexNames = { {'row1','row2','row3'}, {'col1','col2'} };

También puede establecer los nombres de índice para cada dimensión individualmente:

x.IndexNames{1} = {'row1', 'row2', 'row3'}; x.IndexNames{2} = {'col1', 'col2'};

Puede establecer un nombre de índice para un elemento determinado:

x.IndexNames{1}{2} = 'importantRow';

Examine los nombres de índice de la variable.

x.IndexNames{1}
ans = 1x3 cell array
    {'row1'}    {'importantRow'}    {'row3'}

x.IndexNames{2}
ans = 1x2 cell array
    {'col1'}    {'col2'}

Utilice índices con nombre

Puede crear y depurar algunos problemas fácilmente mediante el uso de variables de índice con nombre. Por ejemplo, considere la variable que está indexada por los nombres en:xvars

vars = {'P1','P2','I1','I2','C','LE1','LE2','HE1','HE2',...     'HPS','MPS','LPS','BF1','BF2','EP','PP'}; x = optimvar('x',vars,'LowerBound',0);

Crear límites, una función objetiva y restricciones lineales para mediante el uso de los índices con nombre.x

x('P1').LowerBound = 2500; x('I2').UpperBound = 244000; linprob = optimproblem; linprob.Objective = 0.002614*x('HPS') + 0.0239*x('PP') + 0.009825*x('EP'); linprob.Constraints.cons1 = x('I1') - x('HE1') <= 132000;

Puede utilizar Strings () o vectores de caracteres () en variables de índice indiscriminadamente." "' ' Por ejemplo:

x("P2").LowerBound = 3000; x('MPS').LowerBound = 271536; showbounds(x)
      2500 <= x('P1')       3000 <= x('P2')          0 <= x('I1')          0 <= x('I2')  <= 244000          0 <= x('C')          0 <= x('LE1')          0 <= x('LE2')          0 <= x('HE1')          0 <= x('HE2')          0 <= x('HPS')     271536 <= x('MPS')          0 <= x('LPS')          0 <= x('BF1')          0 <= x('BF2')          0 <= x('EP')          0 <= x('PP')      

No hay distinción entre las variables especificadas con una cadena, por ejemplo, y las variables especificadas con un vector de caracteres, como.x("P2")x('MPS')

Dado que las variables de índice con nombre tienen equivalentes numéricos, puede utilizar los operadores de suma y de puntos ordinarios incluso cuando se ha nombrado variable de índice. Por ejemplo, puede tener restricciones de estos formularios:

constr = sum(x) <= 100; showconstr(constr)
  x('P1') + x('P2') + x('I1') + x('I2') + x('C') + x('LE1') + x('LE2') + x('HE1') + x('HE2') + x('HPS') + x('MPS') + x('LPS') + x('BF1') + x('BF2') + x('EP') + x('PP') <= 100 
y = optimvar('y',{'red','green','blue'},{'plastic','wood','metal'},...     'Type','integer','LowerBound',0); constr2 = y("red",:) == [5,7,3]; showconstr(constr2)
(1, 1)    y('red', 'plastic') == 5  (1, 2)    y('red', 'wood') == 7  (1, 3)    y('red', 'metal') == 3 

Ver solución con variables de índice

Crear y resolver un problema de optimización mediante variables de índice con nombre. El problema consiste en maximizar el flujo de fruta ponderado con beneficios a varios aeropuertos, sujeto a restricciones en los flujos ponderados.

rng(0) % For reproducibility p = optimproblem('ObjectiveSense', 'maximize'); flow = optimvar('flow', ...     {'apples', 'oranges', 'bananas', 'berries'}, {'NYC', 'BOS', 'LAX'}, ...     'LowerBound',0,'Type','integer'); p.Objective = sum(sum(rand(4,3).*flow)); p.Constraints.NYC = rand(1,4)*flow(:,'NYC') <= 10; p.Constraints.BOS = rand(1,4)*flow(:,'BOS') <= 12; p.Constraints.LAX = rand(1,4)*flow(:,'LAX') <= 35; sol = solve(p);
LP:                Optimal objective value is -1027.472366.                                           Heuristics:        Found 1 solution using rounding.                                                                     Upper bound is -1027.233133.                                                                         Relative gap is 0.00%.                                                            Cut Generation:    Applied 1 mir cut, and 2 strong CG cuts.                                                             Lower bound is -1027.233133.                                                                         Relative gap is 0.00%.                                                             Optimal solution found.  Intlinprog stopped at the root node because the objective value is within a gap tolerance of the optimal value, options.AbsoluteGapTolerance = 0 (the default value). The intcon variables are integer within tolerance, options.IntegerTolerance = 1e-05 (the default value). 

Encuentre el flujo óptimo de naranjas y bayas a Nueva York y los Ángeles.

[idxFruit,idxAirports] = findindex(flow, {'oranges','berries'}, {'NYC', 'LAX'})
idxFruit = 1×2

     2     4

idxAirports = 1×2

     1     3

orangeBerries = sol.flow(idxFruit, idxAirports)
orangeBerries = 2×2

         0  980.0000
   70.0000         0

Esta pantalla significa que ninguna naranja va a, 70 bayas van a, 980 naranjas van a, y no hay bayas van a.NYCNYCLAXLAX

Enumere el flujo óptimo de lo siguiente:

Fruit Airports

----- --------

Berries NYC

Apples BOS

Oranges LAX

idx = findindex(flow, {'berries', 'apples', 'oranges'}, {'NYC', 'BOS', 'LAX'})
idx = 1×3

     4     5    10

optimalFlow = sol.flow(idx)
optimalFlow = 1×3

   70.0000   28.0000  980.0000

Esta pantalla significa que 70 bayas van a, 28 manzanas van a, y 980 naranjas van a.NYCBOSLAX

Consulte también

|

Temas relacionados