Example #1
0
    internal static void BuildModelByColumn(IMPModeler model,
                                            Data data,
                                            INumVar[]  Buy,
                                            NumVarType type)
    {
        int nFoods = data.nFoods;
        int nNutrs = data.nNutrs;

        IObjective cost = model.AddMinimize();

        IRange[] constraint = new IRange[nNutrs];

        for (int i = 0; i < nNutrs; i++)
        {
            constraint[i] = model.AddRange(data.nutrMin[i], data.nutrMax[i]);
        }

        for (int j = 0; j < nFoods; j++)
        {
            Column col = model.Column(cost, data.foodCost[j]);
            for (int i = 0; i < nNutrs; i++)
            {
                col = col.And(model.Column(constraint[i], data.nutrPerFood[i][j]));
            }
            Buy[j] = model.NumVar(col, data.foodMin[j], data.foodMax[j], type);
        }
    }
Example #2
0
   internal static void BuildModelByRow(IModeler   model,
                                        Data       data,
                                        INumVar[]  Buy,
                                        NumVarType type) {
      int nFoods = data.nFoods;
      int nNutrs = data.nNutrs;

      for (int j = 0; j < nFoods; j++) {
         Buy[j] = model.NumVar(data.foodMin[j], data.foodMax[j], type);
      }
      model.AddMinimize(model.ScalProd(data.foodCost, Buy));

      for (int i = 0; i < nNutrs; i++) {
         model.AddRange(data.nutrMin[i],
                        model.ScalProd(data.nutrPerFood[i], Buy),
                        data.nutrMax[i]);
      }
   }
Example #3
0
    internal static void BuildModelByRow(IModeler model,
                                         Data data,
                                         INumVar[]  Buy,
                                         NumVarType type)
    {
        int nFoods = data.nFoods;
        int nNutrs = data.nNutrs;

        for (int j = 0; j < nFoods; j++)
        {
            Buy[j] = model.NumVar(data.foodMin[j], data.foodMax[j], type);
        }
        model.AddMinimize(model.ScalProd(data.foodCost, Buy));

        for (int i = 0; i < nNutrs; i++)
        {
            model.AddRange(data.nutrMin[i],
                           model.ScalProd(data.nutrPerFood[i], Buy),
                           data.nutrMax[i]);
        }
    }
Example #4
0
    internal static void BuildModelByColumn(IMPModeler model,
                                           Data       data,
                                           INumVar[]  Buy,
                                           NumVarType type)
    {
        int nFoods = data.nFoods;
          int nNutrs = data.nNutrs;

          IObjective cost       = model.AddMinimize();
          IRange[]   constraint = new IRange[nNutrs];

          for (int i = 0; i < nNutrs; i++) {
         constraint[i] = model.AddRange(data.nutrMin[i], data.nutrMax[i]);
          }

          for (int j = 0; j < nFoods; j++) {
         Column col = model.Column(cost, data.foodCost[j]);
         for (int i = 0; i < nNutrs; i++) {
            col = col.And(model.Column(constraint[i], data.nutrPerFood[i][j]));
         }
         Buy[j] = model.NumVar(col, data.foodMin[j], data.foodMax[j], type);
          }
    }
Example #5
0
    public static void Main(string[] args)
    {
        try {
            string     filename = "../../../../examples/data/diet.dat";
            bool       byColumn = false;
            NumVarType varType  = NumVarType.Float;

            for (int i = 0; i < args.Length; i++)
            {
                if (args[i].ToCharArray()[0] == '-')
                {
                    switch (args[i].ToCharArray()[1])
                    {
                    case 'c':
                        byColumn = true;
                        break;

                    case 'i':
                        varType = NumVarType.Int;
                        break;

                    default:
                        Usage();
                        return;
                    }
                }
                else
                {
                    filename = args[i];
                    break;
                }
            }

            Data data   = new Data(filename);
            int  nFoods = data.nFoods;
            int  nNutrs = data.nNutrs;

            // Build model
            Cplex     cplex = new Cplex();
            INumVar[] Buy   = new INumVar[nFoods];

            if (byColumn)
            {
                BuildModelByColumn(cplex, data, Buy, varType);
            }
            else
            {
                BuildModelByRow(cplex, data, Buy, varType);
            }

            // Solve model

            if (cplex.Solve())
            {
                System.Console.WriteLine();
                System.Console.WriteLine("Solution status = " + cplex.GetStatus());
                System.Console.WriteLine();
                System.Console.WriteLine(" cost = " + cplex.ObjValue);
                for (int i = 0; i < nFoods; i++)
                {
                    System.Console.WriteLine(" Buy" + i + " = " + cplex.GetValue(Buy[i]));
                }
                System.Console.WriteLine();
            }
            cplex.End();
        }
        catch (ILOG.Concert.Exception ex) {
            System.Console.WriteLine("Concert Error: " + ex);
        }
        catch (InputDataReader.InputDataReaderException ex) {
            System.Console.WriteLine("Data Error: " + ex);
        }
        catch (System.IO.IOException ex) {
            System.Console.WriteLine("IO Error: " + ex);
        }
    }
