+/* What is the value of hauling 'commodity' from 'from' to 'to'?
+ * Take into account the available funds and the available cargo space. */
+func TradeValue(data planet_data,
+ from, to *Planet,
+ commodity string,
+ initial_funds, max_quantity int) int {
+ if !data.Commodities[commodity].CanSell {
+ return 0
+ }
+ from_relative_price, from_available := from.RelativePrices[commodity]
+ if !from_available {
+ return 0
+ }
+ to_relative_price, to_available := to.RelativePrices[commodity]
+ if !to_available {
+ return 0
+ }
+
+ base_price := data.Commodities[commodity].BasePrice
+ from_absolute_price := from_relative_price * base_price
+ to_absolute_price := to_relative_price * base_price
+ buy_price := from_absolute_price
+ sell_price := int(float64(to_absolute_price) * 0.9)
+ var can_afford int = initial_funds / buy_price
+ quantity := can_afford
+ if quantity > max_quantity {
+ quantity = max_quantity
+ }
+ return (sell_price - buy_price) * max_quantity
+}
+
+func FindBestTrades(data planet_data) [][]string {
+ best := make([][]string, len(data.Planets))
+ for from_index, from_planet := range data.Planets {
+ best[from_index] = make([]string, len(data.Planets))
+ for to_index, to_planet := range data.Planets {
+ best_gain := 0
+ price_list := from_planet.RelativePrices
+ if len(to_planet.RelativePrices) < len(from_planet.RelativePrices) {
+ price_list = to_planet.RelativePrices
+ }
+ for commodity := range price_list {
+ gain := TradeValue(data,
+ &from_planet,
+ &to_planet,
+ commodity,
+ 10000000,
+ 1)
+ if gain > best_gain {
+ best[from_index][to_index] = commodity
+ gain = best_gain
+ }
+ }
+ }
+ }
+ return best
+}
+