2016-05-24 4 views
0

Lassen Sie uns drei Integer-Variablen für Integer-Programmierung haben annehmen, also:Integer Programming: Modell Einzigartigkeit von Integer-Variablen

a \in {1,2,3} 
b \in {1,2,3} 
c \in {1,2,3} 

Jetzt will ich modellieren, dass alle Variablen unterschiedlich sind. Natürlich kann ich für jede Kombination folgendes machen (drei in diesem Fall). Ich zeige es mit a und b.

a <= b - 1 + bin1 * bigM 
a >= b + 1 - (1 - bin1) * bigM 
bin1 \in {0, 1} 

Gibt es einen einfacheren Weg ohne viele neue Constraints, bigMs und binäre Variablen zu erzeugen?

+0

Ich kenne keine bessere Formulierung mit linearer Programmierung. Ich denke, das geht nicht, da es sich um ein kombinatorisches Optimierungsproblem handelt. Constraint-Programming-Solver/Sprachen implementieren globale Constraints, siehe [z3 Distinct] (http://z3prover.github.io/api/html/namespacez3py.html#aa79af225f3b27b84fef346c257d2e406) und [Minizinc all_different] (http://www.minizinc.org /2.0/doc-lib/doc-globals-alldifferent.html) zum Beispiel. – Emilien

Antwort

2

Sorry, nicht wirklich. Dieses Konstrukt wird oft all-different constraint genannt. Hier ist eine Referenz:

H.P.Williams, Hong Yan, "Vertretungen des all-verschiedenen Prädikats von Constraint Satisfaction in Integer Programming" INFORMIERT Journal on Computing, Vol. 13 (2001) 96-103

Siehe auch die Diskussion here.

1

Ich fand heraus, dass man auch Folgendes tun könnte:

x_j \in {1,2,3} for j \in {1,2,3} 
b_i_j \in {0,1} for i,j \in {1,2,3} 
\sum_{i=1}^{3} i * b_i_j = x_j for j \in {1,2,3} 
\sum_{i=1}^{3} b_i_j = 1 for j \in {1,2,3} 

Nun, offensichtlich ist es j^2 neue jetzt Binärgrößen. Aber Sie haben Ihre x_j Variablen sowie Ihre b_i_j Variablen, so dass Sie viel flexibler für alle Arten von Einschränkungen sind.

all-different constraint: 
\sum_{j=1}^{3} b_i_j = 1 for i \in {1,2,3} 

Scheint in Ordnung, nicht wahr?