Example #6
0
 public INumVar[] NumVarArray(int num, double lb, double ub, NumVarType type)
 {
     double[] ubs = new double[num];
     double[] lbs = new double[num];
     NumVarType[] types = new NumVarType[num];
     for (int i = 0; i < num; i++)
     {
         lbs[i] = lb;
         ubs[i] = ub;
         types[i] = type;
     }
     return NumVarArray(num, lbs, ubs, types, null);
 }
Example #7
0
 public VoidClass Conversion(INumVar var, NumVarType type)
 {
     var.var.Set(GRB.CharAttr.VType, type.type);
     return new VoidClass();
 }
Example #8
0
 public INumVar NumVar(Column col, double lb, double ub, NumVarType type)
 {
     INumVar result = new INumVar();
     result.var = _model.AddVar(lb, ub, col.objCoef, type.type, col.column, null);
     return result;
 }
Example #9
0
 public INumVar NumVar(double lb, double ub, NumVarType type, string name)
 {
     INumVar result = new INumVar();
     result.name = name;
     result.var = _model.AddVar(lb, ub, 0, type.type, name);
     return result;
 }
Example #10
0
 public INumVar NumVar(double lb, double ub, NumVarType type)
 {
     INumVar result = new INumVar();
     result.var = _model.AddVar(lb, ub, 0, type.type, null);
     return result;
 }
Example #11
0
 public INumVar[] NumVarArray(int num, double[] lbs, double[] ubs, NumVarType[] types, string[] names)
 {
     INumVar[] result = new INumVar[num];
     char[] gurobi_types = null;
     if (types != null)
     {
         gurobi_types = new char[num];
         for (int i = 0; i < num; i++)
         {
             gurobi_types[i] = types[i].type;
         }
     }
     GRBVar[] vars = _model.AddVars(lbs, ubs, null, gurobi_types, names);
     for (int i = 0; i < num; i++)
     {
         result[i] = new INumVar();
         result[i].var = vars[i];
     }
     return result;
 }
Example #12
0
 public INumVar[] NumVarArray(int num, double[] lbs, double[] ubs, NumVarType[] types)
 {
     return NumVarArray(num, lbs, ubs, types, null);
 }
