private int myVariablesCount; //pocet premennych #endregion Fields #region Constructors /// <summary> /// konštruktor /// </summary> /// <param name="variablesCount">počet premenných</param> public LinearTaskInputWindow(int variablesCount) { myVariablesCount = variablesCount; myType = LinearTypes.Maximalization; for (int i = 0; i < variablesCount; i++) { myCoeficients.Add(new CoeficientViewModel(i + 1)); } InitializeComponent(); DataContext = this; //nastavenie viazania }
/// <summary> /// metóda pre získanie zadania úlohy lineárneho programovania z okna /// </summary> /// <param name="variablesCount">počet premenných</param> /// <returns>zadanie úlohy lineárneho programovania</returns> public LPTreeBody GetTaskInput(int variablesCount) { LinearTaskInputWindow dlg = new LinearTaskInputWindow(variablesCount); bool? result = dlg.ShowDialog(); if (result == true) { myTaskType = dlg.TaskType; myTaskFunction = (Equation)dlg.CriterialFunction.Clone(); myTaskConditions = (EquationsCollection)dlg.ConditionFunctions; LPTreeBody tree = new LPTreeBody(dlg.CriterialFunction, dlg.ConditionFunctions, dlg.TaskType); return tree; } return null; }
private int myVariablesCount = 0; //pocet premennych #endregion Fields #region Constructors /// <summary> /// konštruktor /// </summary> /// <param name="theType">typ úlohy</param> /// <param name="theFunction">kriteriálna funkcia</param> public Simplex(LinearTypes theType, Equation theFunction) { myFunction = theFunction; myVariablesCount = myFunction.LeftSide.Count; myType = theType; }
/// <summary> /// metóda pre transformáciu problému do kanonického tvaru /// </summary> public void TransformToCanonicalForm() { // Zmena problemu na maximalizacny. if (myType == LinearTypes.Minimalization) { myType = LinearTypes.Maximalization; myFunction.Multiply(-1); } // Zmena nerovnosti na rovnosti. myConditions.RemoveInequality(); myTempFunction = myConditions.HelpFunction; // Zmena koeficientov na pravej strane na nezaporne. foreach (Equation item in myConditions) { if (item.RightSide < 0) { item.Multiply(-1); } } // Doplnenie 0 do kriteriálnej funkcie for (int i = 0; i < myConditions[0].LeftSide.Count - myVariablesCount; i++) { myFunction.AddVariable(0); } }
/// <summary> /// konštruktor /// </summary> /// <param name="function">kriteriálna funkcia</param> /// <param name="conditions">ohraničenia</param> /// <param name="type">typ úlohy lineárneho programovania</param> public LPTreeBody(Equation function, EquationsCollection conditions, LinearTypes type) { myRoot = new LPTreeItem(function, type, conditions); myUnprocessedItems.Add(myRoot); }
public static bool CanSyncLinear(System.Type type) => LinearTypes.Contains(type);
/// <summary> /// konštuktor /// </summary> /// <param name="function">kriteriálna funkcia</param> /// <param name="type">typ úlohy lineárneho programovaina</param> /// <param name="conditions">ohraničenia</param> public LPTreeItem(Equation function, LinearTypes type, EquationsCollection conditions) { myConditions = conditions; myFunction = function; myType = type; myFunctionBackup = (Equation)function.Clone(); foreach (Equation item in conditions) { myConditionsBackup.Add((Equation)item.Clone()); } Simplex simplex = new Simplex(myType, myFunction); simplex.InsertEquations(myConditions); Solution solution = simplex.Solve(); myNodeSolution = solution; if (solution != null) { myHasSolution = true; double val = double.MinValue; int index = -1; for (int i = 0; i < solution.Count; i++) { if (Math.Abs(Math.Round(solution[i]) - solution[i]) > 0.000005) { val = solution[i]; index = i; break; } } // Ak nie je nájdené riešenie celočíselné: if (val > double.MinValue + 0.000005) { int left = (int)Math.Floor(val); int right = (int)Math.Ceiling(val); // príprava ľavej strany ohraničenia List<double> leftSide = new List<double>(); for (int i = 0; i < myFunctionBackup.LeftSide.Count; i++) { if (i == index) { leftSide.Add(1); } else { leftSide.Add(0); } } // príprava ohraničenia pre ľavého syna EquationsCollection leftConditions = (EquationsCollection)myConditionsBackup.Clone(); leftConditions.Add(new Equation(leftSide, "<=", left)); // príprava ohraničenia pre pravého syna EquationsCollection rightConditions = (EquationsCollection)myConditionsBackup.Clone(); rightConditions.Add(new Equation(leftSide, ">=", right)); // vytvorenie potomkov myLeftChild = new LPTreeItem((Equation)myFunctionBackup.Clone(), myType, (EquationsCollection)leftConditions.Clone()); myRightChild = new LPTreeItem((Equation)myFunctionBackup.Clone(), myType, (EquationsCollection)rightConditions.Clone()); myUpperBound = myFunction.RightSide; } else { // Ak je nájdené riešenie celočíselné: myLowerBound = (int)myFunction.RightSide; myUpperBound = (int)myFunction.RightSide; myIsFinalNode = true; } } }
/// <summary> /// tlačidlo Reset /// </summary> private void btnReset_Click(object sender, RoutedEventArgs e) { myCoeficients.Clear(); for (int i = 0; i < myVariablesCount; i++) { myCoeficients.Add(new CoeficientViewModel(i + 1)); } myType = LinearTypes.Maximalization; myConditions.Clear(); IsConditionsCountLocked = false; ConditionsCount = 0; OnPropertyChanged("IsMaximalization"); OnPropertyChanged("IsMinimalization"); }