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 x0.

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,y100x100

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

y0 if and only if x0.

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


(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}

100yx100y
0.001y100.001δx0.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

y101δxy+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

0xNN=100

  1. 0z1,z2,z1
  2. xN(1z1)0
  3. xNz11
  4. xN(1z2)0
  5. xNz21
  6. z1+z21z
  7. zz1
  8. zz2

z1=1x0z2=1x0z=z1z2


z=1yx=100y=1z=0z1,z2xNz21x<Nx99x=99y=1y=0xNxN0xN

1

t,ut=1x0u=1x0y=¬(tu)

0t,u,y11+x101t101+x1x101u101xt+u11y1yt1yu

x99x100x99

@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.