score distribution of categorical values in rectangular 2D plane: is Moran's I my best bet? I need to distribute points of 3 different kinds in a rectangular 2D plane so that they are spread out as evenly as possible. That means, I want to avoid "gatherings" of points of the same kind in some areas of the rectangle. Ideally the points of each "family" cover the space as uniformly as possible. (Pardon, if "uniform" is not the correct term here.)
I do not need the closed-form optimal solution but I can use computational approximations/short-cuts to get something that is good enough.
For now, I am calculating random layouts of N locations (where N is the total number of points) which adhere to my other constraints (like minimal distance between two arbitrary points). Then I randomly assign the values of my 3 "families" to these locations. I would now like to score these layouts in terms of their distribution of the points in relation to their family affiliation, so that I can choose the one which gets the "best" (aka. least spatially autocorrelated) score. I am sure there are more elegant ways. But for my use case this would be good enough (better than breaking my head/schedule about the perfect solution).
However, I'm unsure what is an adequate scoring scheme. The most promising candidate that my research brought to daylight up to now is Global Moran's I. Do I read this correctly that it would apply to my scenario?
Also, the choice of the spatial weights seems essential. As in my case "neighborhood" is not defined in a binary fashion, I would probably choose the (inverse) distance (i.e., $d^{-1}$) between two points as the according weight. Does that make sense?
I'm very thankful for pointers in any way. Also, and especially, if my entire approach seems flawed. Thx!

Update:
As suggested by @whuber , I am adding some more context.
I want to create parallel versions of a cancellation task which is used to assess spatial attention and search behavior in 2D. Participants have to find target items among distractors and lures (i.e., itmes which look very similar to the targets). As this task is used to assess whether there are systematic spatial biases in the search behavior (e.g., whether one side, quadrant,... is systematically neglected) it is important that the targets and lures are spread out across the entire sheet without any obvious logic (which would make the search easier).
Here is an example of the original task (taken from the German instructions):

Red circles: targets
Blue circles: lures
Rest: distractors
One can see that items of the different categories are spread out fairly evenly across the entire plane. Unfortunately, the authors do not mention how they constructed this layout. I guess they might just have hand-crafted it to their needs.
This is not really an option for me, as I want to create multiple parallel versions which share the same core properties with different item positions.
So, yes, I guess my usage of some vocabulary was incorrect/misleading. I assume there is some spatial autocorrelation in the structure of the example above (as all targets have a fairly similar distance to the next targets; same for the lures). Therefore, optimizing for minimal autocorrelation is probably not the right way to go. However, optimizing for maximal uniformity will probably lead to (as @whuber mentioned in his comment) to a very regular (i.e., something like a hexagonal) structure, which might make the search too easy. Hm, so I am a bit at a loss which might be a good strategy. Still thankful for any hints what might be a useful direction to look into.

A couple options using R:
Maximum Projection
Using the MaxPro package, we can treat the placement as a maximum projection design of experiments problem. Below is example code for placing 900 objects (300 each of three different classes) in a unit square. For speed, I generate the placement for 225 objects each in the four quadrants separately and then combine them together. The initial points are random, so the four quadrants are distinct. When plotted, the result is similar to the image from the image the OP provided, without clusters of similar colors (or gaps).
library(MaxPro)

system.time(d1 <- do.call(
  rbind,
  lapply(
    as.data.frame(t(expand.grid(rep(list(c(0, 0.5)), 2)))),
    function(x) {
      d <- MaxProQQ(
        cbind(
          replicate(2, sample(seq(0, 1, length = 225))),
          rep(1:3, 75)
        ), 1
      )$Design
      d[,1] <- d[,1]/2 + x[1]
      d[,2] <- d[,2]/2 + x[2]
      d
    } 
  )
))
#>    user  system elapsed 
#>   46.17    0.02   46.24

plot(d[d[,3] == 1, 1:2], col = "red", yaxt = "n", xaxt = "n", ylab = "", xlab = "")
points(d[d[,3] == 2, 1:2], col = "blue")
points(d[d[,3] == 3, 1:2], col = "green")


Repelling Particles
Using the particles package in R, we can place the objects by simulating the movement of repelling particles. Below is example code for randomly placing three sets of 300 particles in a unit square then allowing the simulation to evolve for a short period of time in order to spread the particles out and avoid random clustering. It runs much faster than the maximum projection solution. When plotted, the result shows good dispersion among the particles, without clusters of similar colors (or gaps).
library(particles)
library(tidygraph)

fSpread <- function(p) {
  n <- nrow(p)
  evolve(
    impose(
      wield(
        simulate(
          create_empty(n),
          setup = function(particles, ...) list(position = p, velocity = p*0)
        ), collision_force, strength = 1, radius = 0.5/sqrt(n)
      ), infinity_constraint, xlim = c(0, 1), ylim = c(0, 1)
    ), 100
  )$position
}

system.time(
  d <- cbind(
    fSpread(
      matrix(replicate(3, t(fSpread(matrix(runif(600), 300, 2)))), 900, 2, 1)
    ),
    rep(1:3, each = 300)
  )
)
#>    user  system elapsed 
#>    0.99    0.06    1.05

plot(d[d[,3] == 1, 1:2], col = "red", yaxt = "n", xaxt = "n", ylab = "", xlab = "")
points(d[d[,3] == 2, 1:2], col = "blue")
points(d[d[,3] == 3, 1:2], col = "green")


