Java cplex在优化中的条件约束

Java cplex在优化中的条件约束,java,cplex,Java,Cplex,我正在与Java一起开发一个cplex模型,我需要一个条件约束,但似乎cplex.ifthen代码根本没有执行 我想知道,如果数组的一个元素等于一,那么相同列号的一个元素应该等于一 这是我的密码。基本上,我创建了两个维度相同的矩阵。首先,我从第一个矩阵中选择了最小值,即4。现在我想从该列中选择最小元素。为此,我使用了cplex。如果但它不起作用 package sch; import ilog.concert.*; import ilog.cplex.*; import ilog.conce

我正在与Java一起开发一个cplex模型,我需要一个条件约束,但似乎
cplex.ifthen
代码根本没有执行

我想知道,如果数组的一个元素等于一,那么相同列号的一个元素应该等于一

这是我的密码。基本上,我创建了两个维度相同的矩阵。首先,我从第一个矩阵中选择了最小值,即4。现在我想从该列中选择最小元素。为此,我使用了
cplex。如果
但它不起作用

package sch;

import ilog.concert.*;
import ilog.cplex.*;

import ilog.concert.IloException;
import ilog.concert.IloLinearNumExpr;
import ilog.concert.IloNumVar;
import ilog.cplex.IloCplex;

public class Firsttry {

    public static void main(String[] args) {
        schedule();

    }

    public static void schedule() {
        int exp = 3;
        int imp = 5;
        double[] volI = { 10.5, 5.0, 15.5, 16, 2.0 };
        double shipv = 0.25;
        double[][] days = { { 115, 7, 9, 8, 7 }, { 555, 14, 8, 7, 12 }, { 112, 6, 8, 10, 4 } };
        try {

            IloCplex cplex = new IloCplex();
            // variable
            IloNumVar[][] x = new IloNumVar[exp][imp];
            IloNumVar[][] y = new IloNumVar[exp][imp];
            for (int e = 0; e < exp; ++e) {
                for (int i = 0; i < imp; ++i) {

                    x[e][i] = cplex.boolVar();
                    y[e][i] = cplex.boolVar();
                }
            }
            IloLinearNumExpr objective = cplex.linearNumExpr();
            for (int e = 0; e < exp; ++e) {
                for (int i = 0; i < imp; ++i) {
                    objective.addTerm(days[e][i], x[e][i]);
                    objective.addTerm(days[e][i], y[e][i]);

                }

            }
            cplex.addMinimize(objective);
            // CONSTRAINTS
            // constraint .....1
            IloLinearNumExpr expr1 = cplex.linearNumExpr();
            // IloLinearNumExpr expr2 = cplex.linearNumExpr();
            for (int e = 0; e < exp; ++e) {
                for (int i = 0; i < imp; ++i) {
                    expr1.addTerm(1, x[e][i]);

                }
            }
            cplex.addEq(expr1, 1);
            // constraint .....2
            // if
            IloLinearNumExpr[][] rowexp = new IloLinearNumExpr[exp][imp];
            IloLinearNumExpr[] colexp = new IloLinearNumExpr[imp];
            IloConstraint[][] rowconst = new IloConstraint[exp][imp];
            IloConstraint[] colconst = new IloConstraint[imp];
            // if
            for (int e = 0; e < exp; ++e) {
                // rowexp[e] = cplex.linearNumExpr();
                for (int i = 0; i < imp; ++i) {
                    rowexp[e][i] = cplex.linearNumExpr();
                    rowexp[e][i].addTerm(1, x[e][i]);
                    rowconst[e][i] = cplex.eq(1, rowexp[e][i]);
                }
                // rowconst[e] = cplex.eq(1, rowexp[e]);
            }

            for (int i = 0; i < imp; ++i) {
                colexp[i] = cplex.linearNumExpr();
                for (int e = 0; e < exp; ++e) {
                    // colexp[i] = cplex.linearNumExpr();
                    colexp[i].addTerm(1, y[e][i]);

                }
                colconst[i] = cplex.eq(1, colexp[i]);
            }

            for (int e = 0; e < exp; ++e) {
                for (int i = 0; i < imp; ++i) {
                    cplex.ifThen(rowconst[e][i], colconst[i]);
                }
            }

            if (cplex.solve()) {
                System.out.println("obje =" + cplex.getObjValue());
                for (int e = 0; e < exp; ++e) {
                    for (int i = 0; i < imp; ++i) {

                        // System.out.println(" =" + cplex.getValue(y[e][i]));
                        System.out.print(cplex.getValue(y[e][i]) + " ");
                    }
                    System.out.println();

                }
                System.out.printf("%n%n%n");
                for (int e = 0; e < exp; ++e) {
                    for (int i = 0; i < imp; ++i) {

                        // System.out.println(" =" + cplex.getValue(y[e][i]));
                        System.out.print(cplex.getValue(x[e][i]) + " ");
                    }
                    System.out.println();
                }
                System.out.println("obje =" + cplex.getObjValue());

            }

        } catch (IloException exc) {
            exc.printStackTrace();
        }
    }
}
sch包;
导入ilog.concert.*;
导入ilog.cplex。*;
导入ilog.concert.IloException;
导入ilog.concert.IloLinearNumExpr;
导入ilog.concert.IloNumVar;
导入ilog.cplex.IloCplex;
公开课初试{
公共静态void main(字符串[]args){
附表();
}
公共静态无效时间表(){
int-exp=3;
int-imp=5;
双[]卷={10.5,5.0,15.5,16,2.0};
双shipv=0.25;
双[]天={115,7,9,8,7},{555,14,8,7,12},{112,6,8,10,4};
试一试{
IloCplex cplex=新的IloCplex();
//变数
IloNumVar[][]x=新的IloNumVar[exp][imp];
IloNumVar[][]y=新的IloNumVar[exp][imp];
对于(int e=0;e
我没有测试您的代码或研究您的公式,但您的问题似乎来自以下几行:

cplex.ifThen(rowconst[e][i], colconst[i]);
正如的文档所述,它返回一个约束。它不会将其添加到模型中。要解决此问题,您可以执行以下操作:

cplex.add(cplex.ifThen(rowconst[e][i], colconst[i]));
另外,作为如何使用
ifThen
的示例,您可能想看看CPLEX附带的
FoodManufact.java
程序