- Migliorato calcolo tempo per rating strategia/soluzione

- 'dTimeToMachine' ora obbligatorio nei Result (da sistemare tutte le strategie)
- Piccola modifica ai nomi delle variabili, qualità e completamento diventano double e non più interi
- Riduzione numero scelte in parametri generici
This commit is contained in:
andrea.villa
2025-10-10 11:56:51 +02:00
parent f7462a47f4
commit 911113e853
25 changed files with 245 additions and 189 deletions
+96 -37
View File
@@ -553,31 +553,31 @@ end
-- funzione che restituisce indice di completamento in base alla percentuale di volume lavorato
function FeatureLib.GetFeatureCompletionIndex( dCompletionPercentage)
-- indice di completamento
local nCompletionIndex = 0
local dCompletionIndex = 0
-- nullo
if dCompletionPercentage < 5 then
nCompletionIndex = 0
dCompletionIndex = 0
-- Low
elseif dCompletionPercentage < 50 then
nCompletionIndex = 1
dCompletionIndex = 1
-- Medium
elseif dCompletionPercentage < 80 then
nCompletionIndex = 2
dCompletionIndex = 2
-- High
elseif dCompletionPercentage < 95 then
nCompletionIndex = 4
dCompletionIndex = 4
-- High / Complete
else
nCompletionIndex = 5
dCompletionIndex = 5
end
return nCompletionIndex
return dCompletionIndex
end
-------------------------------------------------------------------------------------------------------------
function FeatureLib.GetStrategyQuality( Parameter)
local nQuality = 0
local dQuality = 0
-- se viene passata una tabella, si calcola media pesata di tutte le lavorazioni
if type( Parameter) == "table" then
@@ -592,43 +592,43 @@ function FeatureLib.GetStrategyQuality( Parameter)
dQualityDenominator = dQualityDenominator + Machining.dLengthToMachine
end
end
nQuality = dQualityNumerator / dQualityDenominator
dQuality = dQualityNumerator / dQualityDenominator
-- se viene passato un tag, si ritorna direttamente il voto
elseif type( Parameter) == "string" then
local sMachiningTag = Parameter
-- #### STATI DI LAVORAZIONE AGGREGATI #### --
-- BEST = lavorazione eccellente, la migliore qualità che si possa ottenere
if sMachiningTag == 'BEST' then
nQuality = 5
dQuality = 5
-- FINE = lavorazione ottima, non dovrebbero esscerci scheggiature
elseif sMachiningTag == 'FINE' then
nQuality = 4
dQuality = 4
-- STD = lavorazione accettabile, potrebbe avere scheggiature minime
elseif sMachiningTag == 'STD' then
nQuality = 3
dQuality = 3
-- SEMI = lavorazione accettabile, potrebbe avere scheggiature minime, mancano piccoli dettagli alla lavorazione (es. se vengono lasciati i raggi fresa sugli spigoli)
elseif sMachiningTag == 'SEMI' then
nQuality = 2.5
dQuality = 2.5
-- ROUGH = Lavorazione scadente, scheggiatura molto probabile, potrebbe non essere precisa
elseif sMachiningTag == 'ROUGH' then
nQuality = 1
dQuality = 1
-- #### UTENSILI DI LAVORAZIONE UTILIZZATI #### --
elseif sMachiningTag == 'SAWBLADE' then
nQuality = 5
dQuality = 5
elseif sMachiningTag == 'DRILLBIT' then
nQuality = 4
dQuality = 4
elseif sMachiningTag == 'MILL' then
nQuality = 3
dQuality = 3
elseif sMachiningTag == 'MORTISE' then
nQuality = 1
dQuality = 1
else
nQuality = 0
dQuality = 0
end
else
nQuality = 0
dQuality = 0
end
return nQuality
return dQuality
end
-------------------------------------------------------------------------------------------------------------
@@ -656,30 +656,89 @@ function FeatureLib.GetStrategyResultNotApplicable( sInfo)
Result.dMRR = 0
Result.dCompletionPercentage = 0
Result.sStatus = 'Not-Applicable'
Result.nCompletionIndex = 0
Result.nQuality = 0
Result.dCompletionIndex = 0
Result.dQuality = 0
Result.sInfo = sInfo
return Result
end
-------------------------------------------------------------------------------------------------------------
-- TODO rivedere affidabilità del calcolo del composite rating
-- funzione che calcola il 'CompositeRating' di ogni strategia
function FeatureLib.CalculateCompositeRating( StrategyResult)
-- se ho tutti i dati che mi servono calcolo il rating della strategia applicato alla feature
if StrategyResult and StrategyResult.nQuality and StrategyResult.nCompletionIndex and StrategyResult.dMRR then
-- TODO serve funzione generale?
-- indice bonta lavorazione feature in rotazione è opzionale, se non settato viene messo a 3
if not StrategyResult.nFeatureRotationIndex then
StrategyResult.nFeatureRotationIndex = 3
end
StrategyResult.dCompositeRating = ceil( StrategyResult.nQuality * StrategyResult.nCompletionIndex * ( 1 + ( StrategyResult.nFeatureRotationIndex / 10)))
else
StrategyResult.dCompositeRating = 0
local function GetMachiningStrategyCoefficients( sMachiningStrategy)
local dCoeffQuality, dCoeffCompletion, dCoeffTime
-- queste sono tutte le opzioni possibili. Da configurazione si può settare solo: AUTO, FASTEST, HIGH_QUALITY
if sMachiningStrategy == 'FASTEST' then
dCoeffQuality, dCoeffCompletion, dCoeffTime = 0.75, 0.75, 1.5
elseif sMachiningStrategy == 'HIGH_QUALITY' then
dCoeffQuality, dCoeffCompletion, dCoeffTime = 1.5, 0.75, 0.75
elseif sMachiningStrategy == 'COMPLETEST' then
dCoeffQuality, dCoeffCompletion, dCoeffTime = 0.75, 1.5, 0.75
elseif sMachiningStrategy == 'IGNORE_TIME' then
dCoeffQuality, dCoeffCompletion, dCoeffTime = 1.25, 1.25, 0.5
elseif sMachiningStrategy == 'IGNORE_QUALITY' then
dCoeffQuality, dCoeffCompletion, dCoeffTime = 0.5, 1.25, 1.25
elseif sMachiningStrategy == 'IGNORE_COMPLETION' then
dCoeffQuality, dCoeffCompletion, dCoeffTime = 1.25, 0.5, 1.25
else -- sMachiningStrategy == 'FIRST_IN_LIST' or sMachiningStrategy == 'AUTO' (oppure non settato, ma dovrebbe essere sempre settato!)
dCoeffQuality, dCoeffCompletion, dCoeffTime = 1, 1, 1
end
return StrategyResult
return dCoeffQuality, dCoeffCompletion, dCoeffTime
end
-------------------------------------------------------------------------------------------------------------
-- TODO rivedere affidabilità del calcolo del composite rating
-- funzione che calcola il 'CompositeRating' di ogni strategia
function FeatureLib.CalculateStrategiesCompositeRating( AvailableStrategies, sMachiningStrategy)
for n = 1, #AvailableStrategies do
-- se ho tutti i dati che mi servono calcolo il rating della strategia applicato alla feature
if AvailableStrategies[n].Result and AvailableStrategies[n].Result.dQuality and AvailableStrategies[n].Result.dCompletionIndex and AvailableStrategies[n].Result.dTimeToMachine then
-- il tempo è pesato sul totale delle strategie, e riportato nell'intervallo 1-5, dove 5 è il tempo migliore (il più basso)
local dIndexWeightTimeToMachine = 5 - ( 4 * ( EgtClamp( AvailableStrategies[n].Result.dTimeToMachine / AvailableStrategies.dAllStrategiesTotalTime, 0, 1)))
-- si calcolano gli indici pesati in base alla configurazione utente. Possibili parametri di configurazione:
local dQuality, dCompletion, dTime, dCoeffQuality, dCoeffCompletion, dCoeffTime
dCoeffQuality, dCoeffCompletion, dCoeffTime = GetMachiningStrategyCoefficients( sMachiningStrategy)
dQuality = AvailableStrategies[n].Result.dQuality * dCoeffQuality
dCompletion = AvailableStrategies[n].Result.dCompletionIndex * dCoeffCompletion
dTime = dIndexWeightTimeToMachine * dCoeffTime
AvailableStrategies[n].Result.dCompositeRating = dQuality + dCompletion + dTime -- TODO da verificare se meglio sommare o moltiplicare gli indici
else
AvailableStrategies[n].Result.dCompositeRating = 0
end
end
return AvailableStrategies
end
-------------------------------------------------------------------------------------------------------------
-- TODO rivedere affidabilità del calcolo del composite rating
-- funzione che calcola il 'CompositeRating' di ogni combinazione
function FeatureLib.CalculateCombinationsCompositeRating( CombinationsList, sMachiningStrategy)
for n = 1, #CombinationsList do
-- se ho tutti i dati che mi servono calcolo il rating della strategia applicato alla feature
if CombinationsList[n].dTotalQuality and CombinationsList[n].dTotalCompletionIndex and CombinationsList[n].dTotalTimeToMachine then
-- il tempo è pesato sul totale delle strategie, e riportato nell'intervallo 1-5, dove 5 è il tempo migliore (il più basso)
local dIndexWeightTimeToMachine = 5 - ( 4 * ( EgtClamp( CombinationsList[n].dTotalTimeToMachine / CombinationsList.dAllCombinationsTotalTime, 0, 1)))
-- si calcolano gli indici pesati in base alla configurazione utente. Possibili parametri di configurazione:
local dQuality, dCompletion, dTime, dCoeffQuality, dCoeffCompletion, dCoeffTime
dCoeffQuality, dCoeffCompletion, dCoeffTime = GetMachiningStrategyCoefficients( sMachiningStrategy)
dQuality = CombinationsList[n].dTotalQuality * dCoeffQuality
dCompletion = CombinationsList[n].dTotalCompletionIndex * dCoeffCompletion
dTime = dIndexWeightTimeToMachine * dCoeffTime
CombinationsList[n].dTotalRating = dQuality + dCompletion + dTime -- TODO da verificare se meglio sommare o moltiplicare gli indici
else
CombinationsList[n].dTotalRating = 0
end
end
return CombinationsList
end
-------------------------------------------------------------------------------------------------------------