用指数变量求解非线性整数规划

时间:2014-05-14 14:25:38

标签: matlab mathematical-optimization nonlinear-optimization integer-programming

大家。我为我的研究制定了一些公式。我想问一下是否有任何工具可以解决这个问题。我调查了一些工具,如GLPK,一些MATLAB工具箱......但我的公式似乎是非线性的。我在互联网上找到了一些信息,它是整数编程的一个特例,叫做0-1整数编程。

我的疑问是:我可以将二进制变量放入指数中,如下面的公式吗?是否可以使用"产品(pi)"在解决这个问题时?我调查了一些例子,但我没有找到这两个用法。

变量是Xc,n,m,s,i。并且,Lc,n,Tmax,Tm,Pm,s,i,Dc,n,k和Bm都是已知数。

有人能就这个问题给我一些建议吗?谢谢你的阅读!

我更新了图片,并尝试将AMPL语言用于我的公式。

enter image description here

    #AMPL model language

    #known numbers
    param L{c in 0..C, n in 0..N}; 
    param Tmax;
    param T{m in 0..M};
    param P{m in 0..M, s in 0..S, i in 0..I};
    param D{c in 0..C, n in 0..N, k in 0..K};

    #binary variable
    var X{c in 0..C, n in 0..N, m in 0..M, s in 0..S, i in 0..I} binary;

    #objective function
    maximize answer: sum{c in 0..C} r[c];

    #two subjections
    subject to s1{s in 0..S, i in 0..I}:  
    sum{c in 0..C}sum{n in 0..N}sum{m in 0..M} X[c,n,m,s,i] <= 1; 

    subject to s2{c in 0..C, n in 0..N}: 
    L[c,n]+Tmax >= sum{m in 0..M}sum{s in 0..S}sum{i in 0..I}T[m]*X[c,n,m,s,i] >= L[c,n]; 

    #where (I am not sure is it wright to write like this? Can somebody give me a hint?)
    V[c,n]=prod{k in 0..N}(prod{m in 0..M}prod{s in 0..S}prod{i in 0..I} P[m,s,i])^X[c,n,m,s,i])^D{c,n,k};
    r[c]=prod{n in 0..N}V[c,n]*(sum{m in 0..M}sum{s in 0..S}sum{i in 0..I}T[m]*X[c,n,m,s,i]);

使用逻辑约束进行修改,以便从指数中删除变量X:

    ### model_c.mod ###
    set C;
    set N;
    set M;
    set S;
    set I;
    set K;

    param Tmax;  #known numbers
    param L{c in C, n in N};
    param T{m in M};
    param P{m in M, s in S, i in I};
    param D{c in C, n in N, k in K};

    var X{c in C, n in N, m in M, s in S, i in I} binary;  #binary variable
    var Y{c in C, n in N};

    maximize answer: 
    (sum{c in C}(prod{n in N}(prod{k in K}Y[c,n]^D[c,n,k])*(sum{m in M}sum{s in S}sum{i in I}T[m]*X[c,n,m,s,i]))); #objective function

    subject to s1{c in C, n in N, m in M, s in S, i in I}: 
    Y[c,n]=Y[c,n]*((P[m,s,i]-1)*X[c,n,m,s,i]+1);

    subject to s2{s in S, i in I}: 
    sum{c in C}sum{n in N}sum{m in M} X[c,n,m,s,i] <= 1;

    subject to s3{c in C, n in N}: 
    L[c,n]+Tmax >= sum{m in M}sum{s in S}sum{i in I}T[m]*X[c,n,m,s,i] >= L[c,n];

    ### model_c.dat ###
    data;   
    set C:= count1, count2;
    set N:= frame1, frame2;
    set M:= M1, M2;
    set S:= sub1, sub2;
    set I:= i1, i2;
    set K:= k1, k2;

    param Tmax:=30;


    param L: frame1 frame2:=
    count1     2      3
    count2     4      5;


    param T:=  M1 10
       M2 20;


    param P:=
    [*,*,i1]: sub1 sub2 :=
        M1   0.9 0.8
        M2   0.7 0.6

    [*,*,i2]: sub1 sub2 :=
        M1   0.9 0.8
        M2   0.7 0.6;


    param D:=
    [*,*,k1]: frame1 frame2 :=
        count1 1 0
        count2 0 1 

    [*,*,k2]: frame1 frame2 :=
        count1 1 0
        count2 1 1;

2 个答案:

答案 0 :(得分:1)

我不知道,但也许看看SCIP和/或opti工具箱。 (或YALMIP)。 (或硬币。)

根据我的经验,在Matlab中构建是一件非常麻烦的事。也许更容易创建.lp / .mps / .whatever输出文件并从Matlab启动.exe来解析文件。

答案 1 :(得分:1)

在我看来,实际上你的模型可以不用指数术语重新表达:术语$ P ^ x $实际上归结为一个逻辑约束,等于$ 1 $ $ $ $ 0 $或$ P $ $ $ X = 1 $。

所以我的建议是引入一些辅助变量$ y $来代替指数项,然后设置逻辑约束。

结果模型仍然是一个巨大的MINLP:你可能需要像Couenne(免费)或Baron(商业)这样的求解器。

更新

实际上,只是说:

y_(m,s,i)=(P_(m,s,i)-1)x_(c,n,m,s,i)+ 1

然后你在定义V_(c,n)的巨大产品中使用y。如你所见,对于x = 0,你得到1,对于x = 1你得到P。

通过这种方式,您不需要任何条件约束。

无论如何,下次我建议你在mathoverflow上发布这类问题。