Comment je peux faire une interface graphique pour ce code sur python

wahida98 -  
 wahida98 -
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt

class PL:

def __init__(self, A = np.empty([0,0]), b = np.empty([0,0]), c = np.empty([0,0]), minmax = "MAX"):
self.A = A
self.b = b
self.c = c
self.x = [float(0)] * len(c)
self.minmax = minmax
self.printIter = False
self.optimalValue = None
self.transform = False

def addA(self, A):
self.A = A

def addB(self, b):
self.b = b

def addC(self, c):
self.c = c
self.transform = False

def setObj(self, minmax):
if(minmax == "MIN" or minmax == "MAX"):
self.minmax = minmax
else:
print("Objectif invalide.")
self.transform = False

def setPrintIter(self, printIter):
self.printIter = printIter

def printSoln(self):
print("La solution optimal du PL:\n\n X* =", end=" ",sep="")
print(self.x)
print("\n")
print("La cardinalité du transversal minimum :\n\n Z* = ", end=" ",sep="")
print(int(self.optimalValue))
print("\n")
def printTableau(self, tableau):

print("ind \t\t", end = "")
for j in range(0, len(c)):
print("x_" + str(j), end = "\t")
for j in range(0, (len(tableau[0]) - len(c) - 2)):
print("s_" + str(j), end = "\t")

print()
for j in range(0, len(tableau)):
for i in range(0, len(tableau[0])):
if(not np.isnan(tableau[j, i])):
if(i == 0):
print(int(tableau[j, i]), end = "\t")
else:
print(round(tableau[j, i], 2), end = "\t")
else:
print(end = "\t")
print()

def getTableau(self):
# construct starting tableau

if(self.minmax == "MIN" and self.transform == False):
self.c[0:len(c)] = 1 * self.c[0:len(c)]
self.transform = False

t1 = np.array([None, 0])
numVar = len(self.c)
numSlack = len(self.A)

t1 = np.hstack(([None], [0], self.c, [0] * numSlack))

basis = np.array([0] * numSlack)

for i in range(0, len(basis)):
basis[i] = numVar + i

A = self.A

if(not ((numSlack + numVar) == len(self.A[0]))):
B = np.identity(numSlack)
A = np.hstack((self.A, B))

t2 = np.hstack((np.transpose([basis]), np.transpose([self.b]), A))

tableau = np.vstack((t1, t2))

tableau = np.array(tableau, dtype ='float')

return tableau

def optimize(self):

if(self.minmax == "MIN" and self.transform == False):
for i in range(len(self.c)):
self.c[i] = -1 * self.c[i]
transform = False

tableau = self.getTableau()

if(self.printIter == True):
print("Tableau de départ:")
self.printTableau(tableau)

# assume initial basis is not optimal
optimal = False

# keep track of iterations for display
iter = 1

while(True):

if(self.printIter == True):
print("----------------------------------")
print("Itération :", iter)
self.printTableau(tableau)

if(self.minmax == "MAX"):
for profit in tableau[0, 2:]:
if profit > 0:
optimal = False
break
optimal = True
else:
for cost in tableau[0, 2:]:
if cost < 0:
optimal = False
break
optimal = True

# if all directions result in decreased profit or increased cost
if optimal == True:
break

# nth variable enters basis, account for tableau indexing
if (self.minmax == "MAX"):
n = tableau[0, 2:].tolist().index(np.amax(tableau[0, 2:])) + 2
else:
n = tableau[0, 2:].tolist().index(np.amin(tableau[0, 2:])) + 2

# minimum ratio test, rth variable leaves basis
minimum = 99999
r = -1

for i in range(1, len(tableau)):
if(tableau[i, n] > 0):
val = tableau[i, 1]/tableau[i, n]
if val<minimum:
minimum = val
r = i

pivot = tableau[r, n]

# perform row operations
# divide the pivot row with the pivot element
tableau[r, 1:] = tableau[r, 1:] / pivot

# pivot other rows
for i in range(0, len(tableau)):
if i != r:
mult = tableau[i, n] / tableau[r, n]
tableau[i, 1:] = tableau[i, 1:] - mult * tableau[r, 1:]

# new basic variable
tableau[r, 0] = n - 2

iter += 1

if(self.printIter == True):
print("----------------------------------")
print("Le tableau final parvenu en", iter, "itérations")
self.printTableau(tableau)
else:
print('\n\n' + '\033[32m' + ' >>> Résolu! <<<' + '\x1b[0m')

self.x = np.array([0] * len(c), dtype = int)
# save coefficients
for key in range(1, (len(tableau))):
if(tableau[key, 0] < len(c)):

self.x[int(tableau[key, 0])] = tableau[key, 1]

for i in range(0,len(self.x)):
if(self.x[i]==0):
self.x[i]=1
else:
self.x[i]=0

self.optimalValue = len(c) - 1 * tableau[0,1]

a = 0

class b():
global a
a = self.x

model = PL()
A = np.array([ [1,0,1,0],[1,1,0,0],[0,1,0,1],[0,0,1,1] ])
B = A.transpose()
n = len(B)
m = len(B[1])

