用于比较多个值的算法

时间:2013-08-09 13:03:03

标签: java android algorithm

在我的课堂上,我必须计算18种不同建筑物的价格,这些建筑物的价格和收入不同。当建筑物数量增加时,它们的价格也会发生变化。

例如:当数量为0时,建筑物以40美元开始。每个数量的价格增加4。因此,如果您拥有1,那么购买下一个相同建筑物的价格将在44的状态下为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.

2 个答案:

答案 0 :(得分:2)

这是一个问题的表达式,它会导致混合整数和非线性编程问题:

对于所有建筑类型i,我们来定义:

  • Pi:建筑类型的价格i
  • Ci:建筑类型i
  • 的价格增量
  • Mi:建筑类型i的收入
  • B:预算
  • Ni:购买的i类型的建筑物数量。

购买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))

在每个步骤中,您使用最大比率计算建筑物,购买建筑物,扣除预算价格并重复直至预算用尽。我没有证据证明你会遵循这个算法。

第三种解决方案伪代码(暴力):

(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是一个数组,包含每种类型的建筑物的编号

答案 1 :(得分:0)

您的问题是linear programming problem。这些问题没有简单的答案。

为了解决这些问题,人们发明了许多智能算法,如Simplex Algorithm

这些alogrigthms致力于解决问题,基本上是一组数学线性方程。你必须认真思考你的问题并制定这些方程式。

以这种方式解决LP问题的C库是GLPK (GNU Linear Programming Kit)。有前端for Pythonfor Java

您的问题不是编程问题。这是一个可以用任何语言解决的数学问题。给予足够的时间,甚至可以在纸上解决。