Я использую nlopt в Python, беру некоторые значения в матрице, определяю функцию с таким количеством переменных, как сумма двух ее измерений, устанавливаю некоторые ограничения и оптимизирую. Это помогает мне найти параметры, которые максимизируют выражение энтропии графа.
Добавление переменного количества ограничений на основе этой матрицы оказывается трудным, я продолжаю получать ошибки «индекс 0 выходит за пределы». :
import numpy as np
import sympy as sp
import ast
import nlopt
Qgreen = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
len1, len2 = Qgreen.shape
# Calculate strength along the rows
strength1 = [np.sum(Qgreen[i, :]) for i in range(len1)]
# Calculate strength along the columns
strength2 = [np.sum(Qgreen[:, i]) for i in range(len2)]
# Combine the strengths into one list
str_combined = strength1 + strength2
# Define symbolic variables
vars = sp.symbols(f'x1:{len(str_combined)+1}') # x1, x2, ..., x6
# Create the function using symbolic expressions
f_sum = sum(s * sp.log(v) for s, v in zip(str_combined, vars))
# Flatten the product terms and their logarithms
product_terms = []
for i in range(len1):
for j in range(len1, len1 + len2):
product_terms.append(vars[i] * vars[j])
# Adding the log(1 - product_terms) part of the expression
f_product = sum(sp.log(1 - term) for term in product_terms)
# Final function combining both parts
f = f_sum + f_product
# Create a lambda function for fast evaluation
f_lambdified = sp.lambdify(vars, f, "numpy")
# Define the function for nlopt (minimization)
def nlopt_function(vars, grad):
if grad.size > 0:
# Compute the gradient if needed
grad[:] = np.array([sp.diff(f, var).evalf(subs={v: vars[i] for i, v in enumerate(vars)}) for i, var in enumerate(vars)])
return f_lambdified(*vars)
def constraints(vars, result):
count = 0
num_vars = len(vars) # Total number of variables
print(num_vars)
for i in range(num_vars):
for j in range(num_vars):
if i != j: # Avoid self-products
result[count] = vars[i] * vars[j] - 1 # The constraints are vars[i] * vars[j] < 1
count += 1
opt = nlopt.opt(nlopt.LN_COBYLA, len(vars)) # Use COBYLA which supports constraints
opt.set_max_objective(nlopt_function)
opt.add_inequality_constraint(constraints, 1e-8)
initial_guess = np.random.uniform(0, 1, len(vars))
optimized_vars = opt.optimize(initial_guess)
max_val = opt.last_optimum_value()
print("Optimized variables:", optimized_vars)
print("Maximum value:", max_val)
Я пробую различные комбинации добавления ограничений, но все время получаю ту же ошибку: индекс выходит за пределы.
Я использую nlopt в Python, беру некоторые значения в матрице, определяю функцию с таким количеством переменных, как сумма двух ее измерений, устанавливаю некоторые ограничения и оптимизирую. Это помогает мне найти параметры, которые максимизируют выражение энтропии графа. Добавление переменного количества ограничений на основе этой матрицы оказывается трудным, я продолжаю получать ошибки «индекс 0 выходит за пределы». : [code] result[count] = vars[i] * vars[j] - 1 # vars[i] * vars[j] < 1 ~~~~~~^^^^^^^ IndexError: index 0 is out of bounds for axis 0 with size 0
[/code] когда я пытаюсь добавить ограничения. По сути, что не так с этим методом добавления ограничений? [code]import numpy as np import sympy as sp import ast import nlopt
# Create the function using symbolic expressions f_sum = sum(s * sp.log(v) for s, v in zip(str_combined, vars))
# Flatten the product terms and their logarithms product_terms = [] for i in range(len1): for j in range(len1, len1 + len2): product_terms.append(vars[i] * vars[j])
# Adding the log(1 - product_terms) part of the expression f_product = sum(sp.log(1 - term) for term in product_terms)
# Final function combining both parts f = f_sum + f_product
# Create a lambda function for fast evaluation f_lambdified = sp.lambdify(vars, f, "numpy")
# Define the function for nlopt (minimization) def nlopt_function(vars, grad): if grad.size > 0: # Compute the gradient if needed grad[:] = np.array([sp.diff(f, var).evalf(subs={v: vars[i] for i, v in enumerate(vars)}) for i, var in enumerate(vars)]) return f_lambdified(*vars)
def constraints(vars, result): count = 0 num_vars = len(vars) # Total number of variables print(num_vars) for i in range(num_vars): for j in range(num_vars): if i != j: # Avoid self-products result[count] = vars[i] * vars[j] - 1 # The constraints are vars[i] * vars[j] < 1 count += 1
opt = nlopt.opt(nlopt.LN_COBYLA, len(vars)) # Use COBYLA which supports constraints opt.set_max_objective(nlopt_function) opt.add_inequality_constraint(constraints, 1e-8) initial_guess = np.random.uniform(0, 1, len(vars)) optimized_vars = opt.optimize(initial_guess) max_val = opt.last_optimum_value() print("Optimized variables:", optimized_vars) print("Maximum value:", max_val) [/code] Я пробую различные комбинации добавления ограничений, но все время получаю ту же ошибку: индекс выходит за пределы.
Я плохо говорю по-английски, заранее прошу прощения
Часть 1. Что и как работает
Сначала расскажу подскажите в чем заключается задача, нужно создать некий алгоритм, на входе которого будет массив с предметами, имеющими цену( 'cost' => 123 ), а также...
У меня 16 3D -точек, 16 2D точек, матрица камеры и коэффициенты искажения. Используя эту информацию, я пытаюсь вычислить новые векторы вращения и векторы перевода. Вот используемый код.
success, rvec, tvec = cv2.solvePnP(points_3d, points_2d,...
У меня 16 3D -точек, 16 2D точек, матрица камеры и коэффициенты искажения. Используя эту информацию, я пытаюсь вычислить новые векторы вращения и векторы перевода. Вот используемый код.
success, rvec, tvec = cv2.solvePnP(points_3d, points_2d,...
У меня 16 3D -точек, 16 2D точек, матрица камеры и коэффициенты искажения. Используя эту информацию, я пытаюсь вычислить новые векторы вращения и векторы перевода. Вот используемый код.
success, rvec, tvec = cv2.solvePnP(points_3d, points_2d,...
Я работаю над реализацией задачи нелинейной оптимизации с использованием библиотеки NLOpt, и у меня возникли проблемы с определением ограничения векторного неравенства с помощью интерфейса C++.
NLOpt документы, кажется, указывают, что они...