Example #13
0
        static void Main(string[] args)
        {
            int nSamples     = 0; // Number of samples
            int nMutGenes    = 0; // Number of mutation genes
            int nExpGenes    = 0; // Number of expression genes
            int nVar         = 0; // Number of variables in MILP
            int nPathways    = 5; // Number of pathways
            int nConstraints = 0; // Number of constraints in MILP

            Data data = new Data();

            // Loads input data.
            data.ReadData("../../inputFile.txt");

            nSamples  = data.mutMatrix.Length;
            nMutGenes = data.mutMatrix[0].Length;
            nExpGenes = data.connectMat.Length;

            // Total number of decision variables:
            // pM --> nMutGenes * nPathways
            // pE --> nExpGenes * nPathways
            // aM --> nSamples * nPathways
            // fM --> nSamples * nPathways
            nVar = (nMutGenes * nPathways) + (nExpGenes * nPathways) + 2 * (nSamples * nPathways);

            // Instance of cplex model.
            Cplex cplex = new Cplex();

            /* We were having issues with "Out of Memory" errors as we increased the number of samples and number of genes
             * To address this, we set parameter NodeFileInd = 3 --> this indicates that node info from MIP optimizer will be compressed
             * and written to files instead of accessing the computer memory during the simulation run
             *
             * */
            cplex.SetParam(Cplex.IntParam.NodeFileInd, 3);

            // Sets names of decision variables.
            string[] name = new string[nVar];

            for (int i = 1; i <= nVar; i++)
            {
                name[i - 1] = "x" + i.ToString();
            }

            // Sets type, lower and upper bound of decision variables.
            NumVarType[] varType = new NumVarType[nVar];
            double[]     lb      = new double[nVar];
            double[]     ub      = new double[nVar];

            for (int i = 0; i < nMutGenes * nPathways; i++)
            {
                // Variable pM is binary.
                varType[i] = NumVarType.Bool;
                lb[i]      = 0;
                ub[i]      = 1;
            }

            for (int i = nMutGenes * nPathways; i < (nMutGenes * nPathways) + (nExpGenes * nPathways); i++)
            {
                // Variable pE is real number.
                varType[i] = NumVarType.Float;
                lb[i]      = 0;
                ub[i]      = System.Double.MaxValue;
            }

            for (int i = (nMutGenes * nPathways) + (nExpGenes * nPathways); i < nVar; i++)
            {
                // Variables aM and fM are binary.
                varType[i] = NumVarType.Bool;
                lb[i]      = 0;
                ub[i]      = 1;
            }


            // Decision Variables.
            INumVar[] x = cplex.NumVarArray(nVar, lb, ub, varType, name);

            // Coeficients of objective function.
            double[] objvals = new double[nVar];

            int contobjvals = 0;
            int idMap       = 0; // Mapping index.

            // Variable pM.
            int[][] pM = new int[nMutGenes][]; // Mapping matrix pM.
            for (int i = 0; i < nMutGenes; i++)
            {
                pM[i] = new int[nPathways];
                for (int j = 0; j < nPathways; j++)
                {
                    // Mapping....
                    pM[i][j] = idMap;
                    idMap++;

                    objvals[contobjvals] = 0;
                    for (int k = 0; k < nSamples; k++)
                    {
                        // Weight associated with first component of objective function = 0.1.
                        objvals[contobjvals] += 0.1 * data.mutMatrix[k][i];
                    }

                    contobjvals++;
                }
            }

            // Variable pE.
            int[][] pE = new int[nExpGenes][];
            for (int i = 0; i < nExpGenes; i++)
            {
                pE[i] = new int[nPathways];
                for (int j = 0; j < nPathways; j++)
                {
                    // Mapping....
                    pE[i][j] = idMap;
                    idMap++;

                    // Weight associated with second component of objective function = 0.9.
                    objvals[contobjvals] = -0.9;
                    contobjvals++;
                }
            }

            // Variable aM.
            int[][] aM = new int[nSamples][];
            for (int i = 0; i < nSamples; i++)
            {
                aM[i] = new int[nPathways];
                for (int j = 0; j < nPathways; j++)
                {
                    // Mapping....
                    aM[i][j] = idMap;
                    idMap++;

                    // Weight associated with first component of objective function = 0.1.
                    objvals[contobjvals] = -0.1;
                    contobjvals++;
                }
            }

            // Variable fM.
            int[][] fM = new int[nSamples][];
            for (int i = 0; i < nSamples; i++)
            {
                fM[i] = new int[nPathways];
                for (int j = 0; j < nPathways; j++)
                {
                    // Mapping....
                    fM[i][j] = idMap;
                    idMap++;

                    // Weight associated with first component of objective function = 0.1.
                    objvals[contobjvals] = 0.1;
                    contobjvals++;
                }
            }

            // Defines the cost function as a minimization of decision variables with corresponding cost coefficients.
            cplex.Add(cplex.Minimize(cplex.ScalProd(x, objvals)));

            nConstraints = nMutGenes + nExpGenes + 2 * nPathways + nSamples * (nPathways - 1) + (nSamples * nPathways) + (nPathways * nExpGenes); // Total number of constraints.
            IRange[] constraint      = new IRange[nConstraints];
            int      contconstraints = 0;

            INumExpr[] Expr = null;

            // Constraints C1.
            Expr = new INumExpr[nPathways];
            for (int i = 0; i < nMutGenes; i++)
            {
                for (int j = 0; j < nPathways; j++)
                {
                    Expr[j] = x[pM[i][j]];
                }

                // Constraints of the form sum(pM) = 1.
                constraint[contconstraints]      = cplex.AddRange(1, 1); // Defines right hand side (= 1).
                constraint[contconstraints].Expr = cplex.Sum(Expr);      // Defines left hand side (sum(pM)).
                contconstraints++;
            }

            // Constraints C2.
            Expr = new INumExpr[nPathways];
            for (int i = 0; i < nExpGenes; i++)
            {
                for (int j = 0; j < nPathways; j++)
                {
                    Expr[j] = x[pE[i][j]];
                }

                // Constraints of the form sum(pE) > 0.
                constraint[contconstraints]      = cplex.AddRange(0.000001, System.Double.MaxValue); // Defines right hand side (> 0).
                constraint[contconstraints].Expr = cplex.Sum(Expr);                                  // Defines left hand side (sum(pE)).
                contconstraints++;
            }

            // Constraints C3.
            Expr = new INumExpr[nMutGenes];
            for (int i = 0; i < nPathways; i++)
            {
                for (int j = 0; j < nMutGenes; j++)
                {
                    Expr[j] = x[pM[j][i]];
                }

                // Constraints of the form sum(pM) >= 1.
                constraint[contconstraints]      = cplex.AddRange(1, System.Double.MaxValue); // Defines right hand side (>= 1).
                constraint[contconstraints].Expr = cplex.Sum(Expr);                           // Defines left hand side (sum(pM)).
                contconstraints++;
            }

            // Constraints C4.
            int id = nMutGenes * nPathways;

            Expr = new INumExpr[nExpGenes];
            for (int i = 0; i < nPathways; i++)
            {
                for (int j = 0; j < nExpGenes; j++)
                {
                    Expr[j] = x[pE[j][i]];
                }

                // Constraints of the form sum(pE) > 0.
                constraint[contconstraints]      = cplex.AddRange(0.000001, System.Double.MaxValue); // Defines right hand side (> 0).
                constraint[contconstraints].Expr = cplex.Sum(Expr);                                  // Defines left hand side (sum(pE)).
                contconstraints++;
            }

            // Constraints C5.
            id = nMutGenes * nPathways + nExpGenes * nPathways;
            for (int i = 0; i < nSamples; i++)
            {
                // Constraints of the form aM - aM >= 0.
                for (int j = 0; j < (nPathways - 1); j++)
                {
                    constraint[contconstraints]      = cplex.AddRange(0, System.Double.MaxValue);                                  // Defines right hand side (>= 0).
                    constraint[contconstraints].Expr = cplex.Sum(cplex.Prod(1.0, x[aM[i][j]]), cplex.Prod(-1.0, x[aM[i][j + 1]])); // Defines left hand side (aM - aM).
                    contconstraints++;
                }
            }

            // Constraints C6.
            Expr = new INumExpr[nMutGenes + 2];
            for (int i = 0; i < nSamples; i++) // Goes along lines of mutation matrix.
            {
                for (int k = 0; k < nPathways; k++)
                {
                    for (int j = 0; j < nMutGenes; j++) // Goes along columns of mutation matrix.
                    {
                        Expr[j] = cplex.Prod(data.mutMatrix[i][j], x[pM[j][k]]);
                    }

                    Expr[nMutGenes]     = cplex.Prod(1.0, x[fM[i][k]]);
                    Expr[nMutGenes + 1] = cplex.Prod(-1.0, x[aM[i][k]]);

                    // Constraints of the form sum(mutMat*pM) + fM - aM >= 0.
                    constraint[contconstraints]      = cplex.AddRange(0, System.Double.MaxValue); // Defines right hand side (>= 0).
                    constraint[contconstraints].Expr = cplex.Sum(Expr);                           // Defines left hand side (sum(mutMat*pM) + fM - aM).
                    contconstraints++;
                }
            }

            // Constraints C7.
            Expr = new INumExpr[nMutGenes + 1];
            for (int i = 0; i < nPathways; i++)
            {
                for (int j = 0; j < nExpGenes; j++)
                {
                    for (int k = 0; k < nMutGenes; k++)
                    {
                        Expr[k] = cplex.Prod(-data.connectMat[j][k], x[pM[k][i]]);
                    }

                    Expr[nMutGenes] = cplex.Prod(1.0, x[pE[j][i]]);

                    // Constraints of the form pE - sum(connectMat*pM) = 0.
                    constraint[contconstraints]      = cplex.AddRange(0, 0); // Defines right hand side (= 0).
                    constraint[contconstraints].Expr = cplex.Sum(Expr);      // Defines left hand side (pE - sum(connectMat*pM)).
                    contconstraints++;
                }
            }

            // Writes file with MILP model formulation.
            cplex.ExportModel("MILP.lp");

            try
            {
                if (cplex.Solve())
                {
                    // Retrieves optimal values of decision variables.
                    double[] xx = cplex.GetValues(x);

                    // Displays solution info on command window.
                    cplex.Output().WriteLine("Solution status=" + cplex.GetStatus());
                    cplex.Output().WriteLine("Solution value = " + cplex.ObjValue);

                    // Writes output to txt file.
                    StreamWriter objWriter = new StreamWriter("Result.txt");
                    int          cont      = 0;
                    string       sLine     = "";
                    int          nvars     = xx.Length;

                    objWriter.WriteLine("Total cost");
                    objWriter.WriteLine(cplex.ObjValue.ToString());
                    objWriter.WriteLine("");

                    objWriter.WriteLine("Matrix pM");
                    objWriter.WriteLine("");
                    for (int i = 0; i < nMutGenes; i++)
                    {
                        sLine = "";
                        for (int j = 0; j < nPathways; j++)
                        {
                            sLine += xx[cont].ToString() + "\t";
                            cont++;
                        }

                        objWriter.WriteLine(sLine);
                    }

                    // Value of second term of objective function (sum of pE's).
                    double sumPE = 0.0;

                    objWriter.WriteLine("");
                    objWriter.WriteLine("Matrix pE");
                    objWriter.WriteLine("");
                    for (int i = 0; i < nExpGenes; i++)
                    {
                        sLine = "";
                        for (int j = 0; j < nPathways; j++)
                        {
                            sLine += xx[cont].ToString() + "\t";
                            cont++;

                            // Computes running sum of pE's.
                            sumPE = sumPE + xx[cont];
                        }

                        objWriter.WriteLine(sLine);
                    }

                    objWriter.WriteLine("");
                    objWriter.WriteLine("Sum pE");
                    objWriter.WriteLine(sumPE.ToString());
                    objWriter.WriteLine("");

                    objWriter.WriteLine("");
                    objWriter.WriteLine("Matrix aM");
                    objWriter.WriteLine("");
                    for (int i = 0; i < nSamples; i++)
                    {
                        sLine = "";
                        for (int j = 0; j < nPathways; j++)
                        {
                            sLine += xx[cont].ToString() + "\t";
                            cont++;
                        }

                        objWriter.WriteLine(sLine);
                    }

                    objWriter.WriteLine("");
                    objWriter.WriteLine("Matrix fM");
                    objWriter.WriteLine("");
                    for (int i = 0; i < nSamples; i++)
                    {
                        sLine = "";
                        for (int j = 0; j < nPathways; j++)
                        {
                            sLine += xx[cont].ToString() + "\t";
                            cont++;
                        }

                        objWriter.WriteLine(sLine);
                    }

                    objWriter.Close();

                    // Writes optimal solution info to file.
                    cplex.WriteSolution("solution");
                }
                else
                {
                    cplex.GetCplexStatus();
                }
                cplex.End();
            }
            catch (ILOG.Concert.Exception e)
            {
                System.Console.WriteLine("Concert exception '" + e + "' caught");
            }
        }
