Algorithm 找到满足给定f的一个性质的最大f的参数是非递减的

Algorithm 找到满足给定f的一个性质的最大f的参数是非递减的,algorithm,math,haskell,Algorithm,Math,Haskell,这已经困扰了我一段时间了 假设你有一个函数fxy,其中x和y是整数,你知道f的参数是严格非递减的 i、 e.f(x+1)y>=fxy和fx(y+1)>=fxy 在给定x和y有界的情况下,找到满足某个性质的最大fxy的最快方法是什么 我想这可能是马鞍搜索的一种变体,我想知道这类问题是否有一个名称 另外,更具体地说,我想知道如果你知道f是乘法运算符,是否有更快的方法来解决这个问题 谢谢 编辑:看到下面的注释,属性可以是任何内容 给定一个属性g(其中g取一个值并返回一个布尔值),我只是寻找最大的f,使

这已经困扰了我一段时间了

假设你有一个函数fxy,其中x和y是整数,你知道f的参数是严格非递减的

i、 e.f(x+1)y>=fxy和fx(y+1)>=fxy

在给定x和y有界的情况下,找到满足某个性质的最大fxy的最快方法是什么

我想这可能是马鞍搜索的一种变体,我想知道这类问题是否有一个名称

另外,更具体地说,我想知道如果你知道f是乘法运算符,是否有更快的方法来解决这个问题

谢谢

编辑:看到下面的注释,属性可以是任何内容

给定一个属性g(其中g取一个值并返回一个布尔值),我只是寻找最大的f,使得g(f)==True

例如,一个简单的实现(在haskell中)是:

maximise :: (Int -> Int -> Int) -> (Int -> Bool) -> Int -> Int -> Int
maximise f g xLim yLim = head . filter g . reverse . sort $ results
    where results = [f x y | x <- [1..xLim], y <- [1..yLim]]
最大化::(Int->Int->Int)->(Int->Bool)->Int->Int->Int
最大化f g xLim yLim=水头。过滤器g。相反。排序$results

其中results=[fxy | x答案取决于什么是昂贵的。可能有趣的情况是当f是昂贵的

你可能想做的是看看帕累托最优

(1, 2)    and    (3, 4)
然后你知道后一点是一个更好的解,只要f是一个非减量函数。当然,如果你有点

(1, 2)    and    (2, 1)

那么你就不知道了。所以,一个解决方案是建立一个谓词g允许的点的帕累托最优边界,然后通过f来计算这些点。

让我们为你的问题画一个示例网格来帮助思考它。下面是一个
f
对于每个
x
y
的示例图。在每个ar中都是单调的gument,这是一个有趣的约束条件,我们可以用它做一些聪明的事情

+------- x --------->
| 0  0  1  1  1  2 
| 0  1  1  2  2  4
y 1  1  3  4  6  6
| 1  2  3  6  6  7
| 7  7  7  7  7  7
v
因为我们对属性一无所知,所以最好是按降序列出
f
范围内的值。问题是如何有效地做到这一点

首先想到的是像从右下角开始的图形一样遍历它。以下是我的尝试:

import Data.Maybe (listToMaybe)

maximise :: (Ord b, Num b) => (Int -> Int -> b) -> (b -> Bool) -> Int -> Int -> Maybe b
maximise f p xLim yLim = 
    listToMaybe . filter p . map (negate . snd) $ 
       enumIncreasing measure successors (xLim,yLim)
  where
    measure (x,y) = negate $ f x y
    successors (x,y) = [ (x-1,y) | x > 0 ] ++ [ (x,y-1) | y > 0 ] ]
签名并不像它可能的那样一般(不应该需要
Num
,但我需要它来否定度量函数,因为它返回的是递增列表而不是递减列表——我也可以使用newtype包装器来完成)


使用这个函数,我们可以找到最大奇数,它可以写成两个数的乘积
Re
满足一个属性的最大fxy
…什么属性?它取决于属性。
fxy
奇数?小于100?一个完美的平方?这三个数都有不同的最优解当然,这不仅仅是席用一个例子更新了这个问题,希望它能帮助你!“如果你在评论开始时把“@ BelasiRUS”放在我的名字上,那么它就会出现在贝里斯的收件箱里。
ghci> maximise (*) odd 100 100
Just 9801