Ошибка типа: не может умножить последовательность на не-int типа list_iterator в docplex - PullRequest
0 голосов
/ 17 марта 2020

Решение задачи целочисленного программирования 0-1 с использованием docplex solver в python.

T_1_d = int((180+8*15-lon-math.acos(math.tan(10547*(math.pi)/81000*math.cos(2*(math.pi)*(date+9)/365))*math.tan(lat*(math.pi)/180))*180/(math.pi))/15)
T_1_d1 = int((180+8*15-lon-math.acos(math.tan(10547*(math.pi)/81000*math.cos(2*(math.pi)*(date+10)/365))*math.tan(lat*(math.pi)/180))*180/(math.pi))/15)
model = Model()
var_list = [i for i in range(T_1_d, T_1_d1+24)]
B = model.binary_var_list(var_list, lb=0, name='B')
model.maximize(A*O*C_0*3600*sum(B[i])/1e9 - Q_0*A/(1000*E)*sum(B[i]*F[i]) - H*D_O*A*P_0/1e4) 

Когда я запускаю код, он сообщает о следующей ошибке:

TypeError: 'Var' object is not iterable.

Затем я написал B = iter(B), он сообщает о следующей ошибке:

TypeError: 'list_iterator' object is not subscriptable.

Затем я удаляю индекс, поворачиваю B[i] в B, он сообщает о следующей ошибке:

TypeError: can't multiply sequence by non-int of type 'list_iterator'

тип B равен list, тип B[i] равен docplex.mp.linear.Var. Я пытался int(B[i]) изменить его тип, но мне не удалось.

Я не знаю, как исправить. Надеюсь на вашу помощь, спасибо!

1 Ответ

0 голосов
/ 17 марта 2020

Вы не указали свой для l oop, а не sum(B[i]), это должно быть что-то вроде model.sum(B[i] for i in range(len(B))).

Аналогично для других условий суммирования.

Пример кода:

from docplex.mp.model import Model

model = Model()
var_list = [i for i in range(3, 6)]
B = model.binary_var_list(var_list, lb=0, name='B')
F = [ 5, 6, 7]
print(B)
model.maximize(3600*model.sum(B[i] for i in range(len(B))) - model.sum(B[i]*F[i] for i in range(len(B))))
...