當前位置:首頁 » 交易知識 » 動態規劃演算法股票交易
擴展閱讀
股票都交易了 2025-06-28 21:14:37
洞庭葯業股票代碼 2025-06-28 20:57:39
深科技這個股票怎麼樣 2025-06-28 20:50:01

動態規劃演算法股票交易

發布時間: 2021-04-26 00:50:40

⑴ 動態規劃演算法對所有問題都能得到整體最優解嗎為什麼

1、基本概念:

動態規劃就是:每走一步,都會根據之前的情況來決定這一步的走向,所以,這種多階段最優化決策解決問題的過程就稱為動態規劃。

2、基本思想與策略:

與分治法類似,也是將待求解的問題分解為若干個子問題(階段),按順序求解子階段,前一子問題的解,為後一子問題的求解提供了有用的信息。在求解任一子問題時,列出各種可能的局部解,通過決策保留那些有可能達到最優的局部解,丟棄其他局部解。依次解決各子問題,最後一個子問題就是初始問題的解。

由於動態規劃解決的問題多數有重疊子問題這個特點,為減少重復計算,對每一個子問題只解一次,將其不同階段的不同狀態保存在一個二維數組中。

與分治法最大的差別是:適合於用動態規劃法求解的問題,經分解後得到的子問題往往不是互相獨立的(即下一個子階段的求解是建立在上一個子階段的解的基礎上,進行進一步的求解)。

3、經典例題:

這里我們用2個經典例題來解釋到底什麼是動態規劃。

⑵ 《股票最優投資組合案例研究 ——基於風險結合的動態規劃法 》作者是誰

趙和平

⑶ 動態規劃演算法 通俗的講解一下

這種技術採用自底向上的方式遞推求值,將待求解的問題分解成若干個子問題,先求解子問題,並把子問題的解存儲起來以便以後用來計算所需要求的解。簡言之,動態規劃的基本思想就是把全局的問題化為局部的問題,為了全局最優必須局部最優。多階段決策問題是根據問題本身的特點,將其求解的過程劃分為若干個相互獨立又相互聯系的階段,在每一個階段都需要做出決策,並且在一個階段的決策確定以後再轉移到下一個階段,在每一階段選取其最優決策,從而實現整個過程總體決策最優的目的

⑷ 動態規劃演算法程序例子

給你導彈攔截的吧:
[問題描述]
某國為了防禦敵國的導彈襲擊,發展出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的導彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的導彈。
輸入導彈依次飛來的高度(雷達給出的高度數據是不大於30000的正整數,每個數據之間至少有一個空格),計算這套系統最多能攔截多少導彈,如果要攔截所有導彈最少要配備多少套這種導彈攔截系統。

[輸入輸出樣例]
INPUT:
389 207 155 300 299 170 158 65
OUTPUT:
6(最多能攔截的導彈數)
2(要攔截所有導彈最少要配備的系統數)

[問題分析]
我們先解決第一問。一套系統最多能攔多少導彈,跟它最後攔截的導彈高度有很大關系。假設a[i]表示攔截的最後一枚導彈是第i枚時,系統能攔得的最大導彈數。例如,樣例中a[5]=3,表示:如果系統攔截的最後一枚導彈是299的話,最多可以攔截第1枚(389)、第4枚(300)、第5枚(299)三枚導彈。顯然,a[1]~a[8]中的最大值就是第一問的答案。關鍵是怎樣求得a[1]~a[8]。
假設現在已經求得a[1]~a[7](註:在動態規劃中,這樣的假設往往是很必要的),那麼怎樣求a[8]呢?a[8]要求系統攔截的最後1枚導彈必須是65,也就意味著倒數第2枚被攔截的導彈高度必須不小於65,則符合要求的導彈有389、207、155、300、299、170、158。假如最後第二枚導彈是300,則a[8]=a[4]+1;假如倒數第2枚導彈是299,則a[8]=a[5]+1;類似地,a[8]還可能是a[1]+1、a[2]+1、……。當然,我們現在求得是以65結尾的最多導彈數目,因此a[8]要取所有可能值的最大值,即a[8]=max{a[1]+1,a[2]+1,……,a[7]+1}=max{a[i]}+1 (i=1..7)。
類似地,我們可以假設a[1]~a[6]為已知,來求得a[7]。同樣,a[6]、a[5]、a[4]、a[3]、a[2]也是類似求法,而a[1]就是1,即如果系統攔截的最後1枚導彈是389,則只能攔截第1枚。
這樣,求解過程可以用下列式子歸納:
a[1]=1
a[i]=max{a[j]}+1 (i>1,j=1,2,…,i-1,且j同時要滿足:a[j]>=a[i])
最後,只需把a[1]~a[8]中的最大值輸出即可。這就是第一問的解法,這種解題方法就稱為「動態規劃」。

