簡體   English   中英

線性編程中布爾值之間的乘法(Python,Pulp庫)

[英]Multiplication between booleans in linear programming (python, Pulp library)

我正在尋找線性編程問題的解決方案,並且需要定義以下約束:

gji = 1 if guest j is seated at table i, 0 otherwise 
gki = 1 if guest k is seated at table i, 0 otherwise  
pjik = gij * gik = 1 if guest j AND guest k are seated at table i, 0 otherwise 

我寫了前兩個Costrain(使用Pulp庫),但是我不知道如何表示gji*gki的乘法

我的代碼:

Gji = LpVariable.matrix("Gji",(range(0,number_guest),range(0,number_table)),lowBound=0, upBound=1, cat='binary')

Gki = LpVariable.matrix("Gki",(range(0,number_guest),range(0,number_table)),lowBound=0, upBound=1, cat='binary')

for row in range (0,number_guest):
    prob += lpSum(Gji[row])<=1
    prob += lpSum(Gji[row])>=1

for columns in range (0,number_table):
    prob += lpSum(np.matrix(Gji).T[columns].tolist()) <= a

我該如何寫Pjki的Pjki

在PuLp中實施該模型之前,請務必先制定適當的數學模型。

g(i,k) = 1 if guest i sits at table k
         0 otherwise

p(i,j,k) = 1 if guests i and j sit at table k
           0 otherwise

首先,您需要一些分配約束:

sum(i, g(i,k)) <= capacity(k)  for all k
sum(k, g(i,k)) = 1             for all i

二進制乘法

p(i,j,k) = g(i,k) * g(j,k) 

可以線性化為

p(i,j,k) <= g(i,k)
p(i,j,k) <= g(j,k)
p(i,j,k) >= g(i,k)+g(j,k)-1
p(i,j,k) ∈ {0,1}

通常我們不需要所有這些變量和方程式,但這取決於模型的細節。 當然,我們應該只考慮i<j 有趣的是,該公式是如此緊密,我們可以將p(i,j,k)放寬到0和1之間的連續值,它們將自動為整數。

這個數學描述很容易被轉錄成Python / Pulp。 您可能應該重做您的Python代碼,因為它包含一些荒謬的內容。 一些提示:

  • 二進制變量已經具有邊界0和1
  • 紙漿可以做相等約束(寫<=和> =約束很愚蠢)
  • 嘗試使事物更具可讀性(更接近數學表示形式)
  • 有關其他方法,請參見wedding.py

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM