/ / Rozwiązywanie nieliniowego programowania całkowitoliczbowego ze zmienną wykładniczą - matlab, optymalizacja matematyczna, optymalizacja nieliniowa, programowanie całkowite

Rozwiązywanie nieliniowego programowania liczb całkowitych ze zmienną wykładniczą - matlab, matematyczna optymalizacja, nieliniowa optymalizacja, programowanie całkowite

każdy. Sformułowałem kilka formuł dla moich badań. Chcę zapytać, czy jakieś narzędzie może rozwiązać ten problem. Sprawdzam niektóre narzędzia, takie jak GLPK, niektóre zestawy narzędzi MATLAB… Ale moja formuła wydaje się nieliniowa. Znajduję pewne informacje w Internecie, jest to jeden specjalny przypadek programowania liczb całkowitych zwany programowaniem całkowitym 0-1.

Mam wątpliwości: czy mogę umieścić zmienną binarną w wykładniczej, jak w poniższym wzorze? Czy jest on dostępny przy użyciu „produktu (pi)” podczas rozwiązywania tego problemu? Przeglądam kilka przykładów, ale nie znalazłem tych dwóch zastosowań.

Zmienna to Xc, n, m, s, i. I, Lc, n, Tmax, Tm, Pm, s, i, Dc, n, k, i Bm to wszystkie znane liczby.

Czy ktoś może podać mi jakieś sugestie dotyczące tego problemu? Dziękuje za przeczytanie!

Aktualizuję obraz i próbuję użyć języka AMPL dla moich formuł.

wprowadź opis obrazu tutaj

    #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]);

Modyfikacja z użyciem ograniczenia logicznego w celu usunięcia zmiennej X z wykładniczego:

    ### 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;

Odpowiedzi:

1 dla odpowiedzi № 1

Nie wiem, ale może zajrzę do SCIP i do zestawu narzędzi opti (lub YALMIP).

Z mojego doświadczenia wynika, że ​​budowanie w Matlab jest dość kłopotliwe. Być może łatwiej byłoby utworzyć plik wyjściowy .lp / .mps / .white i uruchomić plik .exe z Matlaba, który analizuje plik.


1 dla odpowiedzi nr 2

wydaje mi się, że w rzeczywistości twój model można przeformułować bez wykładniczych warunków: terminy $ P ^ x $ sprowadzają się do ograniczenia logicznego równego 1 $ za $ x = 0 $ lub $ P $ za $ x = 1 $.

Moją propozycją jest wprowadzenie pewnych zmiennych pomocniczych $ y $, aby zastąpić terminy wykładnicze, a następnie ustawić ograniczenia logiczne.

Wynikowy model jest nadal ogromnym MINLP: potrzebujesz prawdopodobnie solwera takiego jak Couenne (za darmo) lub Baron (komercyjny).

AKTUALIZACJA:

Właściwie to nawet łatwiej powiedzieć:

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

następnie używasz y "s w ogromnym produkcie, który definiuje V_ (c, n). Jak widzisz, dla x = 0 otrzymujesz 1, dla x = 1 otrzymujesz P.

W ten sposób nie potrzebujesz żadnych ograniczeń warunkowych.

W każdym razie następnym razem proponuję, aby opublikować tego rodzaju pytanie na mathoverflow.