【问题标题】:Optimization with Unknown Number of Variables使用未知数量的变量进行优化
【发布时间】:2016-07-13 17:44:55
【问题描述】:

由于原问题比较复杂,下面用一个简单的例子来说明思路。

例如,假设我们想在房间的某个地方放置几根路由器天线,以便手机在桌子上获得最大的信号强度(接收功率 > Pmax),而在床上获得最弱的信号强度(接收功率

数学上,

SIGNAL_STRENGTH 取决于变量 (x, y, z) 和数字 变量

。即天线的位置和数量。 此外,假设

预测 = f((x1, y1, z1), (x2, y2, z2), ... (xi, yi, zi), ... (xn, yn, zn))

其中 n 和 (xi, yi, zi) 将被优化。目标是最小化

成本函数 = ||SIGNAL_STRENGTH - 预测||

我尝试在 Matlab 中使用 GA 和混合整数编程来实现它。使用了两个优化函数,外部函数是优化 n,内部优化函数在给定 n 的情况下优化 (x, y, z)。这种方法运行缓慢,到目前为止我还没有看到这种方法给出的结果。

有没有人有更有效的方法来解决这个问题?任何建议表示赞赏。提前致谢。

【问题讨论】:

  • @AnderBiguri 你的意思是这是一个没人解决的问题?
  • @AnderBiguri 的意思是你的问题太宽泛了。请read the FAQ 在这里提问。提出一个具体问题,指出您尝试过的内容并提供代码/MVCE。你用过profile吗?您是否先尝试过较小的问题?您确定该问题不是由错误引起的吗?
  • 听起来你有一些不适合你的代码。请包括代码并描述什么是不工作的。

标签: matlab optimization mathematical-optimization genetic-algorithm nonlinear-optimization


【解决方案1】:

术语 |问题定义

天线正在a in R^3 位置以恒定功率发送。它的信号强度可以通过一些S: R^3 -> R 来测量,其中Sa 处有一个最大值S_0,而由S(x) > const 构造的集合是简单连接的,即S(x) = S_0 * exp(-const * (x-a)^2)

给定一组天线A,得到的信号强度是单个天线的最大值

S_A(x) = max{S_a(x) : for all a in A} ,

这意味着我们“锁定”在最强的天线上,这就是手机所做的。

K = R^3 x R 表示点空间(位置、强度)。现在考虑K 的两个有限 子集POI_minPOI_max。我们想找到天线数量最少的集合A (|A| -> min.),满足

for all (x,w) in POI_min : S_A(x) < w and for all (x,w) in POI_max : S_A(x) > w .

含义

由于S(x) &gt; const 是简单连接的,因此必须在每个元素(x,w) in POI_max 的位置周围的球体中有一个天线,半径为r = max{||xi - x|| : for all xi in S(xi) = w}。这意味着如果我们将天线放置在(x,w) 的位置,那么我们可以远离x 并且仍然具有信号强度w 的最远距离是半径r,实际天线必须在该半径范围内定位。

对于POI_min 有类似的论证,因此r = min{||xi - x|| : for all xi in S(xi) = w} 内没有天线。

解决方案

我们可以将球体相交以获得最优解,而不是解决非线性优化任务。如果k 球体围绕POI_max 位置相交,我们可以在相交处放置一个天线,从而减少k-1 所需的天线数量。

但是,放置的每个天线都必须满足POI_min 元素给出的所有约束。假设天线是全向的,因此天线的方向并不重要,我们可以做(伪代码):

min_sphere = {(x_i,r_i) : from POI_min}, 
spheres_to_cover = {(x_i,r_i) : from POI_max}
A = {}
while not is_empty(spheres_to_cover)
    power_set_score = struct // holds score, k
    PS <- costruct power set of sphere_to_cover
    for i = 1:number_of_elements(PS)
        k = PS[i]
        if intersection(k) \ min_sphere is not empty
            power_set_score[i].score = |k|
        else
            power_set_score[i].score = 0
        end if
        power_set_score[i].k = k
    end for
    sort(power_set_score) // sort by score, biggest first
    A <- add arbitrary point in (intersection(power_set_score[1].k) \ min_sphere)
    spheres_to_cover = spheres_to_cover \ power_set_score[1].k
end while

另一方面,您刚刚给出了一个示例问题,因此该解决方案可能不适用于您的案例或不够广泛。我确实做了一些假设。因此,在问题中更具体可能会给您更好的答案。

【讨论】:

    猜你喜欢
    • 2016-01-06
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多