Ce problème devient un problème de revêtement collectif.
Minimiser td> | $ \ sum_i {x_i} + \ sum_j {y_j} $ td> | Nombre de polissages td> tr> |
Variables td> | $ x_i \ in \ {0, 1 \} ~ ~ \ forall i \ in Rows $ td> | Polonais lignes Si td> tr> |
$ y_j \ in \ {0, 1 \} ~ ~ \ forall j \ in Column $ td> | S'il faut polir la colonne td> tr> | |
Contraintes td> | $ x_i + y_j \ ge 1 ~ ~ \ forall i, j \ in \ mbox {zone rayée} $ td> | Toutes les rayures Polonais td> tr> |
Créez un mannequin 4 sur 6. La partie blanche est la rayure.
python3
%matplotlib inline
import numpy as np, matplotlib.pyplot as plt
from pulp import *
np.random.seed(55)
a = np.random.randint(0, 8, 24).reshape(4, -1) // 7
plt.imshow(a, cmap='gray', interpolation='none');
Créez et exécutez un modèle mathématique.
python3
m = LpProblem()
x = [LpVariable('x%d'%i, cat=LpBinary) for i in range(a.shape[0])] #Que ce soit pour polir la ligne
y = [LpVariable('y%d'%i, cat=LpBinary) for i in range(a.shape[1])] #Que ce soit pour polir la ligne
m += lpSum(x + y) #Fonction objective(Nombre de polissage)
for i in range(a.shape[0]):
for j in range(a.shape[1]):
if a[i, j]:
m += x[i] + y[j] >= 1 #Polonais des lignes ou des colonnes si rayées
m.solve()
for i in range(a.shape[0]):
if value(x[i]):
print('ligne%Polonais d'%i)
for j in range(a.shape[1]):
if value(y[j]):
print('Colonne%Polonais d'%j)
>>>
Polonais ligne 3
Polonais ligne 2
Vous pouvez voir qu'il est fait avec 2 fois, qui est le nombre minimum de polissages.
c'est tout
Recommended Posts