第二問比較有意思。由於它緊接著第一問,所以很容易受前面的影響,多次採用第一問的辦法,然後得出總次數,其實這是不對的。要舉反例並不難,比如長為7的高度序列「7 5 4 1 6 3 2」, 最長不上升序列為「7 5 4 3 2」,用多次求最長不上升序列的結果為3套系統;但其實只要2套,分別擊落「7 5 4 1」與「6 3 2」。所以不能用「動態規劃」做,那麼,正確的做法又是什麼呢?
我們的目標是用最少的系統擊落所有導彈,至於系統之間怎麼分配導彈數目則無關緊要,上面錯誤的想法正是承襲了「一套系統盡量多攔截導彈」的思維定勢,忽視了最優解中各個系統攔截數較為平均的情況,本質上是一種貪心演算法,但貪心的策略不對。如果從每套系統攔截的導彈方面來想行不通的話,我們就應該換一個思路,從攔截某個導彈所選的系統入手。
題目告訴我們,已有系統目前的瞄準高度必須不低於來犯導彈高度,所以,當已有的系統均無法攔截該導彈時,就不得不啟用新系統。如果已有系統中有一個能攔截該導彈,我們是應該繼續使用它,還是另起爐灶呢?事實是:無論用哪套系統,只要攔截了這枚導彈,那麼系統的瞄準高度就等於導彈高度,這一點對舊的或新的系統都適用。而新系統能攔截的導彈高度最高,即新系統的性能優於任意一套已使用的系統。既然如此,我們當然應該選擇已有的系統。如果已有系統中有多個可以攔截該導彈,究竟選哪一個呢?當前瞄準高度較高的系統的「潛力」較大,而瞄準高度較低的系統則不同,它能打下的導彈別的系統也能打下,它夠不到的導彈卻未必是別的系統所夠不到的。所以,當有多個系統供選擇時,要選瞄準高度最低的使用,當然瞄準高度同時也要大於等於來犯導彈高度。
解題時用一個數組sys記下當前已有系統的各個當前瞄準高度,該數組中實際元素的個數就是第二問的解答。

[參考程序]
program noip1999_2;
const max=1000;
var i,j,current,maxlong,minheight,select,tail,total:longint;
height,longest,sys:array [1..max] of longint;
line:string;
begin
write('Input test data:');
readln(line); {輸入用字元串}
i:=1;
total:=0; {飛來的導彈數}
while i<=length(line) do {分解出若干個數,存儲在height數組中}
begin
while (i<=length(line)) and (line[i]=' ') do i:=i+1; {過濾空格}
current:=0; {記錄一個導彈的高度}
while (i<=length(line)) and (line[i]<>' ') do {將一個字元串變成數}
begin
current:=current*10+ord(line[i])-ord('0');
i:=i+1
end;
total:=total+1;
height[total]:=current {存儲在height中}
end;
longest[1]:=1; {以下用動態規劃求第一問}
for i:=2 to total do
begin
maxlong:=1;
for j:=1 to i-1 do
begin
if height[i]<=height[j]
then if longest[j]+1>maxlong
then maxlong:=longest[j]+1;
longest[i]:=maxlong {以第i個導彈為結束,能攔截的最多導彈數}
end;
end;
maxlong:=longest[1];
for i:=2 to total do
if longest[i]>maxlong then maxlong:=longest[i];
writeln(maxlong); {輸出第一問的結果}
sys[1]:=height[1]; {以下求第二問}
tail:=1; {數組下標,最後也就是所需系統數}
for i:=2 to total do
begin
minheight:=maxint;
for j:=1 to tail do {找一套最適合的系統}
if sys[j]>height[i] then
if sys[j]<minheight then
begin minheight:=sys[j]; select:=j end;
if minheight=maxint {開一套新系統}
then begin tail:=tail+1; sys[tail]:=height[i] end
else sys[select]:=height[i]
end;
writeln(tail)
end.

