【问题标题】:How to write maximize or minimize function in J如何在 J 中编写最大化或最小化函数
【发布时间】:2017-12-06 06:08:42
【问题描述】:

例如,如果我想最大化returns函数的期望 E[r]= w1r1+w2r2 求解权重 w1 和 w2 的优化值。

【问题讨论】:

  • 你试过什么?输入和预期输出的示例是什么?
  • 我只想写一个优化函数。最大化函数y=w1r1+w2r2,输入r1和r2,给出w1+w2=1的约束,我想知道w1和w2的值

标签: j


【解决方案1】:

您真正给出的唯一约束是 w1+w2=1

   w1 =.0.25
   (,~ -.)w1
0.25 0.75

考虑到 w1 的值,这会同时处理 w1 和 w2。

r1 r2 +/@:* w1 w2 计算 r1w1 + r2w2

   r1 =. 5
   r2 =.10
   (r1,r2) (+/@:* (,-.))w1
8.75
   (r1,r2) (+/@:* (,-.))0.9
5.5
   (r1,r2) (+/@:* (,-.))0.01
9.95

如果您真的想最大化,您需要为 r1 和 r2 的值添加方程并将其考虑在内,但也许我不明白您的问题?

回复下面的评论:如果w1+w2=1的约束还在起作用,那么问题就变成了将r1和r2中的值相加,那么哪个更大的应该得到w值1和另一个将得到 w 值 0

   r1=.2 4 6 3 2
   r2=.2.1 4 6 3 2
   r3=.2 4 6 3 2.3
   r1 (,-.)@:>/@:(+/@:,.) r2
0 1
   r2 (,-.)@:>/@:(+/@:,.) r1
1 0
   r3 (,-.)@:>/@:(+/@:,.) r2
1 0
   'w1 w2'=.r3 (,-.)@:>/@:(+/@:,.) r2
   w1
1
   w2
0
   'w1 w2'=.r1 (,-.)@:>/@:(+/@:,.) r2
   w1
0
   w2
1
   (r1,.r2) +/@:,@:(+ . *) (0 1) NB. w1=.0 w2=.1
17.1
   (r1,.r2) +/@:,@:(+ . *) (1 0) NB. w1=.1 w2=.0
17
   (r1,.r2) +/@:,@:(+ . *) (0.5 0.5) NB. w1=.0.5 w2=.0.5
17.05

根据下面的后续评论,我会以两种方式之一来处理它。我可以从 1980 年代挖掘出我所有的线性规划文本,并提出最终的数学解决方案(包括退化情况和局部最大值/最小值),或者使用与上述相同的技术,但对于比 n=2 更大的情况。我会选择第二个选项。

让我们首先看一下 r 矩阵,它是一组常量。在这个例子中,我采用一个随机的 5 X 10 矩阵,其值从 1 到 10。

   r=. >: ? 5 10 $ 10
   r
 4 4 8  1  4 3 6  9  6 2
 2 6 5  4  4 7 5 10  4 6
 2 4 9 10  1 1 9  8  2 7
 5 6 5  4  7 9 2  6 10 6
10 3 6  2 10 2 7 10  4 2

现在我要使用的技巧是,我想找到平均值最高的列,然后乘以 w 的最大值。使用 (+/ % #) 轻松处理 J

   (+/ % #) r
4.6 4.6 6.6 4.2 5.2 4.4 5.8 8.6 5.2 4.6

然后找到列表的排名以便能够对原始r矩阵的列进行重新排序。领先的7 表示7 { r 是最大的平均值等。

   \:@:(+/ % #) r
7 2 6 4 8 0 1 9 5 3

我使用它依次使用 {"1 重新排序矩阵 r 的列,因为我正在处理列。结果是我重新排序了 r 的列,以便具有最大平均值的列位于左侧,并且右边最小。

   (\:@:(+/ % #) {"1 ]) r
 9 8 6  4  6  4 4 2 3  1
10 5 5  4  4  2 6 6 7  4
 8 9 9  1  2  2 4 7 1 10
 6 5 2  7 10  5 6 6 9  4
10 6 7 10  4 10 3 2 2  2

一旦我有了它,接下来的事情就是开发 w 向量。由于我现在在左侧拥有所有最大的平均值,因此我将最大化 w 左侧的值,使其在所指出的约束范围内尽可能大。

   w=. 0.2 0.2 0.2 0.2 0.15 0.01 0.01 0.01 0.01 0.01
   #w  NB. w1 through w10 
10
   +/w NB. sum of the values in w
1
   >./w NB. largest value in w
0.2
   <./w NB. smallest value in w
0.01

因为 r 矩阵已使用 + . * 重新排序,所以点积给出了 w1r1 , w2r2 , w3r3 ... w10r10 的值

   (({"1~ \:@: (+/ % #))r) + . * w
1.8 1.6 1.2 0.8 0.9 0.04 0.04 0.02 0.03 0.01
  2   1   1 0.8 0.6 0.02 0.06 0.06 0.07 0.04
1.6 1.8 1.8 0.2 0.3 0.02 0.04 0.07 0.01  0.1
1.2   1 0.4 1.4 1.5 0.05 0.06 0.06 0.09 0.04
  2 1.2 1.4   2 0.6  0.1 0.03 0.02 0.02 0.02

要实际得到矩阵的权重,将所有值求和

   +/ , (({"1~ \:@: (+/ % #))r) + . * w
31.22

【讨论】:

  • 很抱歉描述不清楚。我的意思是我有两个 r1 和 r2 的数字列表,我想知道 w1r1+w2r2 最大化时的 w1 和 w2 是什么。就像 R 中的 solve.qp 函数一样,如果我们输入两个向量和约束,我们可以获得权重 w1,w2 的最佳值。
  • 抱歉再次提问-----我要最大化w1r1+w2r2+w3r3+……+w10r10,ri都是90个数字的向量。有两个约束。一种是wi之和为1,另一种是wi大于0.01小于0.2。如何计算最佳 wi(i=1,2,3,……10)?
猜你喜欢
  • 2020-05-16
  • 2021-09-17
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
相关资源
最近更新 更多