まず最初に、次の質問は学校のためのものなので、私に厳しくしすぎないでください:)
再帰アルゴリズムを使用して、matlab で最適化問題をモデル化するのに少し問題があります (これは要件です)。
問題の定義は次のとおりです。
湖には現在 10000 匹の魚がいることがわかっており、1 年目に 10 年の時間枠を考慮して、毎年捕獲する魚の量を決定します。魚の成長率は、毎年初めに湖に存在する魚の数です + 20%。
x を釣る魚の量、各魚の価格を 5 ドル、魚を釣るのにかかる費用を $5 とします。
0.4x + 100 if x is <= 5000;
0.3x + 5000 if 5000 <= x <= 10000;
0.2x + 10000 if x > 10000;
利益を最大化するために、10 年間、毎年漁獲する魚の数を決定します。
将来の利益は 0.2/年の係数で減価償却されます。つまり、1 年目に $1 を稼ぐことは、2 年目に $0.8 を稼ぐことと同じです。
現在、次の目的関数を定義しています。
x -> quantity of fish to catch
b-> quantity of fish availavable in the beginning of year i
c(x,b) -> cost of catching x fish with b fishes available
f_i(b) = max {(5x - c(x,b)) + 0.8 * f_i+1((b - x) * 1.2)}
これをmatlabで実装するにはどうすればよいですか?
これは私がこれまでに持っているものです:
メインファイル
clear;
global M Kdep Cost RecursiveProfit ValorF prop
Kdep=[10; 20; 30; 40; 50; 60; 70; 80; 90; 100]; %max nr of fish in the lake at the beginning of each year, 10 years, in thousands. Growth factor = 20%
M=1000;
%Cost and Profit of selling i fishes given that there are j at the beginning of the year
for i = 1:50
for j = 1:11
Cost(i,j) = 0.2 * i + 10;
RecursiveProfit(i,j) = 5 * i - Cost(i, j);
end
end
for i = 1:10
for j = 1:10
Cost(i,j) = 0.3 * i + 5;
RecursiveProfit(i,j) = 5 * i - Cost(i, j);
end
end
for i = 1:5
for j = 1:5
Cost(i,j) = 0.4 * i + 0.1;
RecursiveProfit(i,j) = 5 * i - Cost(i, j);
end
end
%prop = 1 : 10;
ValorF = -M * ones(10, 50);
for a = 1:5
ValorF(10, a) = 5 * a - (0.4 * a + 1); %On Year 10, if there are <= a thousand fishes in the lake ...
prop(10, a) = a;
end
for b = 6:10
ValorF(10, b) = 5 * b - (0.3 * b + 5); %On Year 10, if there are 6 <= a <= 10 thousand fishes in the lake ...
prop(10, b) = b;
end
for c = 10:41
ValorF(10, c) = 5 * c - (0.2 * c + 10);
prop(10, c) = c;
end
MaxProfit = RecursiveProfit(1, 10)
k1 = prop(1,10)
kant=k1;
y = 6 - Cost(kant,10);
for q=2:10
if(kant == 0)
kant = kant + 1;
end
kq=prop(q,y)
kant=kq;
y = y - Cost(kant,q);
end %for i
関数
function y=RecursiveProfit(j,x)
global M Kdep Cost Prof ValorF prop
y=ValorF(j,x);
if y~= -M
return
end %if
auxMax=-M;
decision=0;
for k=1:Kdep(j)
if Prof(k,j) <= x-k
aux=Prof(k,j)+RecursiveProfit(j+1, (x - k));
if auxMax < aux
auxMax=aux;
decision=k;
end %if aux
else break
end %if Cost
end %for k
ValorF(j,x)=auxMax;
prop(j,x)=decision;
y=auxMax;
これは、年が 10 で b = 10 (千単位の値) の場合にのみ計算されます。これは、本で「割引利益問題」として説明されている問題と同じ問題です。
あなたが私に与えることができるどんな助けも大歓迎です。
編集1:私は本当にここで立ち往生しています。これをJavaで実装するのを手伝ってくれるなら、Matlabに移植しようと思います。
編集 2:コードを最新バージョンに編集しました。今、私は得ています
「最大再帰制限の 500 に達しました。」
手伝って頂けますか?
編集 3:なんとか動作させることができましたが、0 しか返されません。
編集 4:コードが更新されました。今、私は得ています
prop(2,0) にアクセスしようとしました。index は正の整数または論理値でなければなりません。
Main のエラー (66 行目) kq=prop(q,y)