変数v(1) - v(k)
のセットが与えられた場合、関数f
はf(v1,v2,...vk)
と定義されます。SASは変数の関数を最大化する
ターゲットは、f
が与えられたv(1)+v(2)+....+v(k)=n
を最大にするv(i)のセットを持つことです。すべての要素は、負でない整数に制限されています。
注:SAS/IML
またはSAS/OR
はありません。
k
が知られている場合、たとえば2
とすれば、このようにsthできます。
data out;
set in;
maxf = 0;
n1 = 0;
n2 = 0;
do i = 0 to n;
do j = 0 to n;
if i + j ne n then continue;
_max = f(i,j);
if _max > maxf then do;
maxf = max(maxf,_max);
n1 = i;
n2 = j;
end;
end;
end;
drop i j;
run;
ただし、この解決策にはいくつかの問題があります。
ループの使用は非常に効率が悪いようです。
kが不明なときにネストされたループがどのように必要なのかわかりません。
それは正確k
が特定のプレフィックスとn
とデータin
の列の#により決定される「Kビンに割り当てNボール」の問題は、マクロ変数によって決定されます。
機能f
は、たとえばf(i,j) = 2*i+3*j
です。
これはデータステップで実行できますか?
がf常にあなたの変数の線形関数ですか?もしそうなら、SASを使用して、問題をホイールを再開発するのではなく、[lpsolve](https://sourceforge.net/projects/lpsolve/)のような別のアプリケーションにエクスポートすることをお勧めします。 – user667489
@ user667489残念ながら、それはこの問題が解決できるかどうか疑問に思う理由の一部です。 – Lovnlust
[SCIP](http://scip.zib.de/)はこれに対処できるかもしれません。 – user667489