diff --git a/src/lte/helper/lena-helper.cc b/src/lte/helper/lena-helper.cc index 11a5f4a23..8b77cc8a5 100644 --- a/src/lte/helper/lena-helper.cc +++ b/src/lte/helper/lena-helper.cc @@ -69,11 +69,13 @@ LenaHelper::DoStart (void) //Ptr ulPropagationModel = m_propagationModelFactory.Create (); //m_downlinkChannel->AddSpectrumPropagationLossModel (dlPropagationModel); //m_uplinkChannel->AddSpectrumPropagationLossModel (ulPropagationModel); - m_downlinkPropagationLossModel = CreateObject (); + //m_downlinkPropagationLossModel = CreateObject (); + m_downlinkPropagationLossModel = m_dlPropagationModelFactory.Create (); m_downlinkPropagationLossModel->SetAttribute ("Frequency", DoubleValue (2.1140e9)); // E_UTRA BAND #1 see table 5.5-1 of 36.101 m_downlinkPropagationLossModel->SetAttribute ("Lambda", DoubleValue (300000000.0 /2.1140e9)); // E_UTRA BAND #1 see table 5.5-1 of 36.101 - m_uplinkPropagationLossModel = CreateObject (); - m_uplinkPropagationLossModel = CreateObject (); + //m_uplinkPropagationLossModel = CreateObject (); + m_uplinkPropagationLossModel = m_ulPropagationModelFactory.Create (); + m_uplinkPropagationLossModel->SetAttribute ("Frequency", DoubleValue (1.950e9)); // E_UTRA BAND #1 see table 5.5-1 of 36.101 m_downlinkPropagationLossModel->SetAttribute ("Lambda", DoubleValue (300000000.0 /1.950e9)); // E_UTRA BAND #1 see table 5.5-1 of 36.101 m_downlinkChannel->AddPropagationLossModel (m_downlinkPropagationLossModel); @@ -139,15 +141,18 @@ void LenaHelper::SetPropagationModelType (std::string type) { NS_LOG_FUNCTION (this << type); - m_propagationModelFactory = ObjectFactory (); - m_propagationModelFactory.SetTypeId (type); + m_dlPropagationModelFactory = ObjectFactory (); + m_dlPropagationModelFactory.SetTypeId (type); + m_ulPropagationModelFactory = ObjectFactory (); + m_ulPropagationModelFactory.SetTypeId (type); } void LenaHelper::SetPropagationModelAttribute (std::string n, const AttributeValue &v) { NS_LOG_FUNCTION (this << n); - m_propagationModelFactory.Set (n, v); + m_dlPropagationModelFactory.Set (n, v); + m_ulPropagationModelFactory.Set (n, v); } diff --git a/src/lte/helper/lena-helper.h b/src/lte/helper/lena-helper.h index 8087483e7..b1df021d6 100644 --- a/src/lte/helper/lena-helper.h +++ b/src/lte/helper/lena-helper.h @@ -55,6 +55,7 @@ public: static TypeId GetTypeId (void); virtual void DoDispose (void); + /** * \todo to be implemented * @@ -203,6 +204,9 @@ private: ObjectFactory m_schedulerFactory; ObjectFactory m_propagationModelFactory; + + ObjectFactory m_dlPropagationModelFactory; + ObjectFactory m_ulPropagationModelFactory; Ptr m_macStats; Ptr m_rlcStats; diff --git a/src/lte/test/lte-test-pathloss-model.cc b/src/lte/test/lte-test-pathloss-model.cc index a5897159f..e7a3916b7 100644 --- a/src/lte/test/lte-test-pathloss-model.cc +++ b/src/lte/test/lte-test-pathloss-model.cc @@ -65,6 +65,8 @@ LtePathlossModelTestSuite::LtePathlossModelTestSuite () Ptr lena = CreateObject (); + lena->SetAttribute ("PropagationModel", StringValue ("ns3::BuildingsPropagationLossModel")); + // Create Nodes: eNodeB and UE NodeContainer enbNodes; NodeContainer ueNodes; @@ -78,6 +80,7 @@ LtePathlossModelTestSuite::LtePathlossModelTestSuite () mobility.SetMobilityModel ("ns3::BuildingsMobilityModel"); mobility.Install (ueNodes); + NetDeviceContainer enbDevs; NetDeviceContainer ueDevs; enbDevs = lena->InstallEnbDevice (enbNodes); @@ -85,20 +88,32 @@ LtePathlossModelTestSuite::LtePathlossModelTestSuite () lena->Attach (ueDevs, enbDevs.Get (0)); + double distance = 250; + double hm = 1; + double hb = 30; +// double hr = 20; Ptr mm1 = enbNodes.Get (0)->GetObject (); - mm1->SetPosition (Vector (0.0, 0.0, 1.0)); + mm1->SetPosition (Vector (0.0, 0.0, hb)); + Ptr building1 = Create (0.0, 10.0, 0.0, 10.0, 0.0, 20.0/*, 1, 1, 1*/); - mm1->SetIndoor (building1); + //mm1->SetIndoor (building1); + mm1->SetOutdoor (); Ptr mm2 = ueNodes.Get (0)->GetObject (); - mm2->SetPosition (Vector (1010.0, 0.0, 1.0)); + mm2->SetPosition (Vector (distance, 0.0, hm)); Ptr building = Create (0.0, 10.0, 0.0, 10.0, 0.0, 20.0/*, 1, 1, 1*/); mm2->SetOutdoor (); - mm2->SetIndoor (building1); - mm2->SetFloorNumber (2); + //mm2->SetIndoor (building1); + //mm2->SetFloorNumber (2); double thrLoss = 0.0; - AddTestCase (new LtePathlossModelTestCase (mm1, mm2, thrLoss, "loss = ??")); + AddTestCase (new LtePathlossModelTestCase (mm1, mm2, thrLoss, "loss_COST231_large_cities_urban = ??")); + + + + + + /** * TX signal #2: Power Spectral Density (W/Hz) of the signal of interest = [-63 -61] dBm and BW = [20 22] MHz @@ -175,11 +190,15 @@ LtePathlossModelTestCase::DoRun (void) Ptr m_downlinkChannel = CreateObject (); Ptr m_uplinkChannel = CreateObject (); Ptr m_downlinkPropagationLossModel = CreateObject (); - m_downlinkPropagationLossModel->SetAttribute ("Frequency", DoubleValue (2.1140e9)); // E_UTRA BAND #1 see table 5.5-1 of 36.101 - m_downlinkPropagationLossModel->SetAttribute ("Lambda", DoubleValue (300000000.0 /2.1140e9)); // E_UTRA BAND #1 see table 5.5-1 of 36.101 + double freq = 2.1140e9; // E_UTRA BAND #1 see table 5.5-1 of 36.101 + //double freq = 869e6; // E_UTRA BAND #5 see table 5.5-1 of 36.101 + //double freq = 2.620e9; // E_UTRA BAND #7 see table 5.5-1 of 36.101 + m_downlinkPropagationLossModel->SetAttribute ("Frequency", DoubleValue (freq)); // E_UTRA BAND #1 see table 5.5-1 of 36.101 + m_downlinkPropagationLossModel->SetAttribute ("Lambda", DoubleValue (300000000.0 /freq)); // E_UTRA BAND #1 see table 5.5-1 of 36.101 + Ptr m_uplinkPropagationLossModel = CreateObject (); m_uplinkPropagationLossModel->SetAttribute ("Frequency", DoubleValue (1.950e9)); // E_UTRA BAND #1 see table 5.5-1 of 36.101 - m_downlinkPropagationLossModel->SetAttribute ("Lambda", DoubleValue (300000000.0 /1.950e9)); // E_UTRA BAND #1 see table 5.5-1 of 36.101 + m_uplinkPropagationLossModel->SetAttribute ("Lambda", DoubleValue (300000000.0 /1.950e9)); // E_UTRA BAND #1 see table 5.5-1 of 36.101 m_downlinkChannel->AddPropagationLossModel (m_downlinkPropagationLossModel); m_uplinkChannel->AddPropagationLossModel (m_uplinkPropagationLossModel); @@ -188,7 +207,6 @@ LtePathlossModelTestCase::DoRun (void) Simulator::Stop (Seconds (0.1)); Simulator::Run (); Simulator::Destroy (); - double loss = m_downlinkPropagationLossModel->GetLoss (m_node1, m_node2); NS_LOG_INFO ("Calculated loss: " << loss); diff --git a/src/lte/test/reference/loss_COST231_small_cities_urban.m b/src/lte/test/reference/loss_COST231_small_cities_urban.m index e6907e628..47052e984 100644 --- a/src/lte/test/reference/loss_COST231_small_cities_urban.m +++ b/src/lte/test/reference/loss_COST231_small_cities_urban.m @@ -9,7 +9,7 @@ function g = loss_COST231_small_cities_urban(d, hb, hm, f) assert(isscalar(f)); assert(f > 0); - Fhm = (1.1*log10(f)) -(0.7*hm) -(1.56*log(f)) -0.8; + Fhm = (1.1*log10(f)) -(0.7*hm) -(1.56*log10(f) -0.8); C = 0; g = zeros(size(d)); g(find(d > 0)) = 46.3 + (33.9*log10(f)) - (13.82*log10(hb)) + (44.9-(6.55*log10(hb))).*log10(d) - Fhm + C; diff --git a/src/lte/test/reference/loss_ITU1411_NLOS_over_rooftop.m b/src/lte/test/reference/loss_ITU1411_NLOS_over_rooftop.m index b578d9d44..182f23924 100644 --- a/src/lte/test/reference/loss_ITU1411_NLOS_over_rooftop.m +++ b/src/lte/test/reference/loss_ITU1411_NLOS_over_rooftop.m @@ -11,19 +11,26 @@ function g = loss_ITU1411_NLOS_over_rooftop (d, hb, hm, hr, f, l, b, st_w, phi, lambda = 300000000.0 / f; - + fmhz = f/1e6; Dhb = hb - hr; - ds = (lambda.*(d).^2)/Dhb^2; - + ds = (lambda*d*d)/(Dhb*Dhb); if (l>ds) - if (big==1) - kf = 1.5*((f/925)-1); + if (fmhz>2000) + kf = -8; else - kf = 0.7*((f/925)-1); + if (big==1) + kf = -4+1.5*((fmhz/925)-1); + else + kf = -4+0.7*((fmhz/925)-1); + endif endif if (hb>hr) kd = 18; - ka = 54; + if (fmhz>2000) + ka = 71.4; + else + ka = 54; + endif Lbsh = -18*log10(1+Dhb); else kd = 18 - 15*(Dhb/hr); @@ -34,19 +41,18 @@ function g = loss_ITU1411_NLOS_over_rooftop (d, hb, hm, hr, f, l, b, st_w, phi, ka = 54-1.6*Dhb; endif endif - Lmsd = Lbsh + ka + kd.*log10(d./1000) + kf*log10(f) - 9*log10(b); + Lmsd = Lbsh + ka + kd.*log10(d./1000) + kf*log10(fmhz) - 9*log10(b); else theta = atan (Dhb /b); rho = sqrt(Dhb^2 + b^2); if (hb-hr<1) Qm = b./d; elseif (hb>hr) - Qm = 2.35*((dhb./d)*sqrt(b/lamda))^0.9; + Qm = 2.35*((Dhb./d)*sqrt(b/lambda))^0.9; else Qm = (b/2*pi.*d)*sqrt(lambda/rho)*((1/theta)-(1/(2*pi+theta))); endif - - Lmsd = -10*log(Qm^2); + Lmsd = -10*log10(Qm*Qm); endif Dhm = hr-hm; if (phi<35) @@ -56,12 +62,9 @@ function g = loss_ITU1411_NLOS_over_rooftop (d, hb, hm, hr, f, l, b, st_w, phi, else Lori = 4- 0.114*(phi-55); endif + Lrts = -8.2 -10*log10(st_w) + 10*log10(fmhz) + 20*log10(Dhm) + Lori; - Lrts = -8.2 -10*log10(st_w) + 10*log10(f) + 20*log10(Dhm) + Lori; - - Lbf = 32.4 +20*log10(d/1000) + 20*log10(f); - - + Lbf = 32.4 +20*log10(d/1000) + 20*log10(fmhz); g = zeros(size(d)); if (Lrts+Lmsd>0) L = Lbf + Lrts + Lmsd; diff --git a/src/lte/test/reference/loss_OH_large_cities_urban.m b/src/lte/test/reference/loss_OH_large_cities_urban.m index 84c76f726..e5f28386c 100644 --- a/src/lte/test/reference/loss_OH_large_cities_urban.m +++ b/src/lte/test/reference/loss_OH_large_cities_urban.m @@ -14,7 +14,6 @@ function g = loss_OH_large_cities_urban(d, hb, hm, f) else Ch = 3.2*(log10(11.75*hm))^2-4.97; endif - g = zeros(size(d)); g(find(d > 0)) = 69.55 + (26.16*log10(f)) - (13.82*log10(hb)) + (44.9-(6.55*log10(hb))).*log10(d) - Ch; diff --git a/src/lte/test/reference/lte_pathloss.m b/src/lte/test/reference/lte_pathloss.m index 5e85561c5..b8e150724 100644 --- a/src/lte/test/reference/lte_pathloss.m +++ b/src/lte/test/reference/lte_pathloss.m @@ -4,8 +4,11 @@ close all; %% LTE pathloss model %% ITU1411, ITU1238, COST231, OH, etc. -f = 2160e6; % carrier freq Hz, EARFCN = 500 (downlink) -d = 100; +f = 2114e6; % carrier freq Hz, EARFCN = 500 (downlink) +%f = 1900e6; % carrier freq Hz, EARFCN = 500 (downlink) +%f = 869e6; +%f = 2620e6; +d = 250; hb = 30; hm = 1; hr = 20; @@ -49,7 +52,9 @@ alpha = 0.5; g = loss_ITU1411_NLOS_street_canyons (d, f, w1, w2, x1, x2, alpha); disp ("The value of ITU1411 in NLOS within street canyons is:"), disp (g) -g = loss_ITU1238 (d, hb, hm, f); +n_floors = 2; +built_t = 1; +g = loss_ITU1238 (d, f, n_floors, built_t); disp ("The value of ITU1238 is:"), disp (g) diff --git a/src/propagation/model/buildings-propagation-loss-model.cc b/src/propagation/model/buildings-propagation-loss-model.cc index 32ac2009e..720885180 100644 --- a/src/propagation/model/buildings-propagation-loss-model.cc +++ b/src/propagation/model/buildings-propagation-loss-model.cc @@ -45,20 +45,20 @@ BuildingsPropagationLossModel::GetTypeId (void) .AddConstructor () .AddAttribute ("Lambda", - "The wavelength (default is 2.3 GHz at 300 000 km/s).", - DoubleValue (300000000.0 / 2.3e9), + "The wavelength (default is 2.106 GHz at 300 000 km/s).", + DoubleValue (300000000.0 / 2160e6), MakeDoubleAccessor (&BuildingsPropagationLossModel::m_lambda), MakeDoubleChecker ()) .AddAttribute ("Frequency", - "The Frequency (default is 2.3 GHz).", - DoubleValue (2.3e9), + "The Frequency (default is 2.106 GHz).", + DoubleValue (2160e6), MakeDoubleAccessor (&BuildingsPropagationLossModel::m_frequency), MakeDoubleChecker ()) .AddAttribute ("RooftopLevel", " The height of the rooftop [m].", - DoubleValue (30.0), + DoubleValue (20.0), MakeDoubleAccessor (&BuildingsPropagationLossModel::m_rooftopHeight), MakeDoubleChecker ()) @@ -80,7 +80,11 @@ BuildingsPropagationLossModel::GetTypeId (void) BuildingsPropagationLossModel::BuildingsPropagationLossModel () : C (0), m_environment (Urban), - m_citySize (Large) + m_citySize (Large), + m_streetsOrientation (45.0), + m_streetsWidth (20.0), + m_buildingsExtend (80.0), + m_buildingSeparation (50.0) { NS_LOG_INFO (this << " BuildingsPropagationLossModel"); } @@ -121,12 +125,26 @@ BuildingsPropagationLossModel::SetEnvironment (Environment env) { m_environment = env; } + BuildingsPropagationLossModel::Environment BuildingsPropagationLossModel::GetEnvironment (void) const { return m_environment; } +void +BuildingsPropagationLossModel::SetCitySize (CitySize size) +{ + m_citySize = size; +} + +BuildingsPropagationLossModel::CitySize +BuildingsPropagationLossModel::GetCitySize (void) const +{ + return m_citySize; +} + + double BuildingsPropagationLossModel::OkumuraHata (Ptr a, Ptr b) const @@ -137,29 +155,32 @@ BuildingsPropagationLossModel::OkumuraHata (Ptr a, PtrGetPosition ().z); + double hb = (a->GetPosition ().z>b->GetPosition ().z ? a->GetPosition ().z : b->GetPosition ().z); + double hm = (a->GetPosition ().z< b->GetPosition ().z ? a->GetPosition ().z : b->GetPosition ().z); + double log_aHeight = 13.82 * log10 (hb); double log_bHeight = 0.0; if (m_citySize == Large) { if (m_frequency<200) { - log_bHeight = 8.29 * pow (log10 (1.54 * b->GetPosition ().z), 2) - 1.1; + log_bHeight = 8.29 * pow (log10 (1.54 * hm), 2) - 1.1; } else { - log_bHeight = 3.2 * pow (log10 (11.75 * b->GetPosition ().z), 2) - 4.97; + log_bHeight = 3.2 * pow (log10 (11.75 * hm), 2) - 4.97; } } else { - log_bHeight = 0.8 + (1.1*log10(m_frequency) - 0.7)*b->GetPosition ().z - 1.56*log10(m_frequency); + log_bHeight = 0.8 + (1.1*log_f - 0.7)*hm - 1.56*log_f; } - - loss = 69.55 + (26.16 * log_f) - log_aHeight + (((44.9 - (6.55 * log_f) ))*log10 (a->GetDistanceFrom (b))) - log_bHeight; + + //NS_LOG_INFO (this << " logf " << 26.16 * log_f << " loga " << log_aHeight << " X " << (((44.9 - (6.55 * log10(hb)) ))*log10 (a->GetDistanceFrom (b))) << " logb " << log_bHeight); + loss = 69.55 + (26.16 * log_f) - log_aHeight + (((44.9 - (6.55 * log10(hb)) ))*log10 (a->GetDistanceFrom (b))) - log_bHeight; if (m_environment == SubUrban) { - loss += 2 * (pow(log10 (m_frequency / 28), 2)) - 5.4; + loss += - 2 * (pow(log10 (m_frequency / 28), 2)) - 5.4; } else if (m_environment == OpenAreas) { @@ -171,18 +192,23 @@ BuildingsPropagationLossModel::OkumuraHata (Ptr a, PtrGetPosition ().z); + double hb = (a->GetPosition ().z>b->GetPosition ().z ? a->GetPosition ().z : b->GetPosition ().z); + double hm = (a->GetPosition ().z< b->GetPosition ().z ? a->GetPosition ().z : b->GetPosition ().z); + double log_aHeight = 13.82 * log10 (hb); double log_bHeight = 0.0; + double C = 0.0; + if (m_citySize == Large) { - log_bHeight = 3.2 * pow ((log10(11.75 * b->GetPosition ().z)),2); + log_bHeight = 3.2 * pow ((log10(11.75 * hm)),2); + C = 3; } else { - log_bHeight = 1.1*log10(m_frequency) - 0.7*b->GetPosition ().z - (1.56*log10(m_frequency) - 0.8); + log_bHeight = 1.1*log_f - 0.7*hm - (1.56*log_f - 0.8); } - loss = 46.3 + (33.9 * log_f) - log_aHeight + (((44.9 - (6.55 * log_f) ))*log10 (a->GetDistanceFrom (b))) - log_bHeight; + loss = 46.3 + (33.9 * log_f) - log_aHeight + (((44.9 - (6.55 * log10(hb)) ))*log10 (a->GetDistanceFrom (b))) - log_bHeight + C; } else if (m_frequency <= 2.690e9) // max 3GPP freq EUTRA band #1 { @@ -203,7 +229,7 @@ BuildingsPropagationLossModel::ItuR1411 (Ptr a, PtrGetDistanceFrom (b) < m_itu1411NlosThreshold) { - return (ItuR1411Los (a,b);) + return (ItuR1411Los (a,b)); } else { @@ -219,7 +245,7 @@ BuildingsPropagationLossModel::ItuR1411Los (Ptr a, PtrGetPosition ().z*b->GetPosition ().z)); + double Lbp = abs(20*log10((m_lambda*m_lambda)/(8*pi*a->GetPosition ().z*b->GetPosition ().z))); double Rbp = (4 * a->GetPosition ().z * b->GetPosition ().z) / m_lambda; // NS_LOG_INFO (this << " Lbp " << Lbp << " Rbp " << Rbp); if (dist <= Rbp) @@ -255,39 +281,41 @@ double BuildingsPropagationLossModel::ItuR1411NlosOverRooftop (Ptr a, Ptr b) const { double Lori = 0.0; + double fmhz = m_frequency/1e6; if ((m_streetsOrientation>=0)&&(m_streetsOrientation<35)) { Lori = -10.0 + 0.354*m_streetsOrientation; } else if ((m_streetsOrientation>=35)&&(m_streetsOrientation<55)) { - Lori = 2.5 + 0.075*m_streetsOrientation; + Lori = 2.5 + 0.075*(m_streetsOrientation - 35); } else if ((m_streetsOrientation>=55)&&(m_streetsOrientation<90)) { - Lori = 2.5 + 0.075*m_streetsOrientation; + Lori = 2.5 + 0.075*(m_streetsOrientation - 55); } else { NS_LOG_ERROR (this << " Street Orientation must be in [0,90]"); } - - double Lrts = -8.2 -10*log10(m_streetsWidth) + 20*log10(m_rooftopHeight - b->GetPosition ().z) + Lori; double distance = a->GetDistanceFrom (b); - double Dhb = a->GetPosition ().z - m_rooftopHeight; + double hb = (a->GetPosition ().z>b->GetPosition ().z ? a->GetPosition ().z : b->GetPosition ().z); + double hm = (a->GetPosition ().z< b->GetPosition ().z ? a->GetPosition ().z : b->GetPosition ().z); + double Dhb = hb - m_rooftopHeight; double ds = (m_lambda * distance * distance) / (Dhb * Dhb); double Lmsd = 0.0; double pi = 3.141592653589793; + //NS_LOG_INFO (this << " build " << m_buildingsExtend << " ds " << ds << " roof " << m_rooftopHeight << " hb " << hb << " lambda " << m_lambda); if (ds < m_buildingsExtend) { double Lbsh = 0.0; double ka = 0.0; double kd = 0.0; double kf = 0.0; - if ((a->GetPosition ().z > m_rooftopHeight) || (b->GetPosition ().z > m_rooftopHeight)) + if (hb > m_rooftopHeight) { Lbsh = -18*log10(1+Dhb); - ka = 54.0; + ka = (fmhz > 2000 ? 71.4 : 54.0); kd = 18.0; } else @@ -303,21 +331,25 @@ BuildingsPropagationLossModel::ItuR1411NlosOverRooftop (Ptr2000) { - kf = 0.7*(m_frequency/925.0 -1); + kf = -8; + } + else if ((m_environment==Urban)&&(m_citySize==Large)) + { + kf = -4 + 0.7*(fmhz/925.0 -1); } else { - kf = 1.5*(m_frequency/925.0 -1); + kf = -4 + 1.5*(fmhz/925.0 -1); } - Lmsd = Lbsh + ka + kd*log10(distance/1000.0) + kf*log10(m_frequency) -9.0*log10(m_buildingSeparation); // CHECK last d (it's "b" in ITU) + + Lmsd = Lbsh + ka + kd*log10(distance/1000.0) + kf*log10(fmhz) -9.0*log10(m_buildingSeparation); } else { double theta = atan (Dhb/m_buildingSeparation); double rho = sqrt(Dhb*Dhb+m_buildingSeparation*m_buildingSeparation); - double hb = a->GetPosition ().z; double Qm = 0.0; if ((hb > m_rooftopHeight -1.0) && (hb < m_rooftopHeight + 1.0)) { @@ -334,8 +366,10 @@ BuildingsPropagationLossModel::ItuR1411NlosOverRooftop (Ptr 0) { @@ -351,6 +385,7 @@ BuildingsPropagationLossModel::ItuR1411NlosOverRooftop (Ptr a, Ptr b) const { + NS_LOG_INFO (this); // reflection pathloss double x1 = a->GetStreetCrossingDistence (); double x2 = b->GetStreetCrossingDistence (); diff --git a/src/propagation/model/buildings-propagation-loss-model.h b/src/propagation/model/buildings-propagation-loss-model.h index 5c969f859..df5547283 100644 --- a/src/propagation/model/buildings-propagation-loss-model.h +++ b/src/propagation/model/buildings-propagation-loss-model.h @@ -75,9 +75,11 @@ public: */ double GetLoss (Ptr a, Ptr b) const; void SetEnvironment (Environment env); + void SetCitySize (CitySize size); void SetLambda (double lambda); void SetMinDistance (double minDistance); Environment GetEnvironment (void) const; + CitySize GetCitySize (void) const; double GetMinDistance (void) const; double GetLambda (void) const; void SetLambda (double frequency, double speed);