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
}
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 {
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
}
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)
}
}
}
+ other[Traded] = addr[Traded]
}
/* Buy a Device of Cloaking */
// 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)
}
// 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))))
}
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
}
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)
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 {