| 145 | } |
| 146 | |
| 147 | func (model *Model) runWorkers(t ShapeType, a, n, age, m int) *State { |
| 148 | wn := len(model.Workers) |
| 149 | ch := make(chan *State, wn) |
| 150 | wm := m / wn |
| 151 | if m%wn != 0 { |
| 152 | wm++ |
| 153 | } |
| 154 | for i := 0; i < wn; i++ { |
| 155 | worker := model.Workers[i] |
| 156 | worker.Init(model.Current, model.Score) |
| 157 | go model.runWorker(worker, t, a, n, age, wm, ch) |
| 158 | } |
| 159 | var bestEnergy float64 |
| 160 | var bestState *State |
| 161 | for i := 0; i < wn; i++ { |
| 162 | state := <-ch |
| 163 | energy := state.Energy() |
| 164 | if i == 0 || energy < bestEnergy { |
| 165 | bestEnergy = energy |
| 166 | bestState = state |
| 167 | } |
| 168 | } |
| 169 | return bestState |
| 170 | } |
| 171 | |
| 172 | func (model *Model) runWorker(worker *Worker, t ShapeType, a, n, age, m int, ch chan *State) { |
| 173 | ch <- worker.BestHillClimbState(t, a, n, age, m) |