声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3720|回复: 17

[经典算法] 请教一个优化目标函数的算法

[复制链接]
发表于 2009-1-5 20:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
请教大家一个问题:

两个参数,可以算出一系列分立的数值,类似能级那样的
不知道这两个参数的取值
现在我让它们都从负无穷大变化到正无穷大
希望能找到合适范围的值,使算出的结果变化很小,也就是要结果收敛

请问这个的目标函数该怎样写?又没有标准值可进行比较

谢谢
回复
分享到:

使用道具 举报

发表于 2009-1-7 12:40 | 显示全部楼层
我感觉应该这样,目标应该为函数值差值绝对值,要求它在某一个约定的范围内变化。求出对应的参数范围来。
发表于 2009-1-24 23:30 | 显示全部楼层
最近我倒是做了不少优化的工作,不过没明白楼主的意思。
发表于 2009-2-3 08:53 | 显示全部楼层
我也没有看明白,希望搂住具体一点,这样说太笼统了。
 楼主| 发表于 2009-2-8 20:44 | 显示全部楼层
问题大体上是这样:
      两个参数 A,B,能算出一系列由小到大,由负到正排列的数值 E1,E2,E3 ,E4 。。。
现在想确定A,B的大小,至少是个比较小的范围,使得当A,B取这个范围中的值算出来的结果相差很小,
也就是A,B在这个取值范围内算出的结果比较稳定。

我正在试的,是算A,B每个取值下的 abs(E1-E2) ,相邻的进行对比,当差异小于一极小值时,就认为稳定了
发表于 2009-2-8 21:35 | 显示全部楼层
目标函数就是
max(abs(E_i+1-E_i))
其中E_i=e(A,B,i)
当作一般的二元函数极值问题,看看能不能用高斯牛顿法,我最近解决的一个问题跟楼主的问题差不多。
 楼主| 发表于 2009-2-11 16:56 | 显示全部楼层
如果是三个待定参数,用相邻结果的差值作目标函数
怎么觉得不太可行
大家给点意见哈
发表于 2009-2-11 21:21 | 显示全部楼层
那个目标是你自己定的啊。又或者你想定义为Ei的最大值减去最小值也行。这个不是关键,关键是这个函数相对于参数来说不连续,或是不单调就不好应用高斯牛顿法了。你不如把你的问题整个说出来,就是那个E_i=e(A,B,i)到底是什么,你的优化目标又是什么。
 楼主| 发表于 2009-2-13 15:35 | 显示全部楼层
我正在尝试,等搞定我再详细说一下
现在我想,三个参数,可不可以先两两优化
     比如说先确定好 X,Y的,再确定好Y,Z,最后再确定X,Z的
最后归到一起在一个小范围里进行三个的优化
不知道这样的可靠性如何?
发表于 2009-2-13 18:05 | 显示全部楼层
两两优化应该不行。所谓极值就是函数对参数的偏导=0,有几个参数就得到几个方程,解方程组就得到了最优参数。两两优化相当于设定1个参数不动,这样得到的不完全维数的最优结果可能离真正的最优结果很远。如果按你上面说的两两优化过程重复次数足够的话可能可以得到正确结果,不过收敛可能会很慢。两两优化的思维有点像梯度法,不过效果肯定低于梯度法,也不能保证总是正确的。
 楼主| 发表于 2009-2-14 20:27 | 显示全部楼层

回复 8楼 logxing 的帖子

越想越乱了
问题和前面一样的,只不过现在发现应该是三个参数 A,B,C 共同决定的 E1,E2,E3,。。。
现在用了个很笨的方法,先在一个大范围找一些点(A,B,C),算出每种情况的结果,所有的两两进行比较,
找出相差比较小的情况,根据所对应的点缩小参数的范围,然后再取点算,比较。。。

其实要求E值稳定,也就是E对A,B,C的一次导数为0,应该也可以用求最小值的方法
但现在还没能转过弯来 sigh!
发表于 2009-2-14 20:49 | 显示全部楼层
你这样做收敛很慢很慢很慢......
到底这个E是个什么形式,很长吗?你这里i也是一个重要的参数你的目标是E稳定,如Emax-Emin取极值。而不是E取极值。
 楼主| 发表于 2009-2-16 22:56 | 显示全部楼层
倒腾的结果很糟糕,很有挫败感:'(
E的形式:
比如 (A1,B1,C1)算出E1=-9.87654321,E2=-7.65432198。。。。E(n)=1.23456789,E(n+1)=3.45678912。。。
对应另一组参数(A2,B2,C2)可算出另一系列的分立的值E1=。。。E2=。。。
现在比较关心 0 附近的结果,所以只care 0 附近的几个结果
前面直接一一比较对应几个值的差异,很是麻烦,也没有什么结果
谢谢logxing,我再用您的建议试一下
发表于 2009-2-17 00:14 | 显示全部楼层
能不能把E写成一个函数,如下
function E (A as double ,B as double,C as double ,i as double) as double
......
end function
这样以后调用,调试很方便。看你的描述似乎每算一组参数都很累的样子。手动比较很难行得通,尤其是你这个是多维的。
上面的函数写出来问题就解决九成了。
 楼主| 发表于 2009-2-17 09:23 | 显示全部楼层
E是通过将A,B,C带入另一个程序算出来的
本身不能直接写出解析的形式
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-18 20:00 , Processed in 0.054997 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表