b=np.ones(n,dtype=int)
c=np.ones(m,dtype=int)
model.addA(B)
model.addB(b)
model.addC(c)
model.setObj("MIN")

C = np.zeros([m,m], dtype = int)

for i in range(0,n):
h =-1
k =-1
for j in range(0,m):
if(B[i][j]==1):
if(h==-1):
h=j
else:
k=j
C[h][k]=1
C[k][h]=1

print("La matrice d'incidence :\n\nM1 =\n", A, "\n")
print("La matrice d'adjacence :\n\nM2 =\n", C, "\n")
print("Le graphe correspondant :\n\nG >>\n")

G=nx.from_numpy_matrix(C)

nx.draw(G,with_labels=1,node_color='c',font_size=12)
plt.show()

print("Le PL correspondant:\n\n(P) >>\n")
objf = "( Min(Z) = "
for i in range(0,m):
objf += "X" + str(i) + " + "
d = len(objf)
y = slice(d-2)
objf = objf[y]
print(objf)
print("|")
for i in range(0,n):
st = "| "
for j in range(0,m):
if(B[i][j]==1):
st += "X" + str(j) + " + "

x = slice(10)
st = st[x]
st += " >= 1"
print(st)
print("|")
print("( xᵢ >= 0, ∀ i ∈ {0,...," + str(m-1) + "}")
model.optimize()
print("\n")

model.printSoln()
print("Le transversal minimum est:\n\n T* = ", end=" ",sep="")
v = len(a)

Tm = "{"
for i in range(0,v):
if(a[i]==1):
Tm += "X" + str(i) + ", "
p = len(Tm)
z = slice(p-2)
Tm = Tm[z]
Tm += "}"
print(Tm)

