условное ограничение в оптимизации при использовании cplex - PullRequest
0 голосов
/ 10 мая 2018

Я разрабатываю модель cplex совместно с Java, и мне нужно условное ограничение, но кажется, что код cplex.ifthen вообще не выполняется.

Я хочу, чтобы, если элемент массива был равен единице, то один элемент с таким же номером столбца должен быть равен единице.

Вот мой код. По сути, я создал две матрицы с одинаковыми размерами. Во-первых, я выбрал минимум из первой матрицы, то есть 4. Теперь я хочу выбрать минимальный элемент из этого столбца. Для этого я использую cplex.ifthen, но он не работает.

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();
        }
    }
}

1 Ответ

0 голосов
/ 10 мая 2018

Я не проверял ваш код и не изучал вашу формулировку, но похоже, что ваша проблема проистекает из следующей строки:

cplex.ifThen(rowconst[e][i], colconst[i]);

Как сказано в документации для ifThen , возвращает ограничение . Это не добавляет его к модели. Чтобы это исправить, вы можете просто сделать что-то вроде следующего:

cplex.add(cplex.ifThen(rowconst[e][i], colconst[i]));

Кроме того, для примера использования ifThen вы можете взглянуть на программу FoodManufact.java, которая поставляется с CPLEX.

...