Автоматически загружать ограничения в PuLP - PullRequest
0 голосов
/ 05 июля 2018

Я тестирую библиотеку оптимизации PuLP, чтобы решить простую задачу.

У меня есть матрица A , которая определяет ограничения задачи. Получив матрицу, я хочу автоматически построить функции ограничения. Выше приведен пример кода:

from pulp import LpProblem, LpMinimize, LpVariable, LpStatus, value, LpInteger
import numpy as np

# Not important. It only generates the matrix A
def schedule_gen_special(N, Na):
    matrix = np.zeros((N,N))
    for i in range(Na):
        for j in range(N):
            if(i < N):
                matrix[i][j] = 1
                i = i + 1
    matrix = matrix[:, :N-Na+2]
    return matrix

N = 6
Na = 4
A = schedule_gen_special(N, Na)

# Create the 'prob' variable to contain the problem data
prob = LpProblem("Distribution of shifts", LpMinimize)

# Defines the variables under optimization
x = []
x = [LpVariable("turno"+str(i), 0, None, LpInteger) for i in range(1,5)]

# Defines the objective function
prob2 += sum(x),'number of workers'

пока здесь, все в порядке. На данный момент, я должен определить ограничения, и стандартный способ сделать это:

# The five constraints are entered
prob2 += x[0] >= 1.0, "Primerahora"
prob2 += x[0] + x[1] >= 2.0, "Segundahora"
prob2 += x[0] + x[1] + x[2] >= 4.0, "Tercerahora"
prob2 += x[0] + x[1] + x[2] + x[3] >= 3.0, "Cuartahora"
prob2 += x[1] + x[2] + x[3] >= 2.0, "Quintahora"
prob2 += x[2] + x[3] >= 4.0, "Sextahora" 

Однако Матрица A имеет информацию об ограничениях:

array([[ 1.,  0.,  0.,  0.],
       [ 1.,  1.,  0.,  0.],
       [ 1.,  1.,  1.,  0.],
       [ 1.,  1.,  1.,  1.],
       [ 0.,  1.,  1.,  1.],
       [ 0.,  0.,  1.,  1.]]),

где первая строка соответствует первому ограничению ... и т. Д.

Можно ли автоматизировать определение ограничения, рассматривая только матрицу A ?

1 Ответ

0 голосов
/ 09 июля 2018
 for vec in A:
     prob += lpSum(c*xi for c, xi in zip(vec,x)) 
...