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); } }
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]); } }
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); } }
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); }
public VoidClass Conversion(INumVar var, NumVarType type) { var.var.Set(GRB.CharAttr.VType, type.type); return new VoidClass(); }
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; }
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; }
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; }
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; }
public INumVar[] NumVarArray(int num, double[] lbs, double[] ubs, NumVarType[] types) { return NumVarArray(num, lbs, ubs, types, null); }
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"); } }
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); }
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; } }