[部分測試數據]
輸入1:300 250 275 252 200 138 245
輸出1:
5
2

輸入2:181 205 471 782 1033 1058 1111
輸出2:
1
7

輸入3:465 978 486 476 324 575 384 278 214 657 218 445 123
輸出3:
7
4

輸入4:236 865 858 565 545 445 455 656 844 735 638 652 659 714 845
輸出4:
6
7
夠詳細的吧

⑸ 動態規劃演算法(pascal)

在計算夠不夠開銷時
20%這個數據是廢的
你可以先減去預算再考慮存多少錢
比如手頭錢的數目為a
預算為b
存在媽媽處的錢為c
可以先從a中減去b
然後c就等於c+a div 100 *100
var 略
begin
a:=0;
c:=0;
bo:=true;
for i:=1 to 12 do
begin
read(b[i]);
inc(a,300);
if a<b[i] then begin
writeln(i);
bo:=false;
break;
end
else begin
c:=c+a div 100*100;
dec(a,b[i]);
a:=a mod 100;
end;
end;
if bo then writeln(a+c+c div 5);
end.

⑹ 動態規劃演算法怎麼計算

動態規劃演算法:

(1)分析最優解的性質,並刻畫其結構特徵。

(2)遞歸的定義最優解。

(3)以自底向上或自頂向下的記憶化方式(備忘錄法)計算出最優值。

(4)根據計算最優值時得到的信息,構造問題的最優解。

⑺ 詳解動態規劃演算法

其實你可以這么去想。
能用動態規劃解決的問題,肯定能用搜索解決。
但是搜素時間復雜度太高了,怎麼優化呢?
你想到了記憶化搜索,就是搜完某個解之後把它保存起來,下一次搜到這個地方的時候,調用上一次的搜索出來的結果。這樣就解決了處理重復狀態的問題。
動態規劃之所以速度快是因為解決了重復處理某個狀態的問題。
記憶化搜索是動態規劃的一種實現方法。
搜索到i狀態,首先確定要解決i首先要解決什麼狀態。
那麼那些狀態必然可以轉移給i狀態。
於是你就確定了狀態轉移方程。
然後你需要確定邊界條件。
將邊界條件賦予初值。
此時就可以從前往後枚舉狀態進行狀態轉移拉。

⑻ 動態規劃實現排隊買票演算法

不考慮時間效率就用遞歸。
比如讓第一二人組隊。加上後面所有人的時間得到總的時間T1
同理讓第二三人組隊,加上第一個人的時間和後面所有人的時間得到總的時間T2
在T1 T2 中選擇小的為最終方案。
其中:加上後面所有人的時間得到總的時間,
加上第一個人的時間和後面所有人的時間得到總的時間,
又是規模較小的買票事件(即遞歸)
這樣做簡單好理解(前提是理解遞歸),但是時間很慢。

⑼ 動態規劃演算法的基本思想是什麼

DP一定有狀態,而貪心只是說這個題目最有滿足什麼條件就能得到最優解的情況
一般DP必須得求出他的狀態和轉移方程

⑽ 排隊買票問題的動態規劃演算法

如果前i個人買票的最優買票方式一確定,比如第i-1個人買一張票,則前i-1個人的買票方式也一定是最優的。即問題的最優解包含子問題的最優解。
步驟1:用F(i)表示前i個人買票的最優方式,即所需最短時間;現在要決定F(i)需要考慮兩種情況:
(1)第i個人的票自己買
(2)第i個人的票由第i-1個人買