|
@@ -12,84 +12,7 @@ namespace Yuuna.Contracts.Optimization
|
|
|
using Yuuna.Contracts.Patterns;
|
|
|
using Yuuna.Contracts.Modules;
|
|
|
using Yuuna.Contracts.Semantics;
|
|
|
- using System.Linq;
|
|
|
-
|
|
|
- public enum Status
|
|
|
- {
|
|
|
- /// <summary>
|
|
|
- /// 無有效解。
|
|
|
- /// </summary>
|
|
|
- Invalid,
|
|
|
- /// <summary>
|
|
|
- /// 最佳解。表示與模式(Pattern)完全符合。
|
|
|
- /// </summary>
|
|
|
- Optimal,
|
|
|
- /// <summary>
|
|
|
- /// 條件式。表示缺少一個群組(Group)。
|
|
|
- /// </summary>
|
|
|
- Condition,
|
|
|
- /// <summary>
|
|
|
- /// 命題。表示具有兩個條件式(<see cref="Condition"/>)。
|
|
|
- /// </summary>
|
|
|
- Proposition,
|
|
|
- /// <summary>
|
|
|
- /// 悖論。表示具有兩個(含)以上的最佳解(<see cref="Optimal"/>),這實際上屬於模組設計上的問題。
|
|
|
- /// </summary>
|
|
|
- Paradox,
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// 沒有已安裝的模組。
|
|
|
- /// </summary>
|
|
|
- NoModuleInstalled = -1,
|
|
|
- }
|
|
|
-
|
|
|
- public class Alternative
|
|
|
- {
|
|
|
- public Status Status { get; }
|
|
|
- public IImmutableList<Match> Matches { get; }
|
|
|
-
|
|
|
- public Alternative(IImmutableList<Match> matches)
|
|
|
- {
|
|
|
- var count = matches?.Count ?? 0;
|
|
|
- if (count.Equals(1))
|
|
|
- {
|
|
|
- var single = matches[0].Missing.Count;
|
|
|
- if (single.Equals(0))
|
|
|
- {
|
|
|
- this.Status = Status.Optimal; // 最佳解
|
|
|
-
|
|
|
- }
|
|
|
- else if (single.Equals(1))
|
|
|
- {
|
|
|
- this.Status = Status.Condition;// 近似解(缺一組條件,詢問使用者)
|
|
|
- }
|
|
|
- }
|
|
|
- else if (count.Equals(2))
|
|
|
- {
|
|
|
- if (matches.All(x => x.Missing.Count == 0))
|
|
|
- {
|
|
|
- this.Status = Status.Paradox;// 內部錯誤(多個意圖重複)
|
|
|
- }
|
|
|
- else if (matches.All(x => x.Missing.Count == 1))
|
|
|
- {
|
|
|
- this.Status = Status.Proposition;// 兩個近似解,詢問使用者(二選一 + 離開情境)
|
|
|
- }
|
|
|
- }
|
|
|
- else if (count.Equals(0))
|
|
|
- {
|
|
|
- // 無有效模組
|
|
|
- this.Status = Status.NoModuleInstalled;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- // 不採用
|
|
|
- this.Status = Status.Invalid;
|
|
|
- }
|
|
|
-
|
|
|
- this.Matches = matches;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
+ using System.Diagnostics;
|
|
|
|
|
|
public class DefaultStrategy : IStrategy
|
|
|
{
|
|
@@ -138,12 +61,16 @@ namespace Yuuna.Contracts.Optimization
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ sta.Remove(0); //過濾掉完全沒相符的資料以免影響結果
|
|
|
+
|
|
|
|
|
|
var weight = double.MinValue;
|
|
|
var bestSelect = default(List<Match>);
|
|
|
foreach (var s in sta)
|
|
|
{
|
|
|
- var y = -( Math.Tanh(Math.Pow(Math.E, (s.Value.Count) / (double)-(matches.Count * s.Key))));
|
|
|
+ var y = Math.Tanh(Math.Pow(Math.E, (s.Value.Count) / (double)-(matches.Count * s.Key)));
|
|
|
+
|
|
|
+ Debug.WriteLine((s.Key, y));
|
|
|
if (y > weight)
|
|
|
{
|
|
|
weight = y;
|
|
@@ -151,38 +78,8 @@ namespace Yuuna.Contracts.Optimization
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- return new Alternative(bestSelect?.ToImmutableArray());
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- //var tuple = new List<Tuple<Match, double>>();
|
|
|
- //foreach (var s in sta)
|
|
|
- //{
|
|
|
- // var x = (s.Value) / (double)-(matches.Count * s.Key.SequentialMatches.Count);
|
|
|
- // var y = Math.Tanh(Math.Pow(Math.E, x));
|
|
|
- // tuple.Add(Tuple.Create(s.Key, y));
|
|
|
- //}
|
|
|
- //var bestSelect = tuple.OrderByDescending(x => x.Item2).FirstOrDefault();
|
|
|
- //return bestSelect?.Item1;
|
|
|
-
|
|
|
-
|
|
|
- //var hold = double.MinValue;
|
|
|
- //var bestSelect = default(Match);
|
|
|
- //foreach (var s in sta)
|
|
|
- //{
|
|
|
- // var y = Math.Tanh(Math.Pow(Math.E, (s.Value) / (double)-(matches.Count * s.Key.Pattern.Count)));
|
|
|
- // if (y > hold)
|
|
|
- // {
|
|
|
- // hold = y;
|
|
|
- // bestSelect = s.Key;
|
|
|
- // }
|
|
|
- //}
|
|
|
-
|
|
|
- //if (bestSelect.SequentialMatches.Count == 0)
|
|
|
- // return null;
|
|
|
-
|
|
|
- //return bestSelect;
|
|
|
+ var a = new Alternative(bestSelect?.ToImmutableArray());
|
|
|
+ return a;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|