using Google.OrTools.LinearSolver;
public class SimpleMipProgram
int numLoadingPlaces = 5;
Solver solver = Solver.CreateSolver("SCIP");
Objective objective = solver.Objective();
Variable[,] booking = new Variable[numBookings, numLoadingPlaces];
for (int k=0; k < numBookings; k++)
Constraint bookingConstraint = solver.MakeConstraint();
bookingConstraint.SetBounds(1.0,1.0) ;
for (int j=0; j < numLoadingPlaces; j++)
booking[k,j] = solver.MakeBoolVar("booking[k,j]");
booking[k,j] = solver.MakeIntVar(0,0,"booking[k,j]");
bookingConstraint.SetCoefficient(booking[k,j],1);
Variable[,] capacity = new Variable[numLoadingPlaces, numTimePeriod];
Variable[,] capacityError = new Variable[numLoadingPlaces,numTimePeriod];
for (int i=0; i < numTimePeriod; i++) {
for (int j=0; j < numLoadingPlaces; j++)
capacity[j,i] = solver.MakeBoolVar("capacity_j,i");
capacityError[j,i] = solver.MakeIntVar(0,numBookings,"capacityError_i");
objective.SetCoefficient(capacity[j,i], 1);
objective.SetCoefficient(capacityError[j,i], -10);
Constraint loadingPlaceConstraint = solver.MakeConstraint();
loadingPlaceConstraint.SetUb(1);
loadingPlaceConstraint.SetCoefficient(capacity[j,i],1);
loadingPlaceConstraint.SetCoefficient(capacityError[j,i],-1);
for (int k=0; k < numBookings; k++)
loadingPlaceConstraint.SetCoefficient(booking[k,j],1);
objective.SetMaximization();
Solver.ResultStatus resultStatus = solver.Solve();
Console.WriteLine("Solution:");
Console.WriteLine("Objective value = " + solver.Objective().Value());
for (int j=0; j < numLoadingPlaces; j++)
Console.Write("capacity["+j+"]=[ ");
for (int i=0; i < numTimePeriod; i++)
Console.Write(capacity[j,i].SolutionValue() + " ");
for (int k=0; k < numBookings; k++)
Console.Write("booking=["+ k + "] = [");
for (int j=0; j < numLoadingPlaces; j++)
Console.Write(booking[k,j].SolutionValue() + " ");
for (int j=0; j < numLoadingPlaces; j++)
Console.Write("capacity error["+j+"]=[ ");
for (int i=0; i < numTimePeriod; i++)
Console.Write(capacityError[j,i].SolutionValue() + " ");