Я борюсь со следующей настройкой.Ограниченная настройка линейной оптимизации
Мои данные следующим образом:
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)
Может кто-то пожалуйста, указать, что ошибка, которую я делаю?
Если я правильно понимаю, вы пытаетесь оптимизировать вес, чтобы назначить, исправить? Таким образом, ваши данные с каждым весом 10% являются всего лишь примером? – tBuLi
Да, это правильно. Решение оптимизировано в решающем алгоритме. Я хочу преобразовать ограничения решателя excel в python linprog. – DrBug
В поле '[0.20,0.45,0,40]' вместо запятой есть дополнительная запятая. Но в целом я бы хотел напечатать A_eq и b_eq и рассмотреть, где они отличаются от ожидаемых неравенств. – FTP