如何在J中写出最大化或最小化函数

时间:2017-11-21 19:10:40

标签: j

例如,如果我想最大化期望退货功能 E [r] = w1r1 + w2r2并求解权重w1和w2的优化值。

1 个答案:

答案 0 :(得分:3)

你真正给出的唯一约束是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×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

实际得到矩阵ravel的权重所有值然后求和

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