コード例 #1
0
        public bool ReducirColumnas(ref Tableau tabla, KeyValuePair <string, double> pivote, string variableMinima)
        {
            bool siCorrecto = false;

            if (tabla != null && !string.IsNullOrEmpty(pivote.Key) && !string.IsNullOrEmpty(variableMinima))
            {
                OperacionesVectoriales op        = new OperacionesVectoriales();
                List <VectorEquation>  resultado = new List <VectorEquation>();

                VectorEquation evreferencia = tabla.StandardConstraint.Where(r => r.Nombre == pivote.Key).FirstOrDefault();
                evreferencia = new VectorEquation(evreferencia.Nombre, evreferencia.NombresVariables, op.OperacionV1parametro(evreferencia.CuerpoNum, "/", pivote.Value), evreferencia.TerminoIndependiente / pivote.Value);

                foreach (VectorEquation ev in tabla.StandardConstraint)
                {
                    if (ev.Nombre == pivote.Key)
                    {
                        resultado.Add(evreferencia);
                    }
                    else if (ev.Nombre != pivote.Key)
                    {
                        double pivoteev = ev.CuerpoVector.Where(r => r.Key == variableMinima).FirstOrDefault().Value;
                        resultado.Add(new VectorEquation(ev.Nombre, ev.NombresVariables, op.OperacionV1parametroV2(ev.CuerpoNum, "-", pivoteev, evreferencia.CuerpoNum), op.OperacionV1parametroV2(ev.TerminoIndependiente, Constantes.Resta, pivoteev, evreferencia.TerminoIndependiente)));
                    }
                }

                double            pivotefo = tabla.FuncionObjetivo.CuerpoVector.Where(r => r.Key == variableMinima).FirstOrDefault().Value;
                ObjectiveFunction fo       = new ObjectiveFunction(tabla.FuncionObjetivo.NombresVariables, op.OperacionV1parametroV2(tabla.FuncionObjetivo.CuerpoNum, "-", pivotefo, evreferencia.CuerpoNum), op.OperacionV1parametroV2(tabla.FuncionObjetivo.TerminoIndependiente, Constantes.Resta, pivotefo, evreferencia.TerminoIndependiente), tabla.FuncionObjetivo.SiMaximizar);

                tabla.FuncionObjetivo    = fo;
                tabla.StandardConstraint = resultado;
                siCorrecto = ActualizarBaseTabla(ref tabla, evreferencia.Nombre, new KeyValuePair <string, double>(variableMinima, evreferencia.TerminoIndependiente));
            }

            return(siCorrecto);
        }
コード例 #2
0
        public bool Pivoting(ref FuzzyTableau tableau, out KeyValuePair <string, double> refVar, out KeyValuePair <string, double> pivot)
        {
            bool isCorrect = false;

            refVar = new KeyValuePair <string, double>("", double.MinValue);

            if (tableau.FuzzyZRow.IsMax)
            {
                refVar = new KeyValuePair <string, double>("", double.MaxValue);
            }

            pivot = new KeyValuePair <string, double>();

            VectorEquation Zrow = tableau.ZRow;

            if (tableau != null)
            {
                foreach (KeyValuePair <string, double> kv in tableau.ZRow.CuerpoVector)
                {
                    if (tableau.FuzzyZRow.IsMax && kv.Value != 0 && kv.Value < refVar.Value)
                    {
                        refVar = kv;
                    }
                    else if (!tableau.FuzzyZRow.IsMax && kv.Value != 0 && kv.Value > refVar.Value)
                    {
                        refVar = kv;
                    }
                }

                pivot              = GetPivot(refVar, ref tableau);
                isCorrect          = true;
                tableau.isSolution = true;
            }
            return(isCorrect);
        }
コード例 #3
0
        public VectorEquation CalculateVectorConstantOperations(VectorEquation vector, EOperation operation, double number)
        {
            VectorEquation result = new VectorEquation(new Dictionary <string, double>(), 0);

            if (vector != null && vector.VectorBody.Count > 0)
            {
                List <string> vars = vector.VectorBody.Keys.ToList();

                foreach (string var in vars)
                {
                    switch (operation)
                    {
                    case EOperation.Addition:
                        result.VectorBody.Add(var, vector.VectorBody[var] + number);
                        break;

                    case EOperation.Subtraction:
                        result.VectorBody.Add(var, vector.VectorBody[var] - number);
                        break;

                    case EOperation.Multiplication:
                        result.VectorBody.Add(var, vector.VectorBody[var] * number);
                        break;

                    case EOperation.Division:
                        result.VectorBody.Add(var, vector.VectorBody[var] / number);
                        break;
                    }
                }

                result.Constant = CalculateOperations(vector.Constant, operation, number);
            }

            return(result);
        }
コード例 #4
0
        public void CalculateVectorConstantOperationsTest()
        {
            VectorHelper     vectorHelper     = new VectorHelper();
            VectorOperations vectorOperations = new VectorOperations(vectorHelper);

            List <VectorEquation> vectors = new List <VectorEquation>();
            VectorEquation        eq1     = new VectorEquation(new Dictionary <string, double> {
                { "x1", 2 },
                { "x2", 4 }
            }, 3);

            double pivot = 5;

            VectorEquation resultAdd = vectorOperations.CalculateVectorConstantOperations(eq1, EOperation.Addition, pivot);

            Assert.Equal(resultAdd.Constant, eq1.Constant + pivot);

            VectorEquation resultSubt = vectorOperations.CalculateVectorConstantOperations(eq1, EOperation.Subtraction, pivot);

            Assert.Equal(resultSubt.Constant, eq1.Constant - pivot);

            VectorEquation resultMult = vectorOperations.CalculateVectorConstantOperations(eq1, EOperation.Multiplication, pivot);

            Assert.Equal(resultMult.Constant, eq1.Constant * pivot);

            VectorEquation resultDiv = vectorOperations.CalculateVectorConstantOperations(eq1, EOperation.Division, pivot);

            Assert.Equal(resultDiv.Constant, eq1.Constant / pivot);
        }
