動態規劃 資源分配問題

2021-07-11 16:56:18 字數 3262 閱讀 8624

資源分配問題是考慮如何把有限分配給若干個工程的問題。參考《演算法設計與分析》

下面直接貼**:

//為了和書上的內容一致,我的變數名、變數所代表的意思和書上的幾本一致

#include

#include

#define  m 8  //可分配資源份額

#define  n 3  //工程專案個數 

using namespace std;

//定義演算法所需的資料結構

int g[n][m+1]=,,};

int optg;     //最優分配時所得的總利潤

int optq[n];  //最優分配時各項工程所得的份額

//演算法的工作單元

int f[n][m+1];//前i項工程分配不同份額資源是可得到的最大利潤

int d[n][m+1];//是使f[i][x]最大時,第i項工程分配的份額

int g[n];     //只分配前i項工程時,可得到的最大利潤

int q[n];     //只分配前i項工程時,第i項工程最優分配份額

int optx;     //最優分配時的資源最優分配份額

int kk;        //最優分配時的工程專案的最大編號

void main(void)

,             //這樣是錯的,這樣賦值沒有開闢空間,需要new函式才可以

,             // 

//};*/

//第一階段

for (int v=0;v

//其他階段

int vv;

int b_num;

for(int k=1;k

}f[k][i]=max_total;

d[k][i]=b_num;

}int uu=0;

int a_num;

for(int l=0;l

}g[k]=uu;

q[k]=a_num;

}//第一種細節處理方法 ,浪費空間

/*int c_num=0;

int f_num;

for(int ll=0;ll

}optg=c_num;

kk=f_num;

optx=q[f_num];

*///第二種細節處理方法

optg=g[0]; 

optx=q[0];

kk=0;

for(int i=1;i

}if(kk

}for(int u=n-1; u>=0; u--)

for(int r=0;r

cout<<"最高利潤為:"《為了更好的理解資源分配問題,特推薦 這篇部落格和《演算法設計與分析》143頁

有資金4萬元,投資a、b、c三個專案,每個專案的投資效益與投入該項目的資金有關。三個專案a、b、c的投資效益(萬噸)和投入資金(萬元)的關係見下表:

專案 投入資金ab

c1萬元

15萬噸 13

萬噸 11萬噸 2

萬元 28萬噸 29

萬噸 30萬噸 3

萬元 40萬噸 43

萬噸 45萬噸 4

萬元 51萬噸 55

萬噸 58萬噸

求對三個專案的最優投資分配,使總投資效益最大。

階段k:每投資乙個專案作為乙個階段;

狀態變數xk

:投資第k

個專案前的資金數;

決策變數dk

:第k個專案的投資;

決策允許集合:0

≤dk≤xk

狀態轉移方程:xk+1=xk-dk

階段指標:vk(xk,dk)

見表中所示;

遞推方程:fk(xk)=max

終端條件:f4(x4)=0

k=4,

f4(x4)=0

k=3,0≤

d3≤x3,

x4=x3-d3 x3

d3(x3)x4

v3(x3,d3)

v3(x3,d3)+f4(x4)

f3(x3)

d3*000

00+0=0 0

0101

00+0=0 11

11011

11+0=11* 2

0200+0=0 30

21111

11+0=11 2

03030+0=30* 3

0300+0=0 45

31211

11+0=11 2

13030+0=30 3

04545+0=45* 4

0400+0=0 58

41311

11+0=11 2

23030+0=30 3

14545+0=45 4

05858+0=58*

k=2,0

≤d2≤x2

,x3=x2-d2 x2

d2(x2)x3

v2(x2,d2)

v2(x2,d2)+f3(x3)

f2(x2)

d2*000

00+0=0 0

0101

00+11=11 13

11013

13+0=13* 2

0200+30=30* 30

01113

13+11=24 2

02929+0=29 3

0300+45=45* 45

01213

13+30=43 2

12929+11=40 3

04343+0=43 4

0400+58=58 59

21313

13+45=58 2

22929+30=59* 3

14343+11=54 4

05555+0=55

k=1,0

≤d1≤x1

,x2=x1-d1 x1

d1(x1)x2

v1(x1,d1)

v1(x1,d1)+f2(x2)

f1(x1)

d1*404

00+59=59 60

11315

15+45=60* 2

22828+30=58 3

14040+13=53 4

05151+0=51

最優解為x1=4, d1*=1, x2=x1-d1=3, d2*=0, x3=x2-d2*=3, d3=3, x4=x3-d3=0

,即專案a

投資1萬元,專案b

投資0萬元,專案c

投資3萬元,最大效益為60

萬噸。

動態規劃 資源離散分配問題

問題 資源離散分配問題 動態規劃的思想在於把乙個大問題化成一些同型別的子問題,然後逐個求解。從邊界條件開始遞推,每乙個子問題的解決,均使用到了前面子問題的最優結果,對於本題而言,就是要在逆向遞推的過程中,不斷更新 表與問題的最佳選擇,具體的 如下 import numpy as np 動態規劃 資源...

動態規劃 資源分配

動態規劃的決策不是線性的而是全面考慮到各種不同情況分別進行決策,最後通過多階段決策逐步找出問題最優解。而當前決策也會依賴於上一階段的決策,此時便會發生狀態的轉移。動態規劃演算法可以說是一種 聰明的蠻力法 因為動態規劃是會考慮到每一種可能,而聰明的地方是相對於蠻力法,它去掉了很多沒必要的運算。例1 資...

43 動態規劃 機器分配問題

import random as rd from pyscipopt import model,quicksum def sub ll print l,digit s for i in range len l s s str l i temp l i digit temp 1 while temp ...