Math 定义线性规划约束的问题

Math 定义线性规划约束的问题,math,optimization,data-science,linear-programming,Math,Optimization,Data Science,Linear Programming,我和我的朋友正在尝试实现一个新的方法,最后一步需要解决一个线性规划问题才能得到最终结果。我们对LP不太熟悉,所以我想请求您的帮助 下面是基于 下面是建议的约束条件 一, 二, 其中: Pa和Qi是二元决策变量 J是所有可用的类别 F是频繁类别的集合 Φ是所选类别的总数 约束1实际上表示,如果类别i包含在某个项目集A中,其中Pa=1,则Qi为1 基本上,我们正在尝试使用一些常见的开源lp解算器,如JoOptimizer,但我们不知道 如何定义这些约束,特别是那些定义集合包含规则的约束。大多数的解决

我和我的朋友正在尝试实现一个新的方法,最后一步需要解决一个线性规划问题才能得到最终结果。我们对LP不太熟悉,所以我想请求您的帮助

下面是基于

下面是建议的约束条件

一,

二,

其中:

Pa和Qi是二元决策变量 J是所有可用的类别 F是频繁类别的集合 Φ是所选类别的总数 约束1实际上表示,如果类别i包含在某个项目集A中,其中Pa=1,则Qi为1

基本上,我们正在尝试使用一些常见的开源lp解算器,如JoOptimizer,但我们不知道 如何定义这些约束,特别是那些定义集合包含规则的约束。大多数的解决者 似乎只接受不平等

那么,你知道如何定义这些约束吗?也许把它们转化为不等式或 某物任何帮助都将不胜感激


谢谢

写为等式的约束也可以写为两个不等式。 e、 g

A*x=b与 A*x=b 要写出这样的LP,有两种方法

硬编码,意味着用代码编写一切,例如用Java。 用一种叫做AMPL的语言用数学的方法编写:第二种方法是,你不需要真正了解编程语言。AMPL将您的LP神奇地转换为代码,并将其提供给解算器,例如商业:CPLEX、Gurobi学术许可证或开源:GLPK。AMPL还提供了一个在线平台,您可以将模型作为.mod文件提供,将数据作为.dat文件提供。 如果您仍想硬编码,则LP GLPK有很好的示例,例如JAVA:

public class Lp {
    //  Minimize z = -.5 * x1 + .5 * x2 - x3 + 1
    //
    //  subject to
    //  0.0 <= x1 - .5 * x2 <= 0.2
    //  -x2 + x3 <= 0.4
    //  where,
    //  0.0 <= x1 <= 0.5
    //  0.0 <= x2 <= 0.5
    //  0.0 <= x3 <= 0.5

public static void main(String[] arg) {
    glp_prob lp;
    glp_smcp parm;
    SWIGTYPE_p_int ind;
    SWIGTYPE_p_double val;
    int ret;

    try {
        // Create problem
        lp = GLPK.glp_create_prob();
        System.out.println("Problem created");
        GLPK.glp_set_prob_name(lp, "myProblem");

        // Define columns
        GLPK.glp_add_cols(lp, 3);
        GLPK.glp_set_col_name(lp, 1, "x1");
        GLPK.glp_set_col_kind(lp, 1, GLPKConstants.GLP_CV);
        GLPK.glp_set_col_bnds(lp, 1, GLPKConstants.GLP_DB, 0, .5);
        GLPK.glp_set_col_name(lp, 2, "x2");
        GLPK.glp_set_col_kind(lp, 2, GLPKConstants.GLP_CV);
        GLPK.glp_set_col_bnds(lp, 2, GLPKConstants.GLP_DB, 0, .5);
        GLPK.glp_set_col_name(lp, 3, "x3");
        GLPK.glp_set_col_kind(lp, 3, GLPKConstants.GLP_CV);
        GLPK.glp_set_col_bnds(lp, 3, GLPKConstants.GLP_DB, 0, .5);

        // Create constraints

        // Allocate memory
        ind = GLPK.new_intArray(3);
        val = GLPK.new_doubleArray(3);

        // Create rows
        GLPK.glp_add_rows(lp, 2);

        // Set row details
        GLPK.glp_set_row_name(lp, 1, "c1");
        GLPK.glp_set_row_bnds(lp, 1, GLPKConstants.GLP_DB, 0, 0.2);
        GLPK.intArray_setitem(ind, 1, 1);
        GLPK.intArray_setitem(ind, 2, 2);
        GLPK.doubleArray_setitem(val, 1, 1.);
        GLPK.doubleArray_setitem(val, 2, -.5);
        GLPK.glp_set_mat_row(lp, 1, 2, ind, val);

        GLPK.glp_set_row_name(lp, 2, "c2");
        GLPK.glp_set_row_bnds(lp, 2, GLPKConstants.GLP_UP, 0, 0.4);
        GLPK.intArray_setitem(ind, 1, 2);
        GLPK.intArray_setitem(ind, 2, 3);
        GLPK.doubleArray_setitem(val, 1, -1.);
        GLPK.doubleArray_setitem(val, 2, 1.);
        GLPK.glp_set_mat_row(lp, 2, 2, ind, val);

        // Free memory
        GLPK.delete_intArray(ind);
        GLPK.delete_doubleArray(val);

        // Define objective
        GLPK.glp_set_obj_name(lp, "z");
        GLPK.glp_set_obj_dir(lp, GLPKConstants.GLP_MIN);
        GLPK.glp_set_obj_coef(lp, 0, 1.);
        GLPK.glp_set_obj_coef(lp, 1, -.5);
        GLPK.glp_set_obj_coef(lp, 2, .5);
        GLPK.glp_set_obj_coef(lp, 3, -1);

        // Write model to file
        // GLPK.glp_write_lp(lp, null, "lp.lp");

        // Solve model
        parm = new glp_smcp();
        GLPK.glp_init_smcp(parm);
        ret = GLPK.glp_simplex(lp, parm);

        // Retrieve solution
        if (ret == 0) {
            write_lp_solution(lp);
        } else {
            System.out.println("The problem could not be solved");
        }

        // Free memory
        GLPK.glp_delete_prob(lp);
    } catch (GlpkException ex) {
        ex.printStackTrace();
    ret = 1;
    }
System.exit(ret);
}

/**
 * write simplex solution
 * @param lp problem
 */
static void write_lp_solution(glp_prob lp) {
    int i;
    int n;
    String name;
    double val;

    name = GLPK.glp_get_obj_name(lp);
    val = GLPK.glp_get_obj_val(lp);
    System.out.print(name);
    System.out.print(" = ");
    System.out.println(val);
    n = GLPK.glp_get_num_cols(lp);
    for (i = 1; i <= n; i++) {
        name = GLPK.glp_get_col_name(lp, i);
        val = GLPK.glp_get_col_prim(lp, i);
        System.out.print(name);
        System.out.print(" = ");
        System.out.println(val);
    }
}}

你的问题不是关于,所以我帮你去掉了这个标签。这样你就不会吸引那些不能帮助你解决这个问题的Java专家了。F和这些项是常数还是也经过了优化?我没看过报纸。它们是不变的。F包含预先计算的频繁项集A,然后Pa和Qi被用作决策变量,以使函数最大化。那么数字1实际上是一系列约束。对于相应集合中的每个元素,您将设置一个约束。具体如何实现这一点取决于所使用的库。所有库都应该能够直接处理等式约束。或者,你可以将它建模为两个不等式=。我投票将这个问题作为离题题来结束,因为在OP和他的密友弄清楚约束之前,它与这里使用的编程无关。