CSsharp Example:
using System;
using System.Collections.Generic;
using Maximal.OptiMax;
namespace CutStock
{
class MplCutStock
{
private string _resultString;
private double _totalCost;
private int _sheetsCut;
private int _totalSheets;
private int _totalWaste;
private int[] _solPatternCount;
private string[] _solPatternNames;
public MplCutStock()
{
_resultString = "";
_totalCost = 0.0;
_sheetsCut = 0;
_totalSheets = 0;
_totalWaste = 0;
_solPatternCount = new int[0];
_solPatternNames = new string[0];
}
private ResultType loadModel(Model model, double sheetPrice, int sheetsAvail,
int numWidths, int[] cutWidths, int[] cutDemands,
int numPatterns, int[] patternWaste, int[,] patternTable)
{
try
{
model.IndexSets.Add("patterns", "p", 1, numPatterns);
model.IndexSets.Add("cuts", "w", 1, numWidths);
model.DataConstants.Add("PriceSheet", sheetPrice);
model.DataConstants.Add("SheetsAvail", sheetsAvail);
model.DataVectors.Add("CutWidths[cuts]", cutWidths);
model.DataVectors.Add("CutDemand[cuts]", cutDemands);
model.DataVectors.Add("PatWaste[patterns]", patternWaste);
model.DataVectors.Add("CutsInPattern[patterns, cuts]", patternTable);
model.PlainVariables.Add("SheetsCut", "-> T1");
model.PlainVariables.Add("TotalCost", "-> TC");
model.VariableVectors.Add("PatternCount[patterns]", "-> \"\"");
model.VariableVectors.Add("ExcessCuts[cuts]", "-> X");
model.Objectives.Add("Obj", ObjectSense.Minimize, "TotalCost");
model.PlainConstraints.Add("TotCost", "TotalCost = PriceSheet*SheetsCut");
model.PlainConstraints.Add("RawAvail", "SheetsCut < SheetsAvail");
model.PlainConstraints.Add("Sheets", "SheetsCut = SUM(patterns: PatternCount[patterns])");
model.ConstraintVectors.Add("CutReq[cuts]",
"SUM(patterns: CutsInPattern[patterns, cuts] * PatternCount[patterns]) = CutDemand[cuts] + ExcessCuts[cuts]");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return model.LastResult;
}
public bool SolveModel(string solverName, double priceSheet, int sheetsAvail,
int numWidths, int[] cutWidths, int[] cutDemands,
int numPatterns, int[] patternWaste, int[,] patternTable)
{
OptiMax mpl = new OptiMax();
Model model = mpl.Models.Add("CutStock");
Solver solver = mpl.Solvers.Add(solverName);
if (solver == null)
{
_resultString = "Solver " + solverName + " was not found.";
return false;
}
model.WorkingDirectory = mpl.ModelDirectory;
ResultType result = loadModel(model, priceSheet, sheetsAvail, numWidths, cutWidths,
cutDemands, numPatterns, patternWaste, patternTable);
if (result != ResultType.Success)
{
_resultString = model.Error.ToString();
return false;
}
result = model.Solve(solver);
if (result != ResultType.Success)
{
_resultString = "Solver " + solver.Name + ": " + model.ResultString + "\n" + model.Solution.ResultString;
return false;
}
_resultString = model.Solution.ResultString;
getSolutionValues(model);
computeSolutionTotals(_solPatternCount, patternWaste);
return true;
}
private void getSolutionValues(Model model)
{
_totalCost = model.Solution.ObjectValue;
Variable sheetsCutVar = model.PlainVariables["SheetsCut"];
_sheetsCut = Convert.ToInt32(sheetsCutVar.Activity);
List<string> solPatternNames = new List<string>();
List<int> solPatterns = new List<int>();
VariableVector patternCountVect = model.VariableVectors["PatternCount"];
foreach (Variable var in patternCountVect)
{
solPatternNames.Add(patternCountVect.Subscripts[1].ValueStr);
solPatterns.Add(Convert.ToInt32(var.Activity));
}
_solPatternNames = solPatternNames.ToArray();
_solPatternCount = solPatterns.ToArray();
}
private void computeSolutionTotals(int[] patternCount, int[] patternWaste)
{
_totalSheets = 0;
_totalWaste = 0;
for (int p = 0; p < patternCount.Length; p++)
{
if (patternCount[p] > 0)
{
_totalSheets += patternCount[p];
_totalWaste += patternWaste[p] * patternCount[p];
}
}
}
public string ResultString
{
get { return _resultString; }
}
public double TotalCost
{
get { return _totalCost; }
}
public int SheetsCut
{
get { return _sheetsCut; }
}
public int TotalSheets
{
get { return _totalSheets; }
}
public int TotalWaste
{
get { return _totalWaste; }
}
public int[] SolPatternCount
{
get { return _solPatternCount; }
}
public string[] SolPatternNames
{
get { return _solPatternNames; }
}
}
}