mplCirclePack.cs

CSsharp Example:


using System;
using System.Collections.Generic;
using Maximal.OptiMax;

namespace CirclePack
{
   class MplCirclePack
   {
      private string _resultString;
      private double[] _xValues;
      private double[] _yValues;
      private double _radius;

      public MplCirclePack()
      {
         _resultString = "";
         _xValues = new double[0];
         _yValues = new double[0];
         _radius = 0.0;
      }

      private ResultType loadModel(Model model, int circleCount)
      {
         try
         {
            model.IndexSets.Add("i", 1, circleCount);
            model.IndexSets.AddAlias("j", "i");

            Variable varRadius = model.PlainVariables.Add("Radius");
            VariableVector varX = model.VariableVectors.Add("x[i]", VariableType.Free);
            VariableVector varY = model.VariableVectors.Add("y[i]", VariableType.Free);

            varRadius.UpperBound = 1.0;
            varX.LowerBound = -1.0;
            varX.UpperBound = 1.0;
            varY.LowerBound = -1.0;
            varY.UpperBound = 1.0;

            model.Objectives.Add("Radius", ObjectSense.Maximize);
            model.ConstraintVectors.Add("NoOverlap[i,j]",
               "2 * Radius <= ((x[i] - x[i:=j])^2 + (y[i] - y[i:=j])^2)^0.5", "WHERE(i < j)");
            model.ConstraintVectors.Add("InBoundsA[i]", "x + Radius <= 1");
            model.ConstraintVectors.Add("InBoundsB[i]", "x - Radius >= -1");
            model.ConstraintVectors.Add("InBoundsC[i]", "y + Radius <= 1");
            model.ConstraintVectors.Add("InBoundsD[i]", "y - Radius >= -1");
         }
         catch (Exception ex)
         {
            Console.WriteLine(ex.Message);
         }
         return model.LastResult;
      }


      public bool SolveModel(string solverName, int numCircles)
      {
         OptiMax mpl = new OptiMax();
         Model model = mpl.Models.Add("CirclePack");
         mpl.Options["ModelType"].ValueStr = "Nonlinear";
         mpl.Options["ParserType"].ValueStr = "Extended";
         Solver solver = mpl.Solvers.Add(solverName);
         if (solver == null)
         {
            _resultString = "Solver " + solverName + " was not found.";
            return false;
         }
         ResultType result = loadModel(model, numCircles);
         if (result != ResultType.Success)
         {
            _resultString = model.Error.ToString();
            return false;
         }
         result = model.Solve();
         if (result != ResultType.Success)
         {
            _resultString = "Solver " + solver.Name + ": " + model.ResultString + "\n" + model.Solution.ResultString;
            return false;
         }
         _resultString = model.Solution.ResultString;
         getSolutionValues(model);
         return true;
      }


      private void getSolutionValues(Model model)
      {
         _radius = model.Solution.ObjectValue;
         List<double> xList = new List<double>();
         List<double> yList = new List<double>();
         foreach (Variable xVar in model.VariableVectors["x"])
         {
            xList.Add(xVar.Activity);
         }
         foreach (Variable yVar in model.VariableVectors["y"])
         {
            yList.Add(yVar.Activity);
         }
         _xValues = xList.ToArray();
         _yValues = yList.ToArray();
      }


      public string ResultString
      {
         get { return _resultString; }
      }

      public double Radius
      {
         get { return _radius; }
      }

      public double[] XValues
      {
         get { return _xValues; }
      }

      public double[] YValues
      {
         get { return _yValues; }
      }

   }
}


        

Back To Top | Maximal Home Page | List of Samples | Previous Page | Next Page