Example #14
0
        private double one_tsp(int dim, int [][] matrix, int [] path)
        {
            int[] lo = new int[dim];

            for (int i = 0; i < dim; i++)
            {
                lo[i] = 1;
            }

            Cplex      cplex   = new Cplex();
            NumVarType varType = NumVarType.Bool;

            INumVar[][] x = new INumVar[dim][];
            for (int i = 0; i < dim; i++)
            {
                x[i] = cplex.NumVarArray(dim, 0, 1);
            }

            for (int i = 0; i < dim; i++)
            {
                for (int j = 0; j < dim; j++)
                {
                    x[i][j] = cplex.BoolVar();
                }
            }

            for (int j = 0; j < dim; j++)
            {
                INumExpr xcolSum = cplex.NumExpr();
                for (int i = 0; i < dim; i++)
                {
                    xcolSum = cplex.Sum(xcolSum, x[i][j]);
                }
                cplex.AddEq(lo[j], xcolSum);
            }

            varType = NumVarType.Float;
            INumVar[] u = new INumVar[dim];
            for (int j = 0; j < dim; j++)
            {
                u[j] = cplex.NumVar(0, 100000);
            }

            for (int j = 1; j < dim; j++)
            {
                cplex.AddGe(u[j], 0);
            }

            for (int i = 1; i < dim; i++)
            {
                for (int j = 1; j < dim; j++)
                {
                    if (i != j)
                    {
                        cplex.AddLe(cplex.Sum(cplex.Diff(u[i], u[j]), cplex.Prod(dim, x[i][j])), dim - 1);
                    }
                }
            }

            for (int i = 0; i < dim; i++)
            {
                INumExpr xrowSum = cplex.NumExpr();
                for (int j = 0; j < dim; j++)
                {
                    xrowSum = cplex.Sum(xrowSum, x[i][j]);
                }
                cplex.AddEq(lo[i], xrowSum);
            }

            INumExpr costSum = cplex.NumExpr();

            for (int i = 0; i < dim; i++)
            {
                for (int j = 0; j < dim; j++)
                {
                    costSum = cplex.Sum(costSum, cplex.Prod(x[i][j], matrix[i][j]));
                }
            }
            cplex.AddMinimize(costSum);

            try
            {
                if (cplex.Solve())
                {
                    //MessageBox.Show("Solution status = " + cplex.GetStatus());
                    //MessageBox.Show("cost = " + cplex.ObjValue);
                    int ipath = 0;
                    int depo  = -1;
                    for (int i = dim - 1; i >= 0; i--)
                    {
                        for (int j = 0; j < dim; j++)
                        {
                            if (Convert.ToInt16(cplex.GetValue(x[i][j])) == 1)
                            {
                                depo = i;
                            }
                        }
                    }
                    path[ipath] = depo;
                    ipath++;
                    while (depo > -1)
                    {
                        for (int j = 0; j < dim; j++)
                        {
                            if (Convert.ToInt16(cplex.GetValue(x[path[ipath - 1]][j])) == 1)
                            {
                                path[ipath] = j;
                                ipath++;
                                if (j == depo)
                                {
                                    depo = -1;
                                }
                                break;
                            }
                        }
                    }
                    return(cplex.ObjValue);
                }
                cplex.End();
            }
            catch (ILOG.Concert.Exception ex)
            {
                System.Console.WriteLine("Concert Error: " + ex);
            }
            return(-1);
        }
