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

在每个步骤中,您计算​​具有最大比率的建筑物,购买建筑物,扣除预算的价格并重复直到预算用完。我没有证据表明您将在遵循此算法时获得最佳效果。

第三个解决方案伪代码(蛮力):

(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

你的问题是一个线性规划问题。此类问题没有简单的答案。

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

这些算法用于表示基本上是一组数学线性方程的问题。你必须认真思考你的问题并制定这些方程式。

以这种方式解决 LP 问题的 AC 库是GLPK(GNU 线性编程工具包)。有PythonJava的前端。

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

于 2013-08-09T14:17:37.700 回答