2013-08-09 2 views
0

В моем классе я должен рассчитать цены 18 разных зданий, которые имеют разные цены и доход. Они также имеют изменения в цене, когда увеличивается количество денег в здании.Алгоритм для сравнения нескольких значений

Например: Здание начинается от 40 долларов, когда количество равно 0. Цена увеличивается на 4 для каждого количества. Так что, если у вас есть 1, цена на покупку следующего здания будет равна 44 в состоянии 40. Так что это метод, который рассчитает цену просто отлично.

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 значений) с дополнительное условие, чтобы сохранить в бюджете.

Например

Farm

  • доход - 1
  • 5 зданий
  • Приращение 4
  • Цена 40 + (5 * 4) = 60 Цена над доходами = 60

Ручка

  • Доход - 5
  • 4 зданий
  • Приращение 20
  • Цена 200 + (4 * 20) = 280 Цена над доходами 280/5 = 56

Так что означает сказать, что следующее здание, которое должен купить пользователь, - это перо, потому что оно имеет более низкую цену/доход. Есть также шансы, что цена над доходом обоих зданий будет такой же, как если бы здание достигло 5 для строительства пера, и цена над доходом ручки и фермы составит 60.

+2

Вы действительно должны использовать 'double's вместо' float's. – arshajii

+2

@arshajii Или даже лучше '' BigDecimal'', для хранения валют. – wassup

+3

Звучит как [проблема линейной оптимизации] (https://en.wikipedia.org/wiki/Linear_programming) для меня. См. Http://stackoverflow.com/questions/260442/linear-programming-tool-libraries-for-java для библиотек Java. –

ответ

0

Ваша проблема linear programming problem. У таких проблем нет легких ответов.

Для решения таких проблем люди изобрели множество интеллектуальных алгоритмов, таких как Simplex Algorithm.

Эти алогригмы работают над представлением проблемы, которая в основном представляет собой набор математических линейных уравнений. Вы должны серьезно подумать о своей проблеме и сформулировать эти уравнения.

Библиотека C для решения проблемы с LP, созданная таким образом, является GLPK (GNU Linear Programming Kit). Имеются интерфейсы for Python и for Java.

Ваш вопрос не является проблемой программирования.Это математическая проблема, которая может быть решена на любом языке. Дайте достаточно времени, его можно даже решить на бумаге.

2

Это формулировка вашей проблемы, которая заканчивается неоднозначное целым и не связанные задачи линейного программирования:

Для всех типов зданий i давайте определим:

  • Pi: цена типа здания i
  • Ci: Приращивание цен на здание типа i
  • Mi: доход для строительства тип i
  • B: Бюджет
  • Ni: Число зданий типа 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, C, Ми и В являются константами. Решение переменных 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 представляет собой массив, содержащего количество каждого типа здания

+0

Я не знаю о линейном программировании. Как мне это сделать? – thhVictor

+0

Как вы сказали, это нелинейно. В вашем последнем абзаце все еще указывается линейность. –

+0

@G. Бах я изначально считал, что он линейный, но после формулировки я обнаружил, что это была смешанная целочисленная нелинейная проблема. Спасибо за указание на это. – Tarik

Смежные вопросы