Java 比较多个值的算法
在我的课堂上,我必须计算18个不同的建筑的价格,它们有不同的价格和收入。当建筑物数量增加时,它们的价格也会发生变化 例如:当数量为0时,建筑起价为40美元。每一个数量的价格增加4。因此,如果你拥有1栋,那么在40的状态下,购买下一栋同样的建筑的价格将是44。这就是计算价格的方法Java 比较多个值的算法,java,android,algorithm,Java,Android,Algorithm,在我的课堂上,我必须计算18个不同的建筑的价格,它们有不同的价格和收入。当建筑物数量增加时,它们的价格也会发生变化 例如:当数量为0时,建筑起价为40美元。每一个数量的价格增加4。因此,如果你拥有1栋,那么在40的状态下,购买下一栋同样的建筑的价格将是44。这就是计算价格的方法 public float getBuildingPrice(float quantity) { float buildingNum = quantity; float starti
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
你的问题不是编程问题。这是一个可以用任何语言解决的数学问题。给你足够的时间,它甚至可以在纸上解决。这是你的问题的一个公式,最终成为一个混合整数和非线性规划问题: 对于所有建筑类型
i
,让我们定义:
:建筑类型的价格Pi
i
:建筑类型的价格增量Ci
i
:建筑类型的收入Mi
i
:预算B
:购买的Ni
类型建筑物的数量i
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
在每一步中,您都会以最大比率计算建筑,购买一栋建筑,扣除预算价格,然后重复执行,直到预算用尽为止。我没有证据证明你会得到一个最佳的我遵循这个算法
第三种解决方案伪代码(暴力):
index_list是一个数组,包含每种类型建筑的编号你真的应该使用
double
s而不是float
s.@arshajii,或者更好的BigDecimal
,来存储货币。对我来说,这听起来像是一个错误。有关Java库,请参阅。@tthVictordouble
的精度是float
的两倍BigDecimal
具有无限精度。顺便说一句-您可以执行float finalPrice=startingPrice+(成本增加*buildingNum)
并删除整个if
语句。如果buildingNum
为零,那么costIncrease*buildingNum
也将为零。我对线性规划一无所知。我该怎么做?就像你说的,这是非线性的。你的最后一段仍然陈述了线性。@G.Bach我最初认为它是线性的,但经过公式化,我发现它是一个混合整数非线性问题。谢谢你指出这一点。@Tarik我意识到我现在很难吹毛求疵,但你的回答在上半部分仍然是“线性规划公式”。@G.Bach感谢你的评论。修正了令人不快的标题。根据过去的经验,我在非线性规划的背景下处理了MIPS和非线性解算器。这些MIPS和非线性功能似乎是对最初的线性编程包的扩展。但我可能错了:-)
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