我想确定某个函数(类似于下一个函数)最大化的x的值:
很明显,当x = 0时,达到A的最大值,然后A = 200。
我怎样才能在Java中解决这个问题?
更新:很抱歉没有从头开始说清楚。 x是一个int,但我需要一个方法来找到最大值,当x不是上限时,如下例所示:
答案 0 :(得分:2)
地板函数具有线性上限和下限x-1 < floor(x) < x
,这使得可以确定曲线的一般形状。然后可以找到下限的最大值(这是一个线性函数)并枚举x
的值,这些值落入A
的上限可能达到下限的最大值的区域,即上限超过下限最小值的区域。
如果这个区域是有限的,那么可以找到最大化x
的{{1}}。如果不是,则表示该函数是循环函数,因此您必须确定其周期并找到该期间的最大值。
在示例中,下限为A
,等于(x + 100) / 1000 - 1 + 3 * (x / 1000 - 1) + 200 - x
,上限为(196100 - 996 * x) / 1000
或(x + 100) / 1000 + 3 * (x / 1000) + 200 - x
。下限显然在(200100 - 996 * x) / 1000
达到196100 / 1000
的最大值,因此我们只需检查上限较高的x的值x == 0
,可以减少到{{1}因此,只需检查(200100 - 996 * x) / 1000 > 196100 / 1000
的值,从0到4。
答案 1 :(得分:1)
对于给定范围,floor((x+100)/1000)
和floor(x/1000)
都是0
。这使得这个例子非常简单。
P.S。我不认为Java与这个问题有任何关系。
答案 2 :(得分:1)
编辑:没看到x
必须是整数。
如果某人有一个变量不必是整数的函数,他们可以使用以下函数:
要估算最大值,您可以查看Nelder-Mead method。它易受局部最大值的影响,需要平滑的功能。它在Flanagan's Java Scientific Library中实施。基本上你必须扩展MaximizationFunction
并实现函数
public double function(double[] param)
其中包含您的上述功能。此方法在给定参数param
(在您的情况下为一个值:x
)的情况下评估函数,并返回函数值。
然后你可以像这样使用整个程序:
//Create instance of Maximisation
Maximization max = new Maximization();
// Create instace of class holding function to be maximised
YourFunction funct = new YourFunction();
// initial estimates (your initial x)
double[] start = {30.0};
// initial step sizes (take a good guess)
double[] step = new double[start.length];
Arrays.fill(step, 100);
// convergence tolerance
double ftol = 0.0001;
// maximal number of iterations
int maxIter = 5000;
// Nelder and Mead maximisation procedure
max.nelderMead(funct, start, step, ftol, maxIter);
// result of maximization
double result = max.getMaximum()
由于您的变量有限制,您应该通过addConstraint
的{{1}}方法添加一些约束。
答案 3 :(得分:0)
这是一个大纲,因为这是家庭作业
public int myMax(int x){ // assuming x is an integer
// implement the math function as a Java function
// Java has a floor function
}
public int findMaxOverRange(int low, int hi) {
int highestSoFar = 0;
for (int x = low; x <= hi; x++) {
// invoke your function, getting the result. If the result is higher
// than highestSoFar, reset highestSoFar to the value.
}
}
答案 4 :(得分:-1)
在java中,你基本上学习了数学优化的整个领域,并在java中实现了一些算法(和任何其他语言一样) Java没有任何特定的数学工具。您可以搜索库。