Example #15
0
        private void decomp(int dim, int kts, int[][] dist, List <int> WorkList)
        {
            int[] lo = new int[dim];
            int   dk = dim * kts;

            for (int i = 0; i < dim; i++)
            {
                lo[i] = 1;
            }

            Cplex      cplex   = new Cplex();
            NumVarType varType = NumVarType.Bool;

            INumVar[][] x = new INumVar[dim][];
            for (int i = 0; i < dim; i++)
            {
                x[i] = cplex.NumVarArray(dk, 0, 1);
            }

            for (int i = 0; i < dim; i++)
            {
                for (int j = 0; j < dk; j++)
                {
                    x[i][j] = cplex.BoolVar();
                }
            }

            //****************************************
            //Что тут происходит?
            for (int j = 0; j < dim; j++)
            {
                INumExpr xcolSum = cplex.NumExpr();
                for (int k = 0; k < kts; k++)
                {
                    for (int i = 0; i < dim; i++)
                    {
                        xcolSum = cplex.Sum(xcolSum, x[i][k * dim + j]);
                    }
                }
                cplex.AddEq(lo[j], xcolSum);
            }

            varType = NumVarType.Float;
            INumVar[] u = new INumVar[dk];
            for (int j = 0; j < dk; j++)
            {
                u[j] = cplex.NumVar(0, 100000);
            }

            for (int j = 1; j < dk; j++)
            {
                cplex.AddGe(u[j], 0);
            }

            for (int k = 0; k < kts; k++)
            {
                for (int i = 1; i < dim; i++)
                {
                    for (int j = 1; j < dim; j++)
                    {
                        if (i != j)
                        {
                            if (kts == 1)
                            {
                                cplex.AddLe(cplex.Sum(cplex.Diff(u[k * dim + i], u[k * dim + j]), cplex.Prod(dim, x[i][k * dim + j])), dim - 1);
                            }
                            else
                            {
                                cplex.AddLe(cplex.Sum(cplex.Diff(u[k * dim + i], u[k * dim + j]), cplex.Prod(dim, x[i][k * dim + j])), dim);
                            }
                        }
                    }
                }
            }

            for (int i = 0; i < dim; i++)
            {
                INumExpr xrowSum = cplex.NumExpr();
                for (int j = 0; j < dk; j++)
                {
                    xrowSum = cplex.Sum(xrowSum, x[i][j]);
                }
                cplex.AddEq(lo[i], xrowSum);
            }

            //Условия независимости кластеров
            if (kts > 1)
            {
                int[] a = new int[kts + 1];
                for (int k = 1; k < kts; k++)
                {
                    if (k > 1 && k < kts - 1)
                    {
                        continue;
                    }
                    int p;
                    for (int i = 1; i <= k; i++)
                    {
                        a[i] = i;
                    }
                    p = k;
                    while (p >= 1)
                    {
                        for (int m = 0; m < dim; m++)
                        {
                            INumExpr xcolrowSum = cplex.NumExpr();
                            for (int j = 1; j <= kts; j++)
                            {
                                bool row = false;
                                for (int i = 1; i <= k; i++)
                                {
                                    if (a[i] == j)
                                    {
                                        row = true;
                                    }
                                }
                                if (row)
                                {
                                    for (int t = 0; t < dim; t++)
                                    {
                                        xcolrowSum = cplex.Sum(xcolrowSum, x[m][(j - 1) * dim + t]);
                                    }
                                }
                                else
                                {
                                    for (int t = 0; t < dim; t++)
                                    {
                                        xcolrowSum = cplex.Sum(xcolrowSum, x[t][(j - 1) * dim + m]);
                                    }
                                }
                            }
                            cplex.AddLe(xcolrowSum, lo[m]);
                        }
                        if (a[k] == kts)
                        {
                            p--;
                        }
                        else
                        {
                            p = k;
                        }
                        if (p >= 1)
                        {
                            for (int i = k; i >= p; i--)
                            {
                                a[i] = a[p] + i - p + 1;
                            }
                        }
                    }
                }
            }

            INumExpr costSum = cplex.NumExpr();

            INumExpr[] costSum1 = new INumExpr[kts];

            if (kts == 1)
            {
                for (int i = 0; i < dim; i++)
                {
                    for (int j = 0; j < dim; j++)
                    {
                        costSum = cplex.Sum(costSum, cplex.Prod(x[i][j], dist[i][j]));
                    }
                }
                cplex.AddMinimize(costSum);
            }
            else
            {
                for (int k = 0; k < kts; k++)
                {
                    costSum1[k] = cplex.NumExpr();
                    for (int i = 0; i < dim; i++)
                    {
                        for (int j = 0; j < dim; j++)
                        {
                            costSum1[k] = cplex.Sum(costSum1[k], cplex.Prod(x[i][k * dim + j], dist[i][j]));
                        }
                    }
                    //cplex.AddLe(costSum1[k], costSum);
                }
                costSum = cplex.Max(costSum1);
                cplex.AddMinimize(costSum);
            }

            try
            {
                if (cplex.Solve())
                {
                    textBox1.Text += "lambda = " + cplex.ObjValue + Environment.NewLine;
                    textBox1.Text += DateTime.Now.ToString() + Environment.NewLine;

                    WorkList.Clear();
                    int num_clust = 0;
                    for (int k = 0; k < kts; k++)
                    {
                        int dim1 = 0;
                        for (int i = 0; i < dim; i++)
                        {
                            for (int j = 0; j < dim; j++)
                            {
                                if (Convert.ToInt16(cplex.GetValue(x[i][k * dim + j])) == 1)
                                {
                                    dim1++;
                                }
                            }
                        }

                        if (dim1 > 0)
                        {
                            num_clust++;
                            for (int i = 0; i < dim; i++)
                            {
                                for (int j = 0; j < dim; j++)
                                {
                                    if (Convert.ToInt16(cplex.GetValue(x[i][k * dim + j])) == 1)
                                    {
                                        WorkList.Add(i);
                                        break;
                                    }
                                }
                            }

                            WorkList.Add(-1);
                        }
                    }
                    textBox1.Text += DateTime.Now.ToString() + Environment.NewLine;
                }
                else
                {
                    textBox1.Text += "Нет решения" + Environment.NewLine;
                    textBox1.Text += DateTime.Now.ToString() + Environment.NewLine;
                }
                cplex.End();
            }
            catch (ILOG.Concert.Exception ex)
            {
                textBox1.Text += "Concert Error: " + ex + Environment.NewLine;
                textBox1.Text += DateTime.Now.ToString() + Environment.NewLine;
            }
        }