我想确定某个函数(类似于下一个函数)最大化的 x 值:
很明显,当 x = 0 时达到 A 的最大值,然后 A = 200。
我如何在 Java 中解决这个问题?
更新:很抱歉从一开始就没有说清楚。x 是一个 int,但是当 x 不是下一个示例中的上限时,我也需要一种方法来找到最大值:
我想确定某个函数(类似于下一个函数)最大化的 x 值:
很明显,当 x = 0 时达到 A 的最大值,然后 A = 200。
我如何在 Java 中解决这个问题?
更新:很抱歉从一开始就没有说清楚。x 是一个 int,但是当 x 不是下一个示例中的上限时,我也需要一种方法来找到最大值:
floor 函数有一个线性上限和一个下限x-1 < floor(x) < x
,这应该可以确定曲线的一般形状。然后可以找到下限的最大值(这是一个线性函数)并枚举其值x
落在上限A
可能达到下限最大值的区域,即上限超过下限的区域下限的最小值。如果所讨论的这个区域是有限的,那么可以找到x
最大化 的。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
at x == 0
,因此我们只需要检查上界较高的那些 x 的值,(200100 - 996 * x) / 1000 > 196100 / 1000
可以减少到x < 4.02
,因此只需检查x
0 到 4 的值。
好吧,floor((x+100)/1000)
两者floor(x/1000)
都0
在给定的范围内。这使得这个例子非常简单。
ps我不认为Java与这个问题有任何关系。
编辑:没有看到x
必须是整数。
如果有人有一个变量不必是整数的函数,他们可以使用以下内容:
要近似最大值,您可以查看Nelder-Mead 方法。它容易受到局部最大值的影响,并且需要平滑函数。它在Flanagan 的 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
.Maximization
这是一个大纲,因为这是家庭作业
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.
}
}
地板功能
在java中,你基本上研究了数学优化的整个领域并在java中实现了一些算法(就像在任何其他语言中一样)。
Java 没有任何如此具体的数学工具。您可以搜索库。