Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较多个值的算法_Java_Android_Algorithm - Fatal编程技术网

Java 比较多个值的算法

Java 比较多个值的算法,java,android,algorithm,Java,Android,Algorithm,在我的课堂上,我必须计算18个不同的建筑的价格,它们有不同的价格和收入。当建筑物数量增加时,它们的价格也会发生变化 例如:当数量为0时,建筑起价为40美元。每一个数量的价格增加4。因此,如果你拥有1栋,那么在40的状态下,购买下一栋同样的建筑的价格将是44。这就是计算价格的方法 public float getBuildingPrice(float quantity) { float buildingNum = quantity; float starti

在我的课堂上,我必须计算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。

你的问题是。这些问题没有简单的答案

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

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

用这种方法解决LP问题的C库是。有前端和前端


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

这是你的问题的一个公式,最终成为一个混合整数和非线性规划问题:

对于所有建筑类型
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
在每一步中,您都会以最大比率计算建筑,购买一栋建筑,扣除预算价格,然后重复执行,直到预算用尽为止。我没有证据证明你会得到一个最佳的我遵循这个算法

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


index_list是一个数组,包含每种类型建筑的编号

你真的应该使用
double
s而不是
float
s.@arshajii,或者更好的
BigDecimal
,来存储货币。对我来说,这听起来像是一个错误。有关Java库,请参阅。@tthVictor
double
的精度是
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