How many satellites would be required for Solar System GPS?
Let's try six, along the lines of @szulat's comment but a few more.
The question says we can ignore planetary shadows for the purposes of this question, so ignoring the need for redundancy for now, let's put six in circular polar heliocentric orbits at say 6 AU and never mind the cost, in two planes at right angles, phased in some reasonable way.
Instead of transmitting at circa 1 GHz, let's use 375,000 GHz by using 800 nm lasers and photodetectors coupled to 30 cm diameter telescopes.
Doing a link budget calculation along the lines of this answer we see that at 800 nm, the gain $G$ of a 30 cm "dish" or telescope is 121.4 dB. With a 1 watt average power laser (it would be pulsed of course) and a distance of 10 AU, the received optical power between two points can be calculated as follows:
$$ P_{RX} = P_{TX} + G_{TX} - L_{FS} + G_{RX} $$
- $P_{RX}$: Received Power
- $P_{TX}$: Transmitted Power
- $G_{TX}$: Gain of Transmitting antenna (compared to isotropic)
- $L_{FS}$: "Free space Loss", what we usually call $1/r^2$ (but also has $R^2 / \lambda^2$) because receive gain is relative to isotropic)
- $G_{RX}$: Gain of Earth's Receiving antenna (compared to isotropic)
$$L_{FS} = 20 \times \log_{10}\left( 4 \pi \frac{R}{\lambda} \right)$$
$$G_{Dish} \sim 20 \times \log_{10}\left( \frac{\pi d}{\lambda} \right)$$
So:
$$ P_{RX} = 0 + 121.4 - 387.4 + 121.4 = -144.6 \ \text{dBw}$$
dBw is like dBm but using watts instead of milliwatts. That's a received power of 3.5E-15 Watts, which is over 10,000 photons per second. Assuming they are pulsed and you can average for a while, you should be able to determine distances quite accurately.
Yes, everything is moving at km per second, but once ephemerides (pronounciation) are established you can calculate trajectories precisely even though you are building up data with tens of meters precision over tens or hundreds of kilometers.
X-ray pulsars and atomic clocks
This kind of calculation on jittery, noisy, low-statistics data has already been done using X-ray pulses from pulsars instead of light pulses from spacecraft as outlined in the question Is NICER/SEXTANT the first civilian “spacecraft” to determine it's own position in space without GPS or uplinked data?.
As oulined in Where would one deploy deep space atomic clocks? and in How does an onboard atomic clock help interplanetary navigation? atomic clocks in deep-space spacedraft is on its way. We know that optical communications using modest telescopes is as well, so building these "interplanetary GPS satellites" should be straightforward.
Optical pulses from a few interplanetary spacecraft in well characterized heliocentric orbits may complement this technique by adding triangulation capability, and it could potentially compete with absolute navigation using NICER/SEXTANT absolute navigation using only pulsars and no Earth stations or "interplanetary gps satellites.
Telescope operation and scheduling
I suppose each navigation satellite could have dozens of telescopes, but because these deep space orbits can be well characterized over time and ephemerides built up, with good math they don't really need to be in constant communication with each other, and unless your spacecraft is in a critical near-planet enounter, you don't need to receive signals from all of them at the same time. So you would probably have to run some kind of scheduling service so that your interplanetary spacecraft can have signals from the six navigation satellites sent to it in rapid succession. Your spacecraft would require a good optical commuications telescope and a correspondingly active and agile attitude control system to pick up your signals when they are scheduled to arive.
Here's an illustration of a possible minimal 6 satellite 6 AU configuration, with Mercury through Saturn shown as well, and the Python 3 script that made it.
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
halfpi, pi, twopi = [f*np.pi for f in (0.5, 1, 2)]
semis = np.array((0.387, 0.723, 1.0, 1.523, 5.204, 9.583))
args = twopi * (np.linspace(0, 1, 301) + np.random.random(len(semis))[:, None])
funcs = (np.cos, np.sin, np.zeros_like)
planets = np.stack([f(args) for f in funcs], axis=1)*semis[:, None, None]
semis = 6*np.ones(3)
args1 = twopi * (np.linspace(0, 1, 301) + 0.05 + np.arange(3)[:, None]/3.)
args2 = twopi * (np.linspace(0, 1, 301) + 0.05 + np.arange(3)[:, None]/3. + 1/6.)
funcs1 = (np.cos, np.zeros_like, np.sin)
funcs2 = (np.zeros_like, np.cos, np.sin)
navsats1 = np.stack([f(args1) for f in funcs1], axis=1)*semis[:, None, None]
navsats2 = np.stack([f(args2) for f in funcs2], axis=1)*semis[:, None, None]
navsats = np.vstack((navsats1, navsats2))
if True:
fig = plt.figure()
fig.patch.set_facecolor('xkcd:mint green') # https://stackoverflow.com/q/14088687/3904031
plt.subplots_adjust(top=0.95, bottom=0.05, left=0.05, right=0.95, hspace=0.2, wspace=0.2)
plt.rcParams['axes.facecolor'] = 'black' # https://stackoverflow.com/a/40371037/3904031
ax = fig.add_subplot(1, 1, 1, projection='3d')
for (x, y, z) in planets:
ax.plot(x, y, z)
ax.plot(x[:1], y[:1], z[:1], 'o')
for (x, y, z) in navsats:
ax.plot(x, y, z, '-c')
ax.plot(x[:1], y[:1], z[:1], 'or')
plt.show()