Index: trunk/sources/HeuristicLab.Problems.LinearAssignment/3.3/LinearAssignmentProblem.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.LinearAssignment/3.3/LinearAssignmentProblem.cs	(revision 11086)
+++ trunk/sources/HeuristicLab.Problems.LinearAssignment/3.3/LinearAssignmentProblem.cs	(revision 11087)
@@ -33,5 +33,5 @@
 
 namespace HeuristicLab.Problems.LinearAssignment {
-  [Item("LinearAssignmentProblem", "In the linear assignment problem (LAP) an assignment of workers to jobs has to be found such that each worker is assigned to exactly one job, each job is assigned to exactly one worker and the sum of the resulting costs needs to be minimal.")]
+  [Item("LinearAssignmentProblem", "In the linear assignment problem (LAP) an assignment of workers to jobs has to be found such that each worker is assigned to exactly one job, each job is assigned to exactly one worker and the sum of the resulting costs is minimal (or maximal).")]
   [Creatable("Problems")]
   [StorableClass]
@@ -153,4 +153,7 @@
       }
     }
+    private void Costs_Reset(object sender, EventArgs e) {
+      Parameterize();
+    }
     private void SolutionCreator_PermutationParameter_ActualNameChanged(object sender, EventArgs e) {
       Parameterize();
@@ -167,4 +170,5 @@
       Costs.RowsChanged += new EventHandler(Costs_RowsChanged);
       Costs.ColumnsChanged += new EventHandler(Costs_ColumnsChanged);
+      Costs.Reset += new EventHandler(Costs_Reset);
       SolutionCreator.PermutationParameter.ActualNameChanged += new EventHandler(SolutionCreator_PermutationParameter_ActualNameChanged);
     }
@@ -178,5 +182,7 @@
     private void Parameterize() {
       SolutionCreator.LengthParameter.Value = new IntValue(Costs.Rows);
-      SolutionCreator.LengthParameter.Hidden = false;
+      SolutionCreator.LengthParameter.Hidden = true;
+      SolutionCreator.PermutationTypeParameter.Value = new PermutationType(PermutationTypes.Absolute);
+      SolutionCreator.PermutationTypeParameter.Hidden = true;
       Evaluator.CostsParameter.ActualName = CostsParameter.Name;
       Evaluator.CostsParameter.Hidden = true;
Index: trunk/sources/HeuristicLab.Problems.LinearAssignment/3.3/LinearAssignmentProblemSolver.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.LinearAssignment/3.3/LinearAssignmentProblemSolver.cs	(revision 11086)
+++ trunk/sources/HeuristicLab.Problems.LinearAssignment/3.3/LinearAssignmentProblemSolver.cs	(revision 11087)
@@ -34,4 +34,7 @@
     private const int UNASSIGNED = -1;
 
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
     public ILookupParameter<DoubleMatrix> CostsParameter {
       get { return (ILookupParameter<DoubleMatrix>)Parameters["Costs"]; }
@@ -49,4 +52,5 @@
     public LinearAssignmentProblemSolver()
       : base() {
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "Whether the costs should be maximized or minimized."));
       Parameters.Add(new LookupParameter<DoubleMatrix>("Costs", LinearAssignmentProblem.CostsDescription));
       Parameters.Add(new LookupParameter<Permutation>("Assignment", "The assignment solution to create."));
@@ -58,10 +62,27 @@
     }
 
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      if (!Parameters.ContainsKey("Maximization"))
+        Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "Whether the costs should be maximized or minimized."));
+      #endregion
+    }
+
     public override IOperation Apply() {
       var costs = CostsParameter.ActualValue;
+      var maximization = MaximizationParameter.ActualValue.Value;
+      if (maximization) {
+        costs = (DoubleMatrix)costs.Clone();
+        for (int i = 0; i < costs.Rows; i++)
+          for (int j = 0; j < costs.Rows; j++)
+            costs[i, j] = -costs[i, j];
+      }
       double quality;
       var solution = Solve(costs, out quality);
 
       AssignmentParameter.ActualValue = new Permutation(PermutationTypes.Absolute, solution);
+      if (maximization) quality = -quality;
       QualityParameter.ActualValue = new DoubleValue(quality);
 
