1

我想确定某个函数(类似于下一个函数)最大化的 x 值: 在此处输入图像描述

很明显,当 x = 0 时达到 A 的最大值,然后 A = 200。

我如何在 Java 中解决这个问题?

更新:很抱歉从一开始就没有说清楚。x 是一个 int,但是当 x 不是下一个示例中的上限时,我也需要一种方法来找到最大值: 在此处输入图像描述

4

5 回答 5

2

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 / 1000at x == 0,因此我们只需要检查上界较高的那些 x 的值,(200100 - 996 * x) / 1000 > 196100 / 1000可以减少到x < 4.02,因此只需检查x0 到 4 的值。

于 2012-07-30T16:33:14.383 回答
1

好吧,floor((x+100)/1000)两者floor(x/1000)0在给定的范围内。这使得这个例子非常简单。

ps我不认为Java与这个问题有任何关系。

于 2012-07-30T16:07:44.460 回答
1

编辑:没有看到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

于 2012-07-30T16:11:07.010 回答
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.
    }
}

地板功能

于 2012-07-30T16:08:23.293 回答
-1

在java中,你基本上研究了数学优化的整个领域并在java中实现了一些算法(就像在任何其他语言中一样)。
Java 没有任何如此具体的数学工具。您可以搜索库。

于 2012-07-30T16:08:45.830 回答