import "flag"
import "fmt"
-import "json"
+import "encoding/json"
import "os"
import "runtime/pprof"
import "strings"
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?")
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
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
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
// 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))))
}
return table[my_index].value
}
-func FindBestState(data planet_data, dims []int, table []State) int32 {
+func FinalState(dims []int) []int {
addr := make([]int, NumDimensions)
addr[Edens] = *end_edens
addr[Cloaks] = dims[Cloaks] - 1
addr[Traded] = 1
addr[Hold] = 0
addr[UnusedCargo] = 0
+ // Fuel and Location are determined by FindBestState
+ return addr
+}
+
+func FindBestState(data planet_data, dims []int, table []State, addr []int) int32 {
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
data.c2i, data.i2c = IndexCommodities(&data.Commodities, 1)
dims := DimensionSizes(data)
table := CreateStateTable(data, dims)
- best := FindBestState(data, dims, table)
+ final_state := FinalState(dims)
+ best := FindBestState(data, dims, table, final_state)
print("\n")
if best == -1 {
print("Cannot acheive success criteria\n")
- } else {
- description := DescribePath(data, dims, table, best)
- for i := len(description) - 1; i >= 0; i-- {
- fmt.Println(description[i])
- }
+ return
+ }
+ description := DescribePath(data, dims, table, best)
+ for i := len(description) - 1; i >= 0; i-- {
+ fmt.Println(description[i])
+ }
+
+ // Calculate total cost of fighters and shields
+ if *drones > 0 || *batteries > 0 {
+ fmt.Println()
+ }
+ if *drones > 0 {
+ final_state[BuyFighters] = 0
+ alt_best := FindBestState(data, dims, table, final_state)
+ cost := table[alt_best].value - table[best].value
+ fmt.Println("Drones were", float64(cost)/float64(*drones), "each")
+ final_state[BuyFighters] = 1
+ }
+ if *batteries > 0 {
+ final_state[BuyShields] = 0
+ alt_best := FindBestState(data, dims, table, final_state)
+ cost := table[alt_best].value - table[best].value
+ fmt.Println("Batteries were", float64(cost)/float64(*batteries), "each")
+ final_state[BuyShields] = 1
+ }
+
+ // Use extra eden warps
+ if *end_edens > 0 {
+ fmt.Println()
+ }
+ for extra_edens := 1; extra_edens <= *end_edens; extra_edens++ {
+ final_state[Edens] = *end_edens - extra_edens
+ alt_best := FindBestState(data, dims, table, final_state)
+ extra_funds := table[alt_best].value - table[best].value
+ fmt.Println("\rUse", extra_edens, "extra edens, make an extra",
+ Commas(extra_funds), "(",
+ Commas(extra_funds/int32(extra_edens)), "per eden)")
}
}