Я пытаюсь решить задачу линейного программирования на Python. Программа Ling не может найти решение. Но квад программа работает. Я не понимаю почему, и я не уверен, что мои формулировки программы в linprog и quad program эквивалентны.
Проблема программирования лайнера, мой код и сообщение об ошибке от linprog приведены ниже.
Код
k = 6
n = 3
indexes = [1, 2, 5, 6, 7, 9]
V = np.zeros((1, k))
count = 0
for ID in xrange(1, 4):
ind = count * n + ID
p = indexes.index(ind)
V[0, p] = 1
count += 1
bounds = []
for i in xrange(6):
bounds.append((0, 1))
bounds = tuple(bounds)
W2 = np.identity(k)
W2 = np.multiply(W2, -1.0)
b2 = np.transpose(np.zeros(k))
V = [[1.0, 0.0, 1.0, 0.0, 0.0, 1.0]]
W1 = [[10., 0., 0., 0., 30., 0.],
[ 0., 10., 20., 0., 0., 0.],
[ 0., 0., 0., 20., 0., 30.]]
W1 = np.array(W1)
W3 = [[1., 1., 0., 0., 0., 0.],
[0., 0., 1., 1., 0., 0.],
[0., 0., 0., 0., 1., 1.]]
W2 = np.array(W2)
b1 = [10., 20., 30.]
b3 = [1., 1., 1.,]
EQ = np.vstack([W1, W3]).T
Eb = np.vstack([b1, b3]).T
M = np.identity(k)
P = dot(M.T, M)
q = np.zeros(k)
def quadprog_solve_qp(P, q, W2, b2, W1, b1, W3, b3):
qp_G = .5 * (P + P.T) # make sure P is symmetric
qp_a = -q
qp_C = -np.vstack([W3, W1, W2]).T
qp_b = -np.hstack([b3, b1, b2])
meq = W1.shape[0]
return quadprog.solve_qp(qp_G, qp_a, qp_C, qp_b, meq)[0]
a = quadprog_solve_qp(P=P, q=q, W2=W2, b2=b2, W1=W1, b1=b1, W3=W3, b3=b3)
print a
V = [1] * k
res = opt.linprog(c=V, A_eq=EQ, b_eq=Eb, bounds=bounds, options={"disp": True})
Сообщение об ошибке из-за сбоя linprog
Optimization failed. Unable to find a feasible starting point.
Вы можете установить программу quad с помощью
sudo pip install quadprog
Примеры использования quadprog см.
https://scaron.info/blog/quadratic-programming-in-python.html