You are trying to write a set of human understandable rules for a problem that a machine can do much better at. What you have designed is a set of heuristics for what is fundamentally a statistics problem. If you want to achieve true optimality, I recommend you start over entirely.
There are 9 rooms, 6 players, and 6 weapons. This means that there are only 324 different valid guesses (9 * 6 * 6) in general, and if you restrict this algorithm to a guess given the room you are in, you only have 36 options. While these are is too big for a human to evaluate in real-time, they are negligible to a computer. What you want to write is a set of scoring criteria for each of these card combinations, and then to pick the card combination that has the highest score as your guess (breaking ties at random).
In order to talk further about optimal, we need to get rigorous about this scoring mechanism. It sounds from your starting attempt like there are two things you care about:
Gaining as much information that you don't already know
Revealing as little information that you do already know to other players.
It's going to be quite complicated to handle both of these, so let's focus on just point 1 at first (as it's the more important of the two).
In order to gain information, you algorithm needs to have as input everything that you already know about where cards are. This is:
How many cards each player has
Which cards you know the locations of (including your own cards)
Which cards you know certain players do not hold
You then build a probability model of the location of each card (including the middle). Cards that you know the location of will have probability 100% associated with that location. Then, for an arbitrary guess, you model what the players will do with that guess, namely show you a card or pass to the next player. For this purpose, you probably want to assume the worst case, namely that if a player holds a card matching your guess that you already know the location of, that's the card you will be shown. With all of this, you can determine the probability that you will be shown a new card versus it will get back to you with no one showing you anything. You need to add in a bit of logic for figuring out what you learn if it gets back to you without anyone showing you anything.
But at the end of this, you have a probability of learning new information with a given guess. At this point you could throw in some weighting for different types of cards (I believe rooms to be more valuable pieces of information because you have to get to the room to guess it), but you don't have to. Compare this probability across each guess and take the one with the highest chance of telling you something new.
With such an algorithm, you could even run it on all 324 card combinations, look at the top 10 most valuable guesses, and from that determine the most valuable room to go to next (or maybe even add in some weighting for room distance).
At this point, you could now try to tackle part 2: giving away as little information as possible. What you probably want to do is subtract some amount from the score of each guess for how much information it gives away, but this gets complicated quite fast as to do it optimally requires modeling everything the other players know. You could just add a negative weight to any guess that would reveal a card you know to be in the envelope, but this would be a delicate thing to calibrate, and at this point we're back in the realm of heuristics rather than being able to talk about an "optimal" guess. My recommendation is to not include this in your first attempt at this algorithm.