public MathSign CreateMathSign(MathSigns _eType, IngameBuilding _buildingA, IngameBuilding _buildingB) { Vector3 v3PosA = _buildingA.transform.position; Vector3 v3PosB = _buildingB.transform.position; Vector3 v3DirAB = v3PosB - v3PosA; Vector3 v3PosMidAB = v3PosA + v3DirAB * .5f; Vector3 v3TargetWorldPos = v3PosMidAB; Vector2 v2TargetViewportPos = Camera.main.WorldToViewportPoint(v3TargetWorldPos); Vector2 v2CanvasSize = GetComponent <RectTransform>().sizeDelta; Vector2 v2TargetGuiPos = new Vector2(v2CanvasSize.x * v2TargetViewportPos.x, v2CanvasSize.y * v2TargetViewportPos.y); MathSign sign = Instantiate(p_mathSign, transform, false); sign.GetComponent <RectTransform>().anchoredPosition = v2TargetGuiPos; sign.transform.SetAsFirstSibling(); sign.Initialize(_eType); return(sign); }
private void buttonCompute_Click(object sender, EventArgs e) { bool[] minimize = new bool[countCrit]; double[,] criteriaCoefficients = new double[countCrit, countVar]; double[,] constraintCoefficients = new double[countConstr, countVar]; double[] constants = new double[countConstr]; MathSign[] constraintSigns = new MathSign[countConstr]; int[] NotNonNegativeVarInd; List <string> comboboxText = new List <string>(); foreach (Control c in panel1.Controls) { if (c is ComboBox) { comboboxText.Add(((ComboBox)c).SelectedItem.ToString()); } } for (int i = 0; i < countCrit; i++) { minimize[i] = comboboxText[i] == "MIN"; } for (int i = countCrit; i < countCrit + countConstr; i++) { switch (comboboxText[i]) { case "<=": constraintSigns[i - countCrit] = MathSign.LessThan; break; case ">=": constraintSigns[i - countCrit] = MathSign.GreaterThan; break; case "=": constraintSigns[i - countCrit] = MathSign.Equal; break; } } List <int> tempNotNonNeg = new List <int>(); for (int i = countCrit + countConstr; i < countCrit + countConstr + countVar; i++) { if (comboboxText[i] == " ") { tempNotNonNeg.Add(i - countCrit - countConstr); } } NotNonNegativeVarInd = tempNotNonNeg.ToArray(); for (int i = 0; i < criteriaTable.RowCount; i++) { for (int j = 0; j < criteriaTable.ColumnCount; j++) { criteriaCoefficients[i, j] = Convert.ToDouble(criteriaTable[j, i].Value); } } for (int i = 0; i < coeffTable.RowCount; i++) { for (int j = 0; j < coeffTable.ColumnCount; j++) { constraintCoefficients[i, j] = Convert.ToDouble(coeffTable[j, i].Value); } } for (int i = 0; i < constTable.RowCount; i++) { constants[i] = Convert.ToDouble(constTable[0, i].Value); } prob = new MultiCriteriaProblem(minimize, criteriaCoefficients, constraintCoefficients, constants, constraintSigns, NotNonNegativeVarInd); solutionsF = new double[prob.Minimize.Length]; SimplexMethod sm; labelOptF.Text = "("; simplexXOpt = new List <double[]>(); double[] x = new double[prob.CountVariables]; for (int i = 0; i < prob.CountCriteria; i++) { sm = new SimplexMethod(prob, i); Tuple <double, double[]> res; res = sm.Calculate(); if (res != null) { solutionsF[i] = res.Item1; simplexXOpt.Add(res.Item2); } else { solutionsF = null; simplexXOpt = null; break; } labelOptF.Text += solutionsF[i] + " "; } if (solutionsF != null) { labelOptF.Text += ")"; labelOptF.Visible = true; labelProblem.Text = "Решается следующая задача на заданном множестве ограничений:"; textBoxProb.Text = "min "; for (int i = 0; i < prob.CriteriaCoefficients.GetLength(0); i++) { textBoxProb.Text += "("; for (int j = 0; j < prob.CriteriaCoefficients.GetLength(1); j++) { textBoxProb.Text += prob.CriteriaCoefficients[i, j] + "X" + (j + 1); if (j != prob.CriteriaCoefficients.GetLength(1) - 1) { textBoxProb.Text += (prob.CriteriaCoefficients[i, j + 1] >= 0) ? "+" : ""; } } textBoxProb.Text += (solutionsF[i] > 0) ? "-" : "+"; textBoxProb.Text += Math.Abs(Math.Round(solutionsF[i], 1)); textBoxProb.Text += ")^2"; if (i != prob.CriteriaCoefficients.GetLength(0) - 1) { textBoxProb.Text += " + "; } } labelProblem.Visible = true; textBoxProb.Visible = true; buttonComputePenalty.Visible = true; } else { labelOptF.Text = "Система ограничений задачи несовместна"; labelOptF.Visible = true; } }
private void buttonOpenFromFile_Click(object sender, EventArgs e) { prob = null; panel1.Controls.Clear(); labelOptF.Visible = false; labelProblem.Visible = false; textBoxProb.Visible = false; OpenFileDialog dlg = new OpenFileDialog(); dlg.DefaultExt = ".txt"; dlg.Filter = "Текстовый документ (.txt)| *.txt"; if (dlg.ShowDialog() == DialogResult.OK) { string filename = dlg.FileName; string extension = Path.GetExtension(filename); try { if (extension == ".txt") { string[] fileLines = File.ReadAllLines(filename); if (fileLines.Length == 0) { throw new Exception("Пустой файл!"); } string[] split = fileLines[0].Split(' '); if (!Int32.TryParse(split[0], out countCrit)) { throw new Exception(wrongFileFormatMessage); } if (!Int32.TryParse(split[1], out countConstr)) { throw new Exception(wrongFileFormatMessage); } if (!Int32.TryParse(split[2], out countVar)) { throw new Exception(wrongFileFormatMessage); } bool[] minimize = new bool[countCrit]; double[,] criteriaCoefficients = new double[countCrit, countVar]; double[,] constraintCoefficients = new double[countConstr, countVar]; double[] constants = new double[countConstr]; MathSign[] constraintSigns = new MathSign[countConstr]; int[] NotNonNegativeVarInd; for (int i = 1; i <= countCrit; i++) { string line = fileLines[i]; string[] splitStr = line.Split(' '); minimize[i - 1] = splitStr[0] == "1"; for (int j = 1; j <= countVar; j++) { if (!Double.TryParse(splitStr[j], out criteriaCoefficients[i - 1, j - 1])) { throw new Exception(wrongFileFormatMessage); } } } for (int i = countCrit + 1; i < countConstr + countCrit + 1; i++) { string line = fileLines[i]; string[] splitStr = line.Split(' '); for (int j = 0; j < countVar; j++) { if (!Double.TryParse(splitStr[j], out constraintCoefficients[i - countCrit - 1, j])) { throw new Exception(wrongFileFormatMessage); } } if (!Double.TryParse(splitStr[countVar + 1], out constants[i - countCrit - 1])) { throw new Exception(wrongFileFormatMessage); } switch (splitStr[countVar]) { case "<=": constraintSigns[i - countCrit - 1] = MathSign.LessThan; break; case ">=": constraintSigns[i - countCrit - 1] = MathSign.GreaterThan; break; case "=": constraintSigns[i - countCrit - 1] = MathSign.Equal; break; default: throw new Exception(wrongFileFormatMessage); } } if (fileLines.Length == countConstr + countCrit + 2) { string[] splitStr = fileLines[countConstr + countCrit + 1].Split(' '); NotNonNegativeVarInd = new int[splitStr.Length]; for (int i = 0; i < splitStr.Length; i++) { if (!Int32.TryParse(splitStr[i], out NotNonNegativeVarInd[i])) { throw new Exception(wrongFileFormatMessage); } } } else { NotNonNegativeVarInd = null; } try { prob = new MultiCriteriaProblem(minimize, criteriaCoefficients, constraintCoefficients, constants, constraintSigns, NotNonNegativeVarInd); createUIProblem(countCrit, countVar, countConstr, false); } catch (Exception exc) { MessageBox.Show(exc.Message); } } buttonComputeF.Visible = true; buttonSaveProb.Visible = true; } catch (Exception ex) { MessageBox.Show(ex.Message); } } }