找到最小化 c 的向量 x 。x 受约束 m 。x >= b,x 整数。
这是一个示例输入集:
c : {1,2,3}
m : {{1,0,0},
{0,1,0},
{1,0,1}}
b : {1,1,1}
Run Code Online (Sandbox Code Playgroud)
有输出:
x = {1,1,0}
Run Code Online (Sandbox Code Playgroud)
什么是解决此类问题的好工具,以及如何使用它们的示例?
我想访问在 python 中运行 gurobi 数学优化问题时找到模型最优解所需的时间。m
到目前为止我使用
runtime = m.Runtime
print("The run time is %f" % runtime)
Run Code Online (Sandbox Code Playgroud)
不幸的是,返回的运行时间始终为 0.0,与求解模型所花费的时间无关,并且在达到任何时间限制之前。
m.setParam("TimeLimit", timeLimit)
Run Code Online (Sandbox Code Playgroud)
如何通过 gurobipy 在 gurobi 中访问实际运行时?我已阅读Gurobi 参考手册,但没有成功。
论坛
我有一组数据,显然在 3D 空间中形成了一个椭圆(不是椭圆体,而是 3D 中的曲线)。受到以下线程http://au.mathworks.com/matlabcentral/newsreader/view_thread/65773的启发 ,并在某人的帮助下,我设法运行优化代码并输出一组最佳参数x(向量)。然而,当我尝试使用这个 x 来复制椭圆时,结果是空间中的一条奇怪的直线。我已经为此好几天了。仍然不知道出了什么问题......非常沮丧......我希望有人能对此有所启发。椭圆的 Mathematica 公式与上面的线程相同,其中
3D 椭圆由以下公式给出:(x;y;z) = (z1;z2;z3) + R(alpha,beta,gamma)。(a cos(phi); b*sin(phi);0)
其中: * z 是平移向量。* R 是旋转矩阵(使用欧拉角,我们首先绕 x 轴旋转 alpha rad,然后绕 y 轴旋转 beta rad,最后再次绕 z 轴旋转 gamma rad)。* a 是椭圆的长轴 * b 是椭圆的短轴。
这是我的优化目标函数(ellipsefit.m)
function [merit]= ellipsefit(x, vmatrix) % x is the initial parameters, vmatrix stores the datapoints
load vmatrix.txt % In vmatrix, the data are stored: N rows x 3 columns
a = x(1);
b = x(2);c …Run Code Online (Sandbox Code Playgroud) 我正在尝试对生化过程进行建模,并将我的问题构建为一个优化问题,我使用differential_evolutionscipy解决 了这个问题。
到目前为止,一切都很好,我对具有 15-19 个参数的简化模型的实现感到非常满意。
我扩展了模型,现在有 32 个参数,时间太长了。并非完全出乎意料,但仍然是一个问题,因此是一个问题。
我已经看到:
- 一个几乎相同的 R 并行差分进化问题
- 以及一个关于该主题 的 github 问题https://github.com/scipy/scipy/issues/4864
但它想留在 python 中(模型在 python 管道内),并且拉取请求尚未导致并正式接受解决方案,尽管已经提出了一些选项。
此外,我无法并行化要优化的函数中的代码,因为这是一系列顺序计算,每个计算都需要上一步的结果。理想的选择是有一些东西可以并行评估一些个体并将它们返回到总体中。
总结:
- scipy 中是否有任何选项允许我愚蠢地忽略的差异进化的并行化?(理想的解决方案)
- 是否有关于 scipy 中的替代算法的建议,该算法要么(方式)串行更快或可能并行化?
- 有没有其他好的软件包可以提供并行化的差分进化功能?或者其他适用的优化方法?
- 健全性检查:我是否用 32 个参数重载了 DE,我需要从根本上改变方法?
PS
我是一名生物学家,正式的数学/统计并不是我的强项,任何公式到英语的翻译都会非常感激:)
PPS
作为一个极端的选择,我可以尝试迁移到 R,但我无法编写 C/C++ 或其他语言。
python parallel-processing mathematical-optimization scipy differential-evolution
scipy.optimize 中有两种方法,分别是root和fixed_point。
我很惊讶地发现它root提供了很多方法,而fixed_point只有一种。在数学上,两者是相同的。它们将 的以下不动点g(x)与 的根相关联f(x):
[ g(x) = f(x) - x ]
如何确定使用哪个函数?
此外,这两种方法都不允许我指定定义函数的区域。有没有办法限制范围x?
我对 CVXPY 真的很陌生。我正在尝试解决8 个皇后问题,即将 8 个国际象棋皇后放在 8 x 8 棋盘上,这样两个皇后就不会互相威胁。据我了解,约束应该是:
此外,目标函数应该是:最大化矩阵的 2-范数(这样我们只能得到 1 和 0,因为我们也可以得到 s 的和为 1 float,但是 1 与 0 的范数大于浮点数的范数) 0 到 1 之间且总和为 1(例如:0.8^2+0.2^2 < 1^2+0^2)。
CVXPY 中可以解决此类问题吗?我对如何在 CVXPY 中形成约束和目标函数一无所知,但这是我最初的初步尝试(我立即收到“DCP 错误”,所以我没有理由继续,但仍然如此):
from cvxpy import *
x=Variable(shape=(9,9), name='board')
obj = Maximize(norm(x))
const = [sum(x, axis=1)==1]
prob=Problem(objective=obj,constraints=const)
prob.solve()
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激!!!
python optimization mathematical-optimization n-queens cvxpy
我正在尝试使用 z3py 作为优化求解器来最大化从一张纸上切下的长方体的体积。python API 提供了 Optimize() 对象,但使用它似乎不可靠,给我的解决方案显然不准确。
我尝试使用h = opt.maximisefollow byopt.upper(h)以及简单地检查模型,以及在将长方体添加到模型之前v = w*b*l和之后定义长方体的体积,以及将目标设置为w*b*l而不是v。他们都没有给我任何类似好的解决方案。
from z3 import *
l = Real("l")
w = Real("w")
b = Real("b")
v = Real("v")
opt = Optimize()
width = 63.6
height = 51
opt.add(b+l <= width)
opt.add(w+b+w+l+w <= height)
opt.add(w > 0)
opt.add(b > 0)
opt.add(l > 0)
opt.add(v == w*b*l)
opt.maximize(w * b * l)
# h = opt.maximize(v)
print(opt.check())
# print(opt.upper(h))
print(opt.model())
Run Code Online (Sandbox Code Playgroud)
输出: …
我有一个与Python Multiprocessing Pool Map非常相似的问题 :AttributeError: Can't pickle local object
我想我明白问题出在哪里,我只是不知道如何解决它。“Pool.map”需要一个顶级函数作为输入。但我不知道如何重写这个问题:
一个简化的代码版本:
import os as os
from multiprocessing import Pool
import numpy as np
def opti_fun_data(prediction):
def opti_fun(x):
def error_fun(i):
return error_fun_opti(x,prediction,i)
try:
pool = Pool(np.max([os.cpu_count()-1,1]))
error = np.mean(pool.map(error_fun, range(M)))
finally: # To make sure processes are closed in the end, even if errors happen
pool.close()
pool.join()
return error
return opti_fun
Run Code Online (Sandbox Code Playgroud)
如果我跑
opti_fun_data(prediction)(x0)
我得到
Can't pickle local object 'opti_fun_data.<locals>.opti_fun.<locals>.error_fun'
我是多处理库的新手,可以伸出援助之手。对于那些对一些背景感兴趣的人:我想为一堆不同的场景/预测最小化函数“opti_fun”。计算我的错误度量/基准(“error_fun_opti”)是安静的计算密集型,因此我尝试并行化这一步。
python mathematical-optimization multiprocessing python-multithreading python-multiprocessing
我想优化 lightgbm 模型的 HPO。我使用贝叶斯优化过程来做到这一点。遗憾的是我的算法未能收敛。
磁力RE
import warnings
import pandas as pd
import time
import numpy as np
warnings.filterwarnings("ignore")
import lightgbm as lgb
from bayes_opt import BayesianOptimization
import sklearn as sklearn
import pyprojroot
from sklearn.metrics import roc_auc_score, mean_squared_error
from sklearn.model_selection import KFold, cross_val_score
from sklearn.model_selection import train_test_split
from sklearn.datasets import fetch_california_housing
housing = fetch_california_housing()
train = pd.DataFrame(housing['data'], columns=housing['feature_names'])
train_y = train.pop('MedInc')
params = {
"objective" : "regression", "bagging_fraction" : 0.8, "bagging_freq": 1,
"min_child_samples": 20, "reg_alpha": 1, "reg_lambda": 1,"boosting": "gbdt",
"learning_rate" : …Run Code Online (Sandbox Code Playgroud) python mathematical-optimization hierarchical-bayesian lightgbm
我在最小化一个简单但略有特殊的功能时遇到问题。我有 scipy.optimize.minimize 但无法获得一致的结果。这是完整的代码:
from math import log, exp, sqrt
from bisect import bisect_left
from scipy.optimize import minimize
from scipy.optimize import Bounds
import numpy as np
def new_inflection(x0, x1):
return log((exp(x0)+exp(x1) + sqrt(exp(2*x0)+6*exp(x0+x1)+exp(2*x1)))/2)
def make_pairs(points):
new_points = []
for i in range(len(points)):
for j in range(i+1, len(points)):
new_point = new_inflection(points[i], points[j])
new_points.append(new_point)
return new_points
def find_closest_number(numbers, query):
index = bisect_left(numbers, query)
if index == 0:
return numbers[0]
if index == len(numbers):
return numbers[-1]
before = numbers[index - 1]
after = numbers[index] …Run Code Online (Sandbox Code Playgroud)