private void Button_Click_1(object sender, RoutedEventArgs e) { ok = true; for (int i = 0; i < person_num; i++) { for (int j = 0; j < person_num; j++) { if (!int.TryParse(arr[i][j].Text, out costs[i][j])) { ok = false; } else if (costs[i][j] < 0) { ok = false; } } } if (!ok) { MessageBox.Show("Enter a valid values", "Error", MessageBoxButton.OK, MessageBoxImage.Error); } else { CostButton.IsEnabled = false; solve = new solveWindow(person_num, costs); solve.Activate(); solve.Visibility = Visibility.Visible; solve.BringIntoView(); /*solveWindow.Activate(); * solveWindow.BringIntoView(); * solveWindow.Visibility = Visibility.Visible;*/ } }
public static void OptimalSol(int[][] costsClone, int[][] costs, int personNum, solveWindow solveWindow) { List <MyClass> ordering = new List <MyClass>(); for (int i = 0; i < personNum; i++) { int sum = 0; for (int j = 0; j < personNum; j++) { if (costsClone[i][j] == 0) { sum = sum + 1; } } MyClass temp = new MyClass(); temp.zeroNumber = sum; temp.rowIndex = i; ordering.Add(temp); } ordering.Sort(); foreach (var myClass in ordering) { Console.WriteLine(myClass); } bool[] taken = new bool[personNum]; int[] sol = new int[personNum]; for (int i = 0; i < personNum; i++) { sol[i] = -1; } bool once = true; for (int i = 0; i < personNum; i++) { for (int j = 0; j < personNum; j++) { if (ordering.Count > 0) { if (costsClone[ordering[0].rowIndex][j] == 0 && !taken[j]) { if (once) { sol[ordering[0].rowIndex] = j; costsClone[ordering[0].rowIndex][j] = -1; for (int l = 0; l < personNum; l++) { costsClone[l][j] = -1; } for (int l = 0; l < personNum; l++) { costsClone[ordering[0].rowIndex][l] = -1; } once = false; } ordering.Clear(); } } } for (int k = 0; k < personNum; k++) { int sum = 0; for (int j = 0; j < personNum; j++) { if (costsClone[k][j] == 0) { sum = sum + 1; } } if (sum > 0) { MyClass temp = new MyClass(); temp.zeroNumber = sum; temp.rowIndex = k; ordering.Add(temp); } } ordering.Sort(); foreach (var myClass in ordering) { Console.WriteLine(myClass); } once = true; } for (int i = 0; i < personNum; i++) { TextBlock solbBlock = new TextBlock(); solbBlock.Text = "\nPerson Number: " + (i + 1).ToString() + " take job number " + (sol[i] + 1).ToString(); solbBlock.TextWrapping = TextWrapping.Wrap; solbBlock.FontSize = 15; solbBlock.Foreground = Brushes.DarkMagenta; solveWindow.SolvePanel.Children.Add(solbBlock); } int optimalSol = 0; for (int i = 0; i < personNum; i++) { optimalSol = optimalSol + costs[i][sol[i]]; } TextBlock solBlock2 = new TextBlock(); solBlock2.Text = "\nthe minimum cost is: " + optimalSol.ToString() + "\n"; solBlock2.TextWrapping = TextWrapping.Wrap; solBlock2.FontSize = 15; solBlock2.Foreground = Brushes.DarkMagenta; solveWindow.SolvePanel.Children.Add(solBlock2); }
public static void Solve(int personNum, int[][] costs, solveWindow solveWindow) { //مشان الواجهات StackPanel[] SolvPanels; SolvPanels = new StackPanel[personNum]; TextBlock explainLabel = new TextBlock(); explainLabel.Text = "\nSubtract the smallest entry in each row from all the entries of its row\n" + "Subtract the smallest entry in each column from all the entries of its column\n"; explainLabel.TextWrapping = TextWrapping.WrapWithOverflow; explainLabel.FontSize = 15; explainLabel.Foreground = Brushes.DarkMagenta; solveWindow.SolvePanel.Children.Add(explainLabel); for (int i = 0; i < personNum; i++) { SolvPanels[i] = new StackPanel(); SolvPanels[i].Orientation = Orientation.Horizontal; SolvPanels[i].HorizontalAlignment = HorizontalAlignment.Center; } //خلصو الواجهات //حل for (int i = 0; i < personNum; i++) { min_row(costs, i, personNum); } for (int i = 0; i < personNum; i++) { min_col(costs, i, personNum); } //حل //واجهات TextBox[][] solveBoxs = new TextBox[personNum][]; for (int i = 0; i < personNum; i++) { solveBoxs[i] = new TextBox[personNum]; } for (int i = 0; i < personNum; i++) { for (int j = 0; j < personNum; j++) { solveBoxs[i][j] = new TextBox(); } } for (int i = 0; i < personNum; i++) { for (int j = 0; j < personNum; j++) { solveBoxs[i][j].Text = costs[i][j].ToString(); } } for (int i = 0; i < personNum; i++) { for (int j = 0; j < personNum; j++) { solveBoxs[i][j].Background = Brushes.FloralWhite; solveBoxs[i][j].Foreground = Brushes.DeepPink; solveBoxs[i][j].TextAlignment = TextAlignment.Center; solveBoxs[i][j].BorderBrush = Brushes.DarkViolet; solveBoxs[i][j].Height = 20; solveBoxs[i][j].Width = 60; SolvPanels[i].Children.Add(solveBoxs[i][j]); } solveWindow.SolvePanel.Children.Add(SolvPanels[i]); } //واجهات. //طباعة //نهاية الطباعة List <minLine> minLines = new List <minLine>(); for (int i = 0; i < personNum; i++) { int zeroSum = 0; for (int j = 0; j < personNum; j++) { if (costs[i][j] == 0) { zeroSum = zeroSum + 1; } } minLine tempmMinLine = new minLine(); tempmMinLine.zeroNum = zeroSum; tempmMinLine.rowOrcol = true; tempmMinLine.index = i; minLines.Add(tempmMinLine); } for (int i = 0; i < personNum; i++) { int zeroSum = 0; for (int j = 0; j < personNum; j++) { if (costs[j][i] == 0) { zeroSum = zeroSum + 1; } } minLine tempmMinLine = new minLine(); tempmMinLine.zeroNum = zeroSum; tempmMinLine.rowOrcol = false; tempmMinLine.index = i; minLines.Add(tempmMinLine); } //true if covred bool[] flagRow = new bool[personNum]; bool[] flagCol = new bool[personNum]; for (int i = 0; i < personNum; i++) { flagRow[i] = flagCol[i] = false; } //ترتيب الائحة بحسب العواميد أو الأسطر التي تحوي أكبر عدد من الأصفار minLines.Sort(); minLines.Reverse(); //طباعة /* foreach (minLine minLine in minLines) * { * Console.WriteLine(minLine); * }*/ //نهاية الطباعة //مصفوفة لمعرفة هل حذف السطر عامودياأو افقيا LineType[][] line = new LineType[personNum][]; for (int i = 0; i < personNum; i++) { line[i] = new LineType[personNum]; } for (int i = 0; i < personNum; i++) { for (int j = 0; j < personNum; j++) { line[i][j] = LineType.none; } } int minimunline = 0; foreach (minLine minLine in minLines) { if (!allZeroCoverd(line, costs, personNum)) { if (minLine.rowOrcol) { if (!AllcoveredInrow(line, costs, minLine.index, personNum)) { for (int j = 0; j < personNum; j++) { line[minLine.index][j] = LineType.horz; } minimunline++; flagRow[minLine.index] = true; } } if (!minLine.rowOrcol) { if (!AllcoveredIncol(line, costs, minLine.index, personNum)) { for (int j = 0; j < personNum; j++) { line[j][minLine.index] = LineType.vert; } minimunline++; flagCol[minLine.index] = true; } } } } //colCheck for (int i = 0; i < personNum; i++) { int flagrow = 0; int flagcol = 0; for (int j = 0; j < personNum; j++) { if (costs[j][i] == 0) { if (flagRow[j]) { flagrow++; } if (flagCol[i]) { flagcol++; } } } if (flagcol == flagrow) { for (int j = 0; j < personNum; j++) { if (costs[j][i] != 0 && line[j][i] == LineType.vert) { line[j][i] = LineType.none; } if (costs[j][i] == 0) { line[j][i] = LineType.horz; } } minimunline = minimunline - 1; flagCol[i] = false; } } //check row for (int i = 0; i < personNum; i++) { int flagrow = 0; int flagcol = 0; for (int j = 0; j < personNum; j++) { if (costs[i][j] == 0) { if (flagRow[i]) { flagrow++; } if (flagCol[j]) { flagcol++; } } } if (flagcol == flagrow) { for (int j = 0; j < personNum; j++) { if (costs[i][j] != 0 && line[i][j] == LineType.horz) { line[i][j] = LineType.none; } if (costs[i][j] == 0) { line[i][j] = LineType.vert; } } minimunline = minimunline - 1; flagRow[i] = false; } } // Console.WriteLine(minimunline); StackPanel[] solvePanels2 = new StackPanel[personNum]; for (int i = 0; i < personNum; i++) { solvePanels2[i] = new StackPanel(); solvePanels2[i].Orientation = Orientation.Horizontal; solvePanels2[i].HorizontalAlignment = HorizontalAlignment.Center; } TextBox[][] solvBox2 = solveBoxs; /* for (int i = 0; i < personNum; i++) * { * solvBox2[i] = new TextBox[personNum]; * * }*/ for (int i = 0; i < personNum; i++) { SolvPanels[i].Children.Clear(); } for (int i = 0; i < personNum; i++) { for (int j = 0; j < personNum; j++) { // solvBox2[i][j]=new TextBox(); solvBox2[i][j].Background = Brushes.FloralWhite; solvBox2[i][j].Foreground = Brushes.DeepPink; solvBox2[i][j].TextAlignment = TextAlignment.Center; solvBox2[i][j].BorderBrush = Brushes.DarkViolet; solvBox2[i][j].Height = 20; solvBox2[i][j].Width = 60; solvBox2[i][j].FontSize = 14; } } TextDecoration textDecoration = new TextDecoration(); textDecoration.Location = TextDecorationLocation.Strikethrough; textDecoration.Pen = new Pen(Brushes.Black, 4); textDecoration.PenThicknessUnit = TextDecorationUnit.FontRecommended; TextDecorationCollection myCollection = new TextDecorationCollection(); myCollection.Add(textDecoration); for (int i = 0; i < personNum; i++) { for (int j = 0; j < personNum; j++) { if (line[i][j] == LineType.none) { solvBox2[i][j].Text = costs[i][j].ToString(); } else if (line[i][j] == LineType.horz) { solvBox2[i][j].Text = costs[i][j].ToString(); solvBox2[i][j].TextDecorations = myCollection; } else { solvBox2[i][j].Text = costs[i][j].ToString(); solvBox2[i][j].TextDecorations = myCollection; } solvePanels2[i].Children.Add(solvBox2[i][j]); } solveWindow.SolvePanel.Children.Add(solvePanels2[i]); } bool optimal = false; if (minimunline == personNum) { TextBlock explainBlock = new TextBlock(); explainBlock.Text = "\nThe solution is optimal\n"; explainBlock.TextWrapping = TextWrapping.WrapWithOverflow; explainBlock.FontSize = 15; explainBlock.Foreground = Brushes.DarkMagenta; solveWindow.SolvePanel.Children.Add(explainBlock); } else { TextBlock expalinBlock2 = new TextBlock(); expalinBlock2.Text = "the solution is not optimal \n" + "Determine the smallest entry not covered by any line.\n" + "Subtractthis entry from each uncovered row" + "\nthen add it to each covered column\n"; expalinBlock2.TextWrapping = TextWrapping.Wrap; expalinBlock2.FontSize = 15; expalinBlock2.Foreground = Brushes.DarkMagenta; int min = int.MaxValue; for (int i = 0; i < personNum; i++) { if (!flagRow[i]) { for (int j = 0; j < personNum; j++) { if (costs[i][j] < min && costs[i][j] != 0) { min = costs[i][j]; } } } } TextBlock explainBlock3 = new TextBlock(); explainBlock3.Text = "\nthe minimum vaule is: " + min.ToString(); explainBlock3.TextWrapping = TextWrapping.Wrap; explainBlock3.FontSize = 15; explainBlock3.Foreground = Brushes.DarkMagenta; solveWindow.SolvePanel.Children.Add(explainBlock3); // Console.WriteLine("min is " + min); for (int i = 0; i < personNum; i++) { if (!flagRow[i]) { for (int j = 0; j < personNum; j++) { costs[i][j] = costs[i][j] - min; } } } for (int i = 0; i < personNum; i++) { if (flagCol[i]) { for (int j = 0; j < personNum; j++) { costs[j][i] = costs[j][i] + min; } } } Solve(personNum, costs, solveWindow); } }