2016-12-25 2 views
0

Я борюсь со следующей настройкой.Ограниченная настройка линейной оптимизации

Мои данные следующим образом:

Group ID Wt  Coeff  Coeff*Wt 
------ --- ------ ------- ------- 
Group1 A 10.00% 1.00000  0.100 
Group1 B 10.00% 1.00000  0.100 
Group1 C 10.00% 3.00005  0.300 
Group2 D 10.00% 1.00000  0.100 
Group2 E 10.00% 1.00000  0.100 
Group2 F 10.00% 1.00000  0.100 
Group2 G 10.00% 7.80016  0.780 
Group3 H 10.00% 7.80485  0.780 
Group3 I 10.00% 1.00000  0.100 
Group3 J 10.00% 0.39529  0.040 



Objective function: Fmin = mimimize(sum of weights * coeff) 

Мне нужно реализовать следующие ограничения:

Sum of Weights*Coeff of Group1 = 20% of total minimized fmin 
Sum of Weights*Coeff of Group1 = 45% of total minimized fmin 
Sum of Weights*Coeff of Group1 = 35% of total minimized fmin 

И следующие условия ограничивающие:

Weights <=10% and Weights > 0.30% 

И

Sum of weights = 100% 

Я пытаюсь выполнить это со следующим кодом.

Я не знаю, почему это не работает:

from scipy.optimize import linprog 

c = [ 1.0000 ,1.0000 ,3.0001 ,1.0000 ,1.0000 ,1.0000 ,7.8002 ,7.8049 ,1.0000 ,0.3953 ] 

groupPerID = ['Group1','Group1','Group1','Group2','Group2','Group2','Group2','Group3','Group3','Group3'] 

groupList = ['Group1','Group2','Group3'] 

groupUpperBound = [0.20,0.45,0.40] 

A_eq_list = [] 
A_eq_list.append([1]*len(c)) 

b_eq_list = [1] 

for idx,currentGroup in enumerate(groupList): 

    matches = [i for i in range(len(groupPerID)) if groupPerID[i] == currentGroup] 

    currentGroupUB = groupUpperBound[idx] 

    x_list = [float(-1*currentGroupUB*coeff) for coeff in c] 

    for idx in matches: 
     x_list[idx] = float((1-currentGroupUB)*c[idx]) 

    A_eq_list.append(x_list) 

b_eq_list.extend([0]*len(groupUpperBound)) 
res = linprog(c, A_eq=A_eq_list, b_eq=b_eq_list,bounds =(0.003,0.1),options={'tol':0.05}) 
print(res) 

Может кто-то пожалуйста, указать, что ошибка, которую я делаю?

+0

Если я правильно понимаю, вы пытаетесь оптимизировать вес, чтобы назначить, исправить? Таким образом, ваши данные с каждым весом 10% являются всего лишь примером? – tBuLi

+0

Да, это правильно. Решение оптимизировано в решающем алгоритме. Я хочу преобразовать ограничения решателя excel в python linprog. – DrBug

+0

В поле '[0.20,0.45,0,40]' вместо запятой есть дополнительная запятая. Но в целом я бы хотел напечатать A_eq и b_eq и рассмотреть, где они отличаются от ожидаемых неравенств. – FTP

ответ

1

Итак, я внедрил его в свою обертку scipysymfit, которая заботится обо всех кодовых табличках котлов. Теперь он работает, за исключением того факта, что я еще не выполнил ваши оценки на весах. Тем не менее, я думаю, что это неверно, как указано в вашем вопросе, потому что единственный способ удовлетворить ограничение, что весь вес должен суммировать до 1, заключается в том, чтобы установить их все в верхний предел 0,1. Кроме этого, здесь моя попытка:

from symfit import parameters, Minimize, Variable, Eq 
import numpy as np 

# Make 10 weight parameters w_i to optimize 
weights = parameters(','.join('w_{}'.format(i) for i in range(1, 11))) 
c = np.array([1.0000, 1.0000, 3.0001, 1.0000, 1.0000, 1.0000, 7.8002, 7.8049, 1.0000, 0.3953]) 
f = Variable() 

for w_i in weights: 
    w_i.min = 0.003 
    w_i.max = 1.0 
    w_i.value = 0.1 

sum_of_group_1 = sum(c_i * w_i for c_i, w_i in zip(c, weights)[0:3]) 
sum_of_group_2 = sum(c_i * w_i for c_i, w_i in zip(c, weights)[3:7]) 
sum_of_group_3 = sum(c_i * w_i for c_i, w_i in zip(c, weights)[7:10]) 
# Function to minimize 
model = {f: sum_of_group_1 + sum_of_group_2 + sum_of_group_3} 

constraints = [ 
    Eq(0.20 * sum_of_group_1, 0.45 * sum_of_group_2), 
    Eq(0.20 * sum_of_group_1, 0.35 * sum_of_group_3), 
    Eq(sum(weights), 1) 
] 

fit = Minimize(model, constraints=constraints) 
fit.eval_jacobian = None # Workaround needed because f is just a scalar, not an array 
fit_result = fit.execute() 

print(fit_result) 
print(sum(fit_result.value(w) for w in weights)) # >>> 1.0 

Вы можете прочитать в документации here.

+0

Спасибо tBuli. Я сейчас пытаюсь проверить, насколько оптимизирована проблема оптимизации, которую я пытаюсь решить, или нет. Я вернусь и обнов свои выводы, а также приму вашу помощь в качестве окончательного ответа. – DrBug

+0

Рад, что я мог помочь! Да, не задумываясь над этим, я бы подумал, что система недооценивается, и поэтому решения не уникальны, если таковые имеются. Удачи! – tBuLi

Смежные вопросы