Я пытаюсь определить проблему оптимизации с GEKKO в Python, и я хочу использовать некоторые переменные проекта с предопределенным списком вариантов. Кроме того, у каждого выбора есть связанная стоимость, и ограничение будет заключаться в том, что общая стоимость должна быть ниже указанного предела.
Ниже приведен типичный пример gekko (найден здесь ) с модификацией, что x1
и x2
равны sos1
. Также с индексом выбранных значений x1
и x2
я нахожу связанные с ними затраты из другого списка, и их сумма должна быть меньше определенного значения (ограничения).
from gekko import GEKKO
def test(x1,x2,x3,x4):
res = x1*x4*(x1+x2+x3)+x3
return res
def check(x1,x2):
tt = [1,2,3,4,5]
cost = [10,10,10,2,1]
if x1.value in tt:
y1 = tt.index(x1.value)
y2 = tt.index(x2.value)
C = cost[y1]+cost[y2]
return C
return 10
m = GEKKO() # Initialize gekko
m.options.SOLVER=1 # APOPT is an MINLP solver
# optional solver settings with APOPT
m.solver_options = ['minlp_maximum_iterations 500', \
# minlp iterations with integer solution
'minlp_max_iter_with_int_sol 10', \
# treat minlp as nlp
'minlp_as_nlp 0', \
# nlp sub-problem max iterations
'nlp_maximum_iterations 50', \
# 1 = depth first, 2 = breadth first
'minlp_branch_method 1', \
# maximum deviation from whole number
'minlp_integer_tol 0.05', \
# covergence tolerance
'minlp_gap_tol 0.01']
# Integer constraints for x3 and x4
x3 = m.Var(value=1,lb=1,ub=5,integer=True)
x4 = m.Var(value=2,lb=1,ub=5,integer=True)
x1 = m.sos1([1,2,3,4,5])
x2 = m.sos1([1,2,3,4,5])
# Equations
m.Equation(x1*x2*x3*x4>=25)
m.Equation(x1**2+x2**2+x3**2+x4**2==40)
m.Equation(check(x1,x2)<=5)
m.Obj(test(x1,x2,x3,x4)) # Objective
m.solve(disp=False) # Solve
print('Results')
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('x3: ' + str(x3.value))
print('x4: ' + str(x4.value))
print('Objective: ' + str(m.options.objfcnval))
Примечание. Мне пришлось добавить блок if в функцию check
в качестве начального значения x1
и x2
, по-видимому, равно нулю.
Этот код не не работает, и я получаю следующую ошибку.
> Exception has occurred: Exception
@error: Equation Definition
Equation without an equality (=) or inequality (>,<)
true
STOPPING...
Я не знаю, что вызывает эту ошибку. Как мне переформулировать мою модель, чтобы получить желаемый результат?
Редактировать: этот пример кода является лишь моей попыткой воссоздать ошибку. Мое настоящее приложение - это проектирование инженерной системы. Например, предположим, что система имеет 2 компонента - батарею и лампочку. У меня есть два варианта батареи: батарея А весит 10 кг и ее надежность составляет 0,97, а батарея В весит 6 кг и ее надежность составляет 0,75. Точно так же есть разные варианты лампочки. Мне нужно выбрать вариант для батареи и лампы таким образом, чтобы общая надежность системы была как можно выше (объективная), а общий вес был меньше «х» кг (ограничение). В приведенном выше коде представьте значения x1
и x2
в качестве выбранных вариантов для компонентов, и я нахожу их индекс для получения их соответствующего веса / стоимости (если были выбраны батарея A и лампочка B, я получу их веса, чтобы проверить, общий вес меньше допустимого предела). Теперь моя действительная система имеет n
компонентов и m
вариантов для каждого компонента. И каждый выбор имеет вес, стоимость, надежность и т. Д. c. Я пытаюсь найти оптимальную комбинацию, чтобы максимизировать надежность системы с ограничениями по весу, стоимости и т. Д. c