【问题标题】:how I can use if condition in ampl?我如何在ampl中使用if条件?
【发布时间】:2019-01-24 15:53:46
【问题描述】:

我想知道我可以在 ampl 中使用 if 运算符吗?我有一组变量x_{1},...,x_{n} 和一些约束。现在我有一些在某些情况下有效的约束。例如,如果 x_{1}+...+x_{n}=kn+1 其中 `k 是整数,则约束 A 有效。 有什么办法可以用ampl写吗?

换句话说,问题是我想在可行的统治下逐层搜索。该层是点 x=(x1,...,xn) 和向量 1=(1,1,1,...1) 之间的点积。 所以

如果 1>=1 那么 x 必须满足约束 A

    subject to Time {if < x,1 > =kn+1}:

    s.t. S1: A<1;

【问题讨论】:

    标签: linear-programming cplex ampl


    【解决方案1】:

    我不清楚您的示例是否意味着“约束 A 要求 x_[1]+...+x_[n]=4m+1 其中 m 是一个整数”,或者“如果 x_[1]+...+x_[n]=4m+1 其中 m 是一个整数,那么约束 A 需要一些其他条件见面”。

    前者对代码来说是微不足道的:

    var m integer;
    s.t. c1: sum{i in 1..n} x_[i] = 4m+1;
    

    它确实需要具有 MIP 功能的求解器。根据您的标签,我假设您正在使用 CPLEX,这应该没问题。

    对于后者:AMPL 确实支持逻辑约束,记录在 here。根据您的问题,有时也可以将逻辑约束编码为线性整数约束。

    例如,如果您的示例中的 x[i] 变量也是整数,您可以这样设置:

    var m integer;
    var r1 integer in 0..1;
    var r2 integer in 0..2;
    s.t. c1: r2 <= 2*r1; # i.e. r2 can only be non-zero if r1 = 1
    s.t. c2: sum{i in 1..n} x_[i] = 4m+r1+r2;
    var remainder_is_1 binary;
    s.t. c3: remainder_is_1 >= r1-r2;
    s.t. c4: remainder_is_1 <= 1-r2/2;
    

    综合起来,这些约束确保remainder_is_1 等于 1 当且仅当sum{i in 1..n} x_[i] = 4m+1 对于某个整数 m。然后,您可以在其他约束中使用此变量。如果您只有几个逻辑约束要处理,这种技巧可能会很方便,但如果您有很多,那么使用逻辑约束选项(如果它们可供您使用)会更有效。

    【讨论】:

    • 感谢您的回答。首先我的意思是:如果 x_[1]+...+x_[n]=4m+1 其中 m 是一个整数,那么约束 A 需要满足一些其他条件”。另外假设我有 n 个约束:A ,B,C,D,E,F,.. 那么如果 x_[1]+...+x_[n]=4m+1 那么 A 应该满足,如果 x_[1]+...+x_[ n]=4m+2 那么 B 应该满足,如果 x_[1]+...+x_[n]=4m+3 那么 C 应该满足等等。现在我不知道如何编码这些!!你能帮帮我吗?
    • @sherek_66 我已经链接到讨论如何使用“if”约束的 AMPL 文档。如果这不能回答您的问题,您能否编辑问题以澄清您遇到问题的地方?
    • 我刚刚在那个链接的帮助下写了代码,你能帮我纠正一下吗?谢谢
    • @sherek_66 从您的帖子中不清楚问题是什么或您要做什么。
    • @sherek_66 不是真的,抱歉 :-( 我建议阅读有关创建 MCVE 的建议。
    猜你喜欢
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 2020-10-02
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多