0

私のクラスでは、価格と収入が異なる 18 の異なる建物の価格を計算する必要があります。また、建物の量の金額が増加すると、価格に変化があります。

例: 数量が 0 の場合、建物は 40 ドルから始まります。価格は、数量ごとに 4 ずつ増加します。したがって、1 を所有している場合、次の同じ建物を購入する価格は 40 の状態で 44 になります。したがって、これは価格を適切に計算する方法です。

public float getBuildingPrice(float quantity)
    {
        float buildingNum = quantity;
        float startingPrice = 40;
        float costIncrease = 4;
        float finalPrice;

        finalPrice = startingPrice + (costIncrease*buildingNum);
        return finalPrice;
    }

上記のメソッドは価格を返し、計算された価格をこのように建物にもたらされる収入で割りました。10は収入です

float storageWorth = buildingPrice/10;

私ができないことは、ユーザーが最も効率的な方法で購入できるさまざまな建物の量を見つけることです(つまり、最高の収入で最低の支出を意味します)。ユーザーが入力するのは予算内でなければならないことに注意してください。価格には常に変化があり、複数の値 (18 個の値) を予算内に維持するための追加条件と比較する方法がわかりません。

例えば

農場

  • 収入 - 1
  • 5棟
  • 4 の増分
  • 価格 40 + (5 * 4) = 60 収入に対する価格 = 60

ペン

  • 収入 - 5
  • 4棟
  • 20単位
  • 価格 200 + (4 * 20) = 280 所得に対する価格 280/5 = 56

つまり、ユーザーが次に購入すべき建物は、価格/収入が低いため、ペンです。また、両方の建物の収入に対する価格が同じである可能性もあります。たとえば、ペンの建物で建物が 5 に達した場合、ペンと農場の両方の収入に対する価格が 60 になります。

4

2 に答える 2

2

これは、混合整数と非線形計画問題になる問題の定式化です。

すべての建物タイプについてi定義しましょう:

  • Pi:建物タイプの価格i
  • Ci:建物タイプの価格増分i
  • Mi:建物種別の収入i
  • B: バジェット
  • Nii:購入したタイプの建物の数。

タイプ i の Ni 建物を購入すると、次のようになります。

Sum for j=1 to Ni    Pi + (j - 1) × Ci = Ni (Pi + ( Ni - 1) / 2 × Ci)

混合整数非線形計画法:

Maximise Sum for i     Ni × Mi

Subject to : sum for i    Ni (Pi + (Ni - 1) / 2 ×Ci) <= B

Pi、Ci、Mi、および B は定数であることに注意してください。決定変数は Ni

別の解決策は、次の比率に従って、投資金額あたりの収入が最大になる建物を選択して、一度に建物を購入することです。

Mi / (Ni (Pi + ( Ni - 1) / 2 × Ci))

各ステップで、最大の比率で建物を計算し、建物を購入し、予算の価格を差し引いて、予算がなくなるまで繰り返します。このアルゴリズムに従って最適な結果が得られるという証拠はありません。

3 番目のソリューションの疑似コード (ブルート フォース):

(income, index_list) function maximize_income(i, b)
   if i > last_building_type
       return 0, []
   endif
   max_income = 0
   max_income_index = 0
   while b >= P(i) - (j-1) * C(i)
       b = b - P(i) - (j-1) * C(i)
       (income, index_list) = maximize_income(i+1, b)
       income = income + j * M(i) 
       if income > maximum_income
           maximum_income = income
           maximum_income_index = j
       endif
   endwhile
   add maximum_income_index to index_list
   return maximum_income, index_list
end function

index_list は、各タイプの建物の番号を含む配列です

于 2013-08-09T14:27:57.733 に答える
0

あなたの問題は線形計画問題です。このような問題には、簡単な答えはありません。

このような問題を解決するために、人々はSimplex Algorithmのような多くのスマート アルゴリズムを発明しました。

これらのアルゴリズムは、基本的に一連の数学的な線形方程式である問題の表現に作用します。問題についてよく考えて、これらの方程式を定式化する必要があります。

このように定式化された LP 問題を解決するための AC ライブラリがGLPK (GNU Linear Programming Kit)です。PythonJavaのフロントエンドがあります。

あなたの質問はプログラミングの問題ではありません。どの言語でも解ける数学の問題です。十分な時間を与えてください。紙の上でも解決できます。

于 2013-08-09T14:17:37.700 に答える