Rzut na boolean, dla programowania liniowego liczb całkowitych


11

Chcę wyrazić następujące ograniczenie w całkowitym programie liniowym:

y={0if x=01if x≠0.

Mam już zmienne całkowite i obiecuję, że . Jak mogę wyrazić powyższe ograniczenie w formie odpowiedniej do użycia z całkowitym programem do programowania liniowego?- 100 ≤ x ≤ 100x,y−100≤x≤100

Będzie to prawdopodobnie wymagało wprowadzenia dodatkowych zmiennych. Jakie nowe zmienne i ograniczenia muszę dodać? Czy można to zrobić czysto za pomocą jednej nowej zmiennej? Dwa?

Równolegle jest to pytanie, jak wymusić ograniczenie

y≠0 if and only if x≠0.

w kontekście, w którym mam już ograniczenia sugerujące i .0 ≤ y ≤ 1|x|≤1000≤y≤1


(Moim celem jest naprawienie błędu w https://cs.stackexchange.com/a/12118/755 .)


1
Czego próbowałeś? Czy próbowałeś przeanalizować kilka przykładów, aby zobaczyć, czy widzisz wzór? Jeśli tak, czy próbowałeś zgadywać, a następnie próbowałeś to udowodnić?
— Brika,

1
Heh! Widzę, co tam zrobiłeś , @Brika. Jeśli jesteś ciekawy, co próbowałem, zobacz tutaj, a także wyjaśnienie, dlaczego tak naprawdę było źle . Jeśli chcesz zobaczyć moją kolejną próbę, zobacz moją odpowiedź . Dziękuję za przeczytanie moich starych pytań i jeśli można je poprawić w przyszłości, chętnie usłyszę wszelkie sugestie!
— DW

To jest bardzo dobre. ;)
— Brika,

Odpowiedzi:


4

Myślę, że mogę to zrobić za pomocą jednej dodatkowej zmiennej binarnej :δ∈{0,1}

−100y≤x≤100y
0.001y−100.001δ≤x≤−0.001y+100.001(1−δ)

Aktualizacja

Zakłada się, że jest zmienną ciągłą . Jeśli ograniczymy do wartości całkowitej , wówczas drugie ograniczenie można uprościć do: xx y - 101 δ ≤ x ≤ - y + 101 ( 1 - δ )x

y−101δ≤x≤−y+101(1−δ)


1
Sprawdziłem to poprawnie, testując go wyczerpująco za pomocą małego programu. Dziękuję za rozwiązanie!
— DW

@ErwinKalvelagen, czy mógłbyś wyjaśnić swoją logikę za pomocą zmiennej binarnej delta, dla bardziej ogólnego przypadku, na przykład, jeśli y = {a: x> 0, b: x <0}.
— Nick

1
@Nick Zmienna binarna służy do modelowania konstrukcji „OR”. Zobacz tutaj na odpowiedź na swoje pytanie.
— Erwin Kalvelagen,

@ErwinKalvelagen, świetna odpowiedź, próbowałem zastosować twoje podejście do mojego pytania tutaj cs.stackexchange.com/questions/64794/… .
— Nick

1
xx

1

0≤x≤NN=100

  1. 0≤z1,z2,z≤1
  2. x−N(1−z1)≤0
  3. −x−Nz1≤−1
  4. −x−N(1−z2)≤0
  5. x−Nz2≤−1
  6. z1+z2−1≤z
  7. z≤z1
  8. z≤z2

z1=1⟺x≤0z2=1⟺x≥0z=z1∧z2


z=1−yx=100y=1z=0z1,z2x−Nz2≤−1x<Nx≤99x=99y=1y=0x−N≤x≤N0≤x≤N

1

t,ut=1x≥0u=1x≤0y=¬(t∧u)

0≤t,u,y≤11+x≤101t≤101+x1−x≤101u≤101−xt+u−1≤1−y1−y≤t1−y≤u

x≤99x≤100x≥−99

@TLW, dziękuję za złapanie tego! Zredagowałem swoją odpowiedź, aby naprawić błąd. Przetestowałem to wyczerpująco za pomocą małego programu i myślę, że teraz powinno być poprawne.
— DW
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.