3 réponses

  1. arthur
     
    Bonjour,

    import bonjour
    import s'il vous plaît
    import merci

    :-)
    1
  2. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    Bonjour wahida98,

    Les indentations étant importantes en Python, pourrais-tu reposter ton code en utilisant les balises de code ?

    Mode d'emploi:
    https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

    On y verrait plus clair ...
    0
    1. wahida98
       
      import numpy as np
      import networkx as nx
      import matplotlib.pyplot as plt
      
      class PL:
          
          def __init__(self, A = np.empty([0,0]), b = np.empty([0,0]), c = np.empty([0,0]), minmax = "MAX"):
              self.A = A
              self.b = b
              self.c = c
              self.x = [float(0)] * len(c)
              self.minmax = minmax
              self.printIter = False
              self.optimalValue = None
              self.transform = False
              
          def addA(self, A):
              self.A = A
              
          def addB(self, b):
              self.b = b
              
          def addC(self, c):
              self.c = c
              self.transform = False
          
          def setObj(self, minmax):
              if(minmax == "MIN" or minmax == "MAX"):
                  self.minmax = minmax
              else:
                  print("Objectif invalide.")
              self.transform = False
                  
          def setPrintIter(self, printIter):
              self.printIter = printIter
                  
          def printSoln(self):
              print("La solution optimal du PL:\n\n  X* =", end=" ",sep="")
              print(self.x)
              print("\n")
              print("La cardinalité du transversal minimum :\n\n  Z* = ", end=" ",sep="")
              print(int(self.optimalValue))
              print("\n")
          def printTableau(self, tableau):
              
              print("ind \t\t", end = "")
              for j in range(0, len(c)):
                  print("x_" + str(j), end = "\t")
              for j in range(0, (len(tableau[0]) - len(c) - 2)):
                  print("s_" + str(j), end = "\t")
              
              print()
              for j in range(0, len(tableau)):
                  for i in range(0, len(tableau[0])):
                      if(not np.isnan(tableau[j, i])):
                          if(i == 0):
                              print(int(tableau[j, i]), end = "\t")
                          else:
                              print(round(tableau[j, i], 2), end = "\t")
                      else:
                          print(end = "\t")
                  print()
                  
          def getTableau(self):
              # construct starting tableau
              
              if(self.minmax == "MIN" and self.transform == False):
                  self.c[0:len(c)] = 1 * self.c[0:len(c)]
                  self.transform = False
              
              t1 = np.array([None, 0])
              numVar = len(self.c)
              numSlack = len(self.A)
              
              t1 = np.hstack(([None], [0], self.c, [0] * numSlack))
              
              basis = np.array([0] * numSlack)
              
              for i in range(0, len(basis)):
                  basis[i] = numVar + i
              
              A = self.A
              
              if(not ((numSlack + numVar) == len(self.A[0]))):
                  B = np.identity(numSlack)
                  A = np.hstack((self.A, B))
                  
              t2 = np.hstack((np.transpose([basis]), np.transpose([self.b]), A))
              
              tableau = np.vstack((t1, t2))
              
              tableau = np.array(tableau, dtype ='float')
              
              return tableau
                  
          def optimize(self):
              
              if(self.minmax == "MIN" and self.transform == False):
                  for i in range(len(self.c)):
                      self.c[i] = -1 * self.c[i]
                      transform = False
              
              tableau = self.getTableau()
               
              if(self.printIter == True):
                  print("Tableau de départ:")
                  self.printTableau(tableau)
              
              # assume initial basis is not optimal
              optimal = False
      
              # keep track of iterations for display
              iter = 1
      
              while(True):
                  
                  if(self.printIter == True):
                      print("----------------------------------")
                      print("Itération :", iter)
                      self.printTableau(tableau)
                      
                  if(self.minmax == "MAX"):
                      for profit in tableau[0, 2:]:
                          if profit > 0:
                              optimal = False
                              break
                          optimal = True
                  else:
                      for cost in tableau[0, 2:]:
                          if cost < 0:
                              optimal = False
                              break
                          optimal = True
      
                  # if all directions result in decreased profit or increased cost
                  if optimal == True: 
                       break
                  
                  # nth variable enters basis, account for tableau indexing
                  if (self.minmax == "MAX"):
                      n = tableau[0, 2:].tolist().index(np.amax(tableau[0, 2:])) + 2
                  else:
                      n = tableau[0, 2:].tolist().index(np.amin(tableau[0, 2:])) + 2
      
                  # minimum ratio test, rth variable leaves basis 
                  minimum = 99999
                  r = -1
      
                  for i in range(1, len(tableau)): 
                      if(tableau[i, n] > 0):
                          val = tableau[i, 1]/tableau[i, n]
                          if val<minimum: 
                              minimum = val 
                              r = i
                                  
                  pivot = tableau[r, n] 
                  
                 
      
                  # perform row operations 
                  # divide the pivot row with the pivot element 
                  tableau[r, 1:] = tableau[r, 1:] / pivot 
                  
                  
      
                  # pivot other rows
                  for i in range(0, len(tableau)): 
                      if i != r:
                          mult = tableau[i, n] / tableau[r, n]
                          tableau[i, 1:] = tableau[i, 1:] - mult * tableau[r, 1:] 
      
      
                  # new basic variable 
                  tableau[r, 0] = n - 2
                  
                  iter += 1
                  
              
              if(self.printIter == True):
                  print("----------------------------------")
                  print("Le tableau final parvenu en", iter, "itérations")
                  self.printTableau(tableau)
              else:
                  print('\n\n' + '\033[32m' + '      >>> Résolu! <<<' + '\x1b[0m')
                  
              self.x = np.array([0] * len(c), dtype = int)
              # save coefficients
              for key in range(1, (len(tableau))):
                  if(tableau[key, 0] < len(c)):
      
                      self.x[int(tableau[key, 0])] = tableau[key, 1] 
             
              for i in range(0,len(self.x)):
                  if(self.x[i]==0):
                      self.x[i]=1
                  else:
                      self.x[i]=0
              
      
              
              self.optimalValue = len(c) - 1 * tableau[0,1]           
              
              a = 0
      
              class b():
                  global a
                  a = self.x
          
      
      model = PL()
      A = np.array([ [1,0,1,0],[1,1,0,0],[0,1,0,1],[0,0,1,1] ])
      B = A.transpose()
      n = len(B)
      m = len(B[1])
      
      b=np.ones(n,dtype=int)
      c=np.ones(m,dtype=int)
      model.addA(B)
      model.addB(b)
      model.addC(c)
      model.setObj("MIN")
      
      C = np.zeros([m,m], dtype = int)
      
      for i in range(0,n):
          h =-1
          k =-1
          for j in range(0,m):
              if(B[i][j]==1):
                  if(h==-1):
                      h=j
                  else:
                      k=j
          C[h][k]=1
          C[k][h]=1
                  
      
      print("La matrice d'incidence :\n\nM1 =\n", A, "\n")
      print("La matrice d'adjacence :\n\nM2 =\n", C, "\n")
      print("Le graphe correspondant :\n\nG >>\n")
      
      G=nx.from_numpy_matrix(C)
      
      nx.draw(G,with_labels=1,node_color='c',font_size=12)
      plt.show()
      
      print("Le PL correspondant:\n\n(P) >>\n")
      objf = "( Min(Z) = "
      for i in range(0,m):
          objf += "X" + str(i) + " + "
      d = len(objf)
      y = slice(d-2)
      objf = objf[y]
      print(objf)
      print("|")    
      for i in range(0,n):
          st = "| "
          for j in range(0,m):
              if(B[i][j]==1):
                  st += "X" + str(j) + " + "
          
      
          x = slice(10)
          st = st[x]
          st += " >= 1"            
          print(st)   
      print("|")
      print("( xᵢ >= 0, ∀ i ∈ {0,...," + str(m-1) + "}")
      model.optimize()
      print("\n")
      
      model.printSoln()
      print("Le transversal minimum est:\n\n  T* = ", end=" ",sep="")
      v = len(a)
      
      Tm = "{"
      for i in range(0,v):
          if(a[i]==1):
              Tm += "X" + str(i) + ", "
      p = len(Tm)
      z = slice(p-2)
      Tm = Tm[z]
      Tm += "}"        
      print(Tm)  
      0