]> git.scottworley.com Git - planeteer/blobdiff - planeteer.go
Update for go v1
[planeteer] / planeteer.go
index cf68301949b891975e8d8b12a042bf153bc6d81f..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
@@ -241,9 +247,11 @@ type State struct {
 }
 
 const (
-       CELL_UNINITIALIZED = -2147483647 + iota
-       CELL_BEING_EVALUATED
-       CELL_RUBISH
+       FROM_ROOT = -2147483647 + iota
+       FROM_UNINITIALIZED
+       VALUE_UNINITIALIZED
+       VALUE_BEING_EVALUATED
+       VALUE_RUBISH
 )
 
 func EncodeIndex(dims, addr []int) int32 {
@@ -273,15 +281,20 @@ func DecodeIndex(dims []int, index int32) []int {
 func CreateStateTable(data planet_data, dims []int) []State {
        table := make([]State, StateTableSize(dims))
        for i := range table {
-               table[i].value = CELL_UNINITIALIZED
+               table[i].value = VALUE_UNINITIALIZED
+               table[i].from = FROM_UNINITIALIZED
        }
 
        addr := make([]int, NumDimensions)
        addr[Fuel] = *fuel
        addr[Edens] = *start_edens
        addr[Location] = data.p2i[*start]
-       addr[Traded] = 1
-       table[EncodeIndex(dims, addr)].value = int32(*funds)
+       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
 
        return table
 }
@@ -306,15 +319,15 @@ var cell_filled_count int
 
 func CellValue(data planet_data, dims []int, table []State, addr []int) int32 {
        my_index := EncodeIndex(dims, addr)
-       if table[my_index].value == CELL_BEING_EVALUATED {
+       if table[my_index].value == VALUE_BEING_EVALUATED {
                panic("Circular dependency")
        }
-       if table[my_index].value != CELL_UNINITIALIZED {
+       if table[my_index].value != VALUE_UNINITIALIZED {
                return table[my_index].value
        }
-       table[my_index].value = CELL_BEING_EVALUATED
+       table[my_index].value = VALUE_BEING_EVALUATED
 
-       best_value := int32(CELL_RUBISH)
+       best_value := int32(VALUE_RUBISH)
        best_source := make([]int, NumDimensions)
        other := make([]int, NumDimensions)
        copy(other, addr)
@@ -426,6 +439,7 @@ func CellValue(data planet_data, dims []int, table []State, addr []int) int32 {
                                }
                        }
                }
+               other[Traded] = addr[Traded]
        }
 
        /* Buy a Device of Cloaking */
@@ -504,7 +518,7 @@ func CellValue(data planet_data, dims []int, table []State, addr []int) int32 {
 
        // Sanity check: This cell was in state BEING_EVALUATED
        // the whole time that it was being evaluated.
-       if table[my_index].value != CELL_BEING_EVALUATED {
+       if table[my_index].value != VALUE_BEING_EVALUATED {
                panic(my_index)
        }
 
@@ -514,7 +528,7 @@ func CellValue(data planet_data, dims []int, table []State, addr []int) int32 {
 
        // UI: Progress bar
        cell_filled_count++
-       if cell_filled_count&0xff == 0 {
+       if cell_filled_count&0xfff == 0 {
                print(fmt.Sprintf("\r%3.1f%%", 100*float64(cell_filled_count)/float64(StateTableSize(dims))))
        }
 
@@ -532,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
@@ -565,7 +582,10 @@ func Commas(n int32) (s string) {
 }
 
 func DescribePath(data planet_data, dims []int, table []State, start int32) (description []string) {
-       for index := start; index > 0 && table[index].from > 0; index = table[index].from {
+       for index := start; table[index].from > FROM_ROOT; index = table[index].from {
+               if table[index].from == FROM_UNINITIALIZED {
+                       panic(index)
+               }
                var line string
                addr := DecodeIndex(dims, index)
                prev := DecodeIndex(dims, table[index].from)
@@ -647,6 +667,10 @@ func IndexCommodities(m *map[string]Commodity, start_at int) (map[string]int, []
 
 func main() {
        flag.Parse()
+       if *start == "" || *funds == 0 {
+               print("--start and --funds are required.  --help for more\n")
+               return
+       }
        if *cpuprofile != "" {
                f, err := os.Create(*cpuprofile)
                if err != nil {