]> git.scottworley.com Git - planeteer/blobdiff - planeteer.go
Fix test: Add trading dimension.
[planeteer] / planeteer.go
index 72f9935f453ea205f3534e2a81a5c1daa8fc4867..932f889401215321578236b5d34f2a09453fbd36 100644 (file)
@@ -19,7 +19,7 @@ package main
 
 import "flag"
 import "fmt"
-import "json"
+import "encoding/json"
 import "os"
 import "runtime/pprof"
 import "strings"
@@ -43,6 +43,8 @@ var fuel = flag.Int("fuel", 16, "Hyper Jump power left")
 
 var hold = flag.Int("hold", 300, "Size of your cargo hold")
 
+var start_hold = flag.String("start_hold", "", "Start with a hold full of cargo")
+
 var start_edens = flag.Int("start_edens", 0,
        "How many Eden Warp Units are you starting with?")
 
@@ -63,6 +65,9 @@ var battery_price = flag.Int("battery_price", 0, "Today's Shield Battery price")
 var visit_string = flag.String("visit", "",
        "A comma-separated list of planets to make sure to visit")
 
+var tomorrow_weight = flag.Float64("tomorrow_weight", 1.0,
+       "Weight for the expected value of tomorrow's trading.  0.0 - 1.0")
+
 var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
 
 var visit_cache []string
@@ -111,8 +116,9 @@ type Commodity struct {
        Limit     int
 }
 type Planet struct {
-       BeaconOn bool
-       Private  bool
+       BeaconOn      bool
+       Private       bool
+       TomorrowValue int
        /* Use relative prices rather than absolute prices because you
           can get relative prices without traveling to each planet. */
        RelativePrices map[string]int
@@ -283,7 +289,9 @@ func CreateStateTable(data planet_data, dims []int) []State {
        addr[Fuel] = *fuel
        addr[Edens] = *start_edens
        addr[Location] = data.p2i[*start]
-       addr[Traded] = 1
+       if *start_hold != "" {
+               addr[Hold] = data.c2i[*start_hold]
+       }
        start_index := EncodeIndex(dims, addr)
        table[start_index].value = int32(*funds)
        table[start_index].from = FROM_ROOT
@@ -538,16 +546,19 @@ func FindBestState(data planet_data, dims []int, table []State) int32 {
        addr[Hold] = 0
        addr[UnusedCargo] = 0
        max_index := int32(-1)
-       max_value := int32(0)
+       max_value := 0.0
        max_fuel := 1
        if *fuel == 0 {
                max_fuel = 0
        }
        for addr[Fuel] = 0; addr[Fuel] <= max_fuel; addr[Fuel]++ {
                for addr[Location] = 0; addr[Location] < dims[Location]; addr[Location]++ {
-                       if len(end()) == 0 || end()[data.i2p[addr[Location]]] {
+                       planet := data.i2p[addr[Location]]
+                       if len(end()) == 0 || end()[planet] {
                                index := EncodeIndex(dims, addr)
-                               value := CellValue(data, dims, table, addr)
+                               today_value := CellValue(data, dims, table, addr)
+                               tomorrow_value := *tomorrow_weight * float64(*hold+data.Planets[planet].TomorrowValue)
+                               value := float64(today_value) + tomorrow_value
                                if value > max_value {
                                        max_value = value
                                        max_index = index