mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r26542) [1.4] -Backport from trunk:
- Change: Remove demand calculation based on tiles (r26484) - Fix: Allow single-vehicle consists to station-refit in a meaningful way (r26483)
This commit is contained in:
parent
34bff06d8a
commit
7a0b2bff18
|
@ -1401,8 +1401,13 @@ static void HandleStationRefit(Vehicle *v, CargoArray &consist_capleft, Station
|
||||||
DoCommand(v_start->tile, v_start->index, cid | 1U << 6 | 0xFF << 8 | 1U << 16, DC_QUERY_COST, GetCmdRefitVeh(v_start)); // Auto-refit and only this vehicle including artic parts.
|
DoCommand(v_start->tile, v_start->index, cid | 1U << 6 | 0xFF << 8 | 1U << 16, DC_QUERY_COST, GetCmdRefitVeh(v_start)); // Auto-refit and only this vehicle including artic parts.
|
||||||
/* Try to balance different loadable cargoes between parts of the consist, so that
|
/* Try to balance different loadable cargoes between parts of the consist, so that
|
||||||
* all of them can be loaded. Avoid a situation where all vehicles suddenly switch
|
* all of them can be loaded. Avoid a situation where all vehicles suddenly switch
|
||||||
* to the first loadable cargo for which there is only one packet. */
|
* to the first loadable cargo for which there is only one packet. If the capacities
|
||||||
if (_returned_refit_capacity > 0 && consist_capleft[cid] < consist_capleft[new_cid]) {
|
* are equal refit to the cargo of which most is available. This is important for
|
||||||
|
* consists of only a single vehicle as those will generally have a consist_capleft
|
||||||
|
* of 0 for all cargoes. */
|
||||||
|
if (_returned_refit_capacity > 0 && (consist_capleft[cid] < consist_capleft[new_cid] ||
|
||||||
|
(consist_capleft[cid] == consist_capleft[new_cid] &&
|
||||||
|
st->goods[cid].cargo.AvailableCount() > st->goods[new_cid].cargo.AvailableCount()))) {
|
||||||
new_cid = cid;
|
new_cid = cid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,15 +11,7 @@ typedef std::list<NodeID> NodeList;
|
||||||
*/
|
*/
|
||||||
class Scaler {
|
class Scaler {
|
||||||
public:
|
public:
|
||||||
/**
|
|
||||||
* Constructor.
|
|
||||||
*/
|
|
||||||
Scaler() : demand_per_node(0) {}
|
|
||||||
|
|
||||||
void SetDemands(LinkGraphJob &job, NodeID from, NodeID to, uint demand_forw);
|
void SetDemands(LinkGraphJob &job, NodeID from, NodeID to, uint demand_forw);
|
||||||
|
|
||||||
protected:
|
|
||||||
uint demand_per_node; ///< Mean demand associated with each node.
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -32,7 +24,8 @@ public:
|
||||||
* @param mod_size Size modifier to be used. Determines how much demands
|
* @param mod_size Size modifier to be used. Determines how much demands
|
||||||
* increase with the supply of the remote station.
|
* increase with the supply of the remote station.
|
||||||
*/
|
*/
|
||||||
inline SymmetricScaler(uint mod_size) : mod_size(mod_size), supply_sum(0)
|
inline SymmetricScaler(uint mod_size) : mod_size(mod_size), supply_sum(0),
|
||||||
|
demand_per_node(0)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -80,8 +73,9 @@ public:
|
||||||
void SetDemands(LinkGraphJob &job, NodeID from, NodeID to, uint demand_forw);
|
void SetDemands(LinkGraphJob &job, NodeID from, NodeID to, uint demand_forw);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint mod_size; ///< Size modifier. Determines how much demands increase with the supply of the remote station.
|
uint mod_size; ///< Size modifier. Determines how much demands increase with the supply of the remote station.
|
||||||
uint supply_sum; ///< Sum of all supplies in the component.
|
uint supply_sum; ///< Sum of all supplies in the component.
|
||||||
|
uint demand_per_node; ///< Mean demand associated with each node.
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -90,37 +84,29 @@ private:
|
||||||
class AsymmetricScaler : public Scaler {
|
class AsymmetricScaler : public Scaler {
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Nothing to do here.
|
||||||
|
* @param unused.
|
||||||
*/
|
*/
|
||||||
inline AsymmetricScaler() : demand_sum(0) {}
|
inline void AddNode(const Node &)
|
||||||
|
|
||||||
/**
|
|
||||||
* Count a node's demand into the sum of demands.
|
|
||||||
* @param node The node to be counted.
|
|
||||||
*/
|
|
||||||
inline void AddNode(const Node &node)
|
|
||||||
{
|
{
|
||||||
this->demand_sum += node.Demand();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculate the mean demand per node using the sum of demands.
|
* Nothing to do here.
|
||||||
* @param num_demands Number of accepting nodes.
|
* @param unused.
|
||||||
*/
|
*/
|
||||||
inline void SetDemandPerNode(uint num_demands)
|
inline void SetDemandPerNode(uint)
|
||||||
{
|
{
|
||||||
this->demand_per_node = max(this->demand_sum / num_demands, (uint)1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the effective supply of one node towards another one. In asymmetric
|
* Get the effective supply of one node towards another one.
|
||||||
* distribution the demand of the other node is weighed in.
|
|
||||||
* @param from The supplying node.
|
* @param from The supplying node.
|
||||||
* @param to The receiving node.
|
* @param unused.
|
||||||
*/
|
*/
|
||||||
inline uint EffectiveSupply(const Node &from, const Node &to)
|
inline uint EffectiveSupply(const Node &from, const Node &)
|
||||||
{
|
{
|
||||||
return max(from.Supply() * to.Demand() / this->demand_per_node, (uint)1);
|
return from.Supply();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -130,9 +116,6 @@ public:
|
||||||
* @param to_anno Unused.
|
* @param to_anno Unused.
|
||||||
*/
|
*/
|
||||||
inline bool HasDemandLeft(const Node &to) { return to.Demand() > 0; }
|
inline bool HasDemandLeft(const Node &to) { return to.Demand() > 0; }
|
||||||
|
|
||||||
private:
|
|
||||||
uint demand_sum; ///< Sum of all demands in the component.
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue