close Warning: Can't synchronize with repository "(default)" (/var/svn/mms does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 14 years ago

Closed 14 years ago

Last modified 14 years ago

#499 closed enhancement (fixed)

Facilidad para definir restricciones de orden

Reported by: atorre Owned by: Pedro Gea
Priority: major Milestone: Release 0.6
Component: Parameters Keywords: parámetros, restricciones
Cc:

Description (last modified by Pedro Gea)

Hola MMS,
sería ideal poder expresar restricciones de parámetros de la siguiente forma:

Dado un conjunto de parámetros:

Set _.parameters = SetOfAnything(
  [["Veh.Mot.Mat", "Crisis.200801", [["Linear", 0]] ]],
  [["Veh.Mot.Mat", "Crisis.200802", [["Linear", 0]] ]],
  [["Veh.Mot.Mat", "Crisis.200803", [["Linear", 0]] ]],
  [["Veh.Mot.Mat", "Crisis.200804", [["Linear", 0]] ]],
  [["Veh.Mot.Mat", "Crisis.200805", [["Linear", 0]] ]]
);

si queremos expresar que el primero es menor o igual que el segundo y el segundo que el tercero, etc, poder expresarlo igual que se hace al definir las variables calculadas. Algo así como:

º1 <= º2 <= º3 <= º4 <= º5

Change History (5)

comment:1 Changed 14 years ago by atorre

A quien le pueda interesar, subo una función para crear las restricciones de ordenación de un conjunto de parámetros:

Real CreateMConstraintOrdered(NameBlock model, Set param, Real orden)
{

Set mCons = For(1, Card(param)-1, Real(Real comb)
{

NameBlock param01 = param[comb];
NameBlock param02 = param[comb+1];
MMS::@MCombination mComb = model::CreateMCombination([[

Text _.name = "CombOrder"+ IntText(comb) +".."+ IntText(Rand(1, 1000));
Set _.parameters = SetOfAnything(

param01::GetIdentifier(?),
param02::GetIdentifier(?));

Set _.coefficients = SetOfReal(orden, -orden)
]]);

Real mComb::SetConstraint([[

Real _.inferiorValue = ?;
Real _.superiorValue = 0

]])

});
EQ(Card(mCons), SetSum(mCons))

};

está preparado para recibir un modelo, un conjunto de objetos MMS::@ParameterSigma2 y un valor 1 (ascendente) o -1 (descendente).

comment:2 Changed 14 years ago by Pedro Gea

Description: modified (diff)
Status: newaccepted
Summary: Facilidad para definir restriccionesFacilidad para definir restricciones de orden

Nota: Se recomienda encerrar el código entre triples llaves para facilitar su lectura.
Algo como:

Si está dentro de una línea de texto: {{{Real a = 1}}}
Si son nuevas líneas:
{{{
Real a = 1;
}}}

comment:3 Changed 14 years ago by Pedro Gea

(In [2383]) Se añade un método para crear un conjunto de m-combinaciones de acuerdo para introducir una restricción de orden: CreateMCombinations_OrderConstraint
Refs #499

comment:4 Changed 14 years ago by Pedro Gea

Resolution: fixed
Status: acceptedclosed

A continuación se ilustra el método implementado con un ejemplo que podría ser utilizado en el ejemplo MatVeh:

Set model::CreateMCombinations_OrderConstraint([[
  // El nombre para el conjunto de m-combinaciones es obligatorio
  Text _.name = "OrderConstraint_Pib.es.Men";
  // El signo de la restricción de orden es opcional. Por defecto es 1.
  //   sign:1  =>  p1 < p2 < ... < pN 
  //   sign:-1 =>  p1 > p2 > ... > pN 
  Real _.sign = 1;
  // El conjunto de parámetros en la restricción de orden es necesario
  Set  _.parameters = [[
    [["Veh.Tur.Mat", "Pib.es.Men", "Linear.0" ]],
    [["Veh.Bus.Mat", "Pib.es.Men", "Linear.0" ]],
    [["Veh.CaF.Mat", "Pib.es.Men", "Linear.0" ]],
    "Veh.Mot.Mat__Pib.es.Men__Linear.0",
    model::GetParameter([["Veh.Tra.Mat", "Pib.es.Men", "Linear.0"]]),
    model::GetParameter("Veh.Otr.Mat__Pib.es.Men__Linear.0")
  ]]
  // Los parámetros se indican de distintas maneras para mostrar las 
  // posibilidades disponibles
]]);

comment:5 Changed 14 years ago by Pedro Gea

Por cierto es de agradecer el código indicado en el tique como sugerencia. Ha sido de utilidad.

Nótese que existe la posibilidad de crear la restricción al mismo tiempo que la m-combinación del siguiente modo:

MMS::@MCombination mComb = model::CreateMCombination([[
  Text _.name = "CombOrder"+ IntText(comb) +".."+ IntText(Rand(1, 1000));
  Set _.parameters = SetOfAnything(param[comb], param[comb+1]);
  Set _.coefficients = SetOfReal(orden, -orden);
  NameBlock _.constraint = [[
    Real _.inferiorValue = ?;
    Real _.superiorValue = 0
  ]]
]]);

Nótese que los parámetros pueden expresarse mediante (i) el identificador del parámetro, (ii) el conjunto de nombres submodelo-términoExplicativo-parámetro o (iii) mediante una misma instancia del parámetro.

Note: See TracTickets for help on using tickets.