コード例 #5
0
ファイル: ServicioTraza.cs プロジェクト: JosemiGT/TODSApp
        public void TrazaEcuacionVectorialVertical(VectorEquation ev)
        {
            if (ev != null && ev.CuerpoVector.Count() > 0)
            {
                StreamWriter mytxt = File.AppendText(Path);

                mytxt.WriteLine("");

                foreach (KeyValuePair <string, double> valor in ev.CuerpoVector)
                {
                    mytxt.WriteLine("{0} --> {1}", valor.Key, valor.Value.ToString());
                }

                mytxt.WriteLine("");
                mytxt.WriteLine("Termino Independiente: {0}", ev.TerminoIndependiente.ToString());
                mytxt.WriteLine("");
                mytxt.Close();
            }
        }
コード例 #6
0
        public void isEqualDimensionVectorsTest()
        {
            VectorHelper vectorHelper = new VectorHelper();

            List <VectorEquation> vectors = new List <VectorEquation>();
            VectorEquation        eq1     = new VectorEquation(new Dictionary <string, double> {
                { "x1", 1 },
                { "x2", 2 }
            }, 0);
            VectorEquation eq2 = new VectorEquation(new Dictionary <string, double>
            {
                { "x1", 1 },
                { "x2", 1 }
            }, 0);

            vectors.Add(eq1);
            vectors.Add(eq2);

            Assert.True(vectorHelper.isEqualVariableVectors(vectors));
        }
コード例 #7
0
        public VectorEquation CalculateVectorsOperations(VectorEquation vector1, EOperation operation, VectorEquation vector2)
        {
            VectorEquation result = new VectorEquation(new Dictionary <string, double>(), 0);

            if (vectorHelper.isEqualVariableVectors(new List <VectorEquation> {
                vector1, vector2
            }))
            {
                List <string> vars = vector1.VectorBody.Keys.ToList();

                foreach (string var in vars)
                {
                    switch (operation)
                    {
                    case EOperation.Addition:
                        result.VectorBody.Add(var, vector1.VectorBody[var] + vector2.VectorBody[var]);
                        break;

                    case EOperation.Subtraction:
                        result.VectorBody.Add(var, vector1.VectorBody[var] - vector2.VectorBody[var]);
                        break;

                    case EOperation.Multiplication:
                        result.VectorBody.Add(var, vector1.VectorBody[var] * vector2.VectorBody[var]);
                        break;

                    case EOperation.Division:
                        result.VectorBody.Add(var, vector1.VectorBody[var] / vector2.VectorBody[var]);
                        break;
                    }
                }

                result.Constant = CalculateOperations(vector1.Constant, operation, vector2.Constant);
            }

            return(result);
        }
コード例 #8
0
ファイル: DataManagement.cs プロジェクト: JosemiGT/TODSApp
 public VectorEquation OrderDictionaryByVariable(VectorEquation equation)
 {
     return(new VectorEquation(equation.Nombre, OrderDictionaryByVariable(equation.CuerpoVector), equation.TerminoIndependiente));
 }
コード例 #9
0
        public bool ReduceRows(ref SimplexTable table, KeyValuePair <string, double> refCol, KeyValuePair <string, double> refRow)
        {
            bool isCorrect = false;
            List <VectorEquation> result = new List <VectorEquation>();

            if (table != null && !string.IsNullOrEmpty(refCol.Key) && !string.IsNullOrEmpty(refCol.Key))
            {
                VectorEquation eqRef = _vectorOperations.CalculateVectorConstantOperations(
                    table.StandardConstraint.FirstOrDefault(c => c.Name.Equals(refRow.Key)),
                    EOperation.Division,
                    refRow.Value);

                foreach (VectorEquation equation in table.StandardConstraint)
                {
                    if (equation.Name.Equals(refRow.Key))
                    {
                        eqRef.Name = equation.Name;
                        result.Add(eqRef);
                    }
                    else
                    {
                        VectorEquation redEqu = _vectorOperations.CalculateVectorsOperations(
                            equation,
                            EOperation.Subtraction,
                            _vectorOperations.CalculateVectorConstantOperations(
                                eqRef,
                                EOperation.Multiplication,
                                equation.VectorBody[refCol.Key])
                            );
                        redEqu.Name = equation.Name;
                        result.Add(redEqu);
                    }
                }

                double            pivotFO  = table.ObjectiveFunction.VectorBody.FirstOrDefault(f => f.Key == refCol.Key).Value;
                ObjectiveFunction ofResult = null;

                if (pivotFO != 0)
                {
                    VectorEquation redEqu = _vectorOperations.CalculateVectorsOperations(
                        table.ObjectiveFunction,
                        EOperation.Subtraction,
                        _vectorOperations.CalculateVectorConstantOperations(
                            eqRef,
                            EOperation.Multiplication,
                            pivotFO));

                    ofResult = new ObjectiveFunction(
                        redEqu,
                        table.ObjectiveFunction.isMaximice);
                }
                else
                {
                    ofResult = table.ObjectiveFunction;
                }

                table.StandardConstraint = result;
                table.ObjectiveFunction  = ofResult;

                if (table.Base != null && table.Base.Count() > 0)
                {
                    table.Base = refreshBase(table.Base, refRow.Key, refCol.Key);
                }

                isCorrect = true;
            }

            return(isCorrect);
        }