我正在學習Solver基金會。實際上,我爲我的項目插入了lpsolve,但我認爲我的問題是如何最好地表示我的約束的一般問題。將線性概率中的地理分佈表示爲約束條件?
我有,我認爲是一個相當典型的揹包或包裝問題。我有一系列地點,每個地點都有'分數'。我想選擇達到目標「分數」的最少位置數。 (實際上,它比這更復雜一點 - 每個位置都有許多不同的屬性,而且我經常會瞄準多個屬性)。
到目前爲止這麼好。但是,我有一個額外的限制 - 我想最大限度地擴大我選擇的地點的地理分散。我怎樣才能表達這種約束?
這裏是什麼,我現在所擁有的一個基本的例子:
static void Main(string[] args)
{
var locations = new List<LocationWithScore>()
{
new LocationWithScore() { LocationID = 0, Latitude = 43.644274M, Longitude = -79.478703M, Score = 20 },
new LocationWithScore() { LocationID = 1, Latitude = 43.644709M, Longitude = -79.476814M, Score = 20 },
new LocationWithScore() { LocationID = 2, Latitude = 43.643063M, Longitude = -79.477458M, Score = 20 },
new LocationWithScore() { LocationID = 3, Latitude = 43.650516M, Longitude = -79.469562M, Score = 20 },
new LocationWithScore() { LocationID = 4, Latitude = 43.642659M, Longitude = -79.463124M, Score = 20 }
};
SolverContext sContext = SolverContext.GetContext();
sContext.ClearModel();
Model model = sContext.CreateModel();
model.Name = "LocationWithScore";
Set items = new Set(Domain.Any, "candidates");
Decision take = new Decision(Domain.Boolean, "candidate", items);
model.AddDecision(take);
Parameter scoreParam = new Parameter(Domain.RealNonnegative, "score", items);
scoreParam.SetBinding(locations, "Score", "LocationID");
model.AddParameters(scoreParam);
model.AddConstraint("scoreConstraint", Model.Sum(Model.ForEach(items, item => scoreParam[item] * take[item])) >= 60);
model.AddGoal("locationGoal", GoalKind.Minimize, Model.Sum(Model.ForEach(items, item => take[item])));
var solution = sContext.Solve(new LpSolveDirective());
var report = solution.GetReport();
Console.WriteLine(report.ToString());
Console.WriteLine("Done");
Console.ReadKey();
}
internal class LocationWithScore
{
public int LocationID { get; set; }
public decimal Latitude { get; set; }
public decimal Longitude { get; set; }
public double Score { get; set; }
}
這會簡單地選擇第一三個位置,這給了我60的目標,但是這三個位置都聚集非常接近。我更喜歡的是選擇前三個(ID 0 - 2)和最後兩個(ID 3和4)中的一個,這些擴展得更遠。
有人可以提供一些指導嗎?提前謝謝了。
我在想你實現了揹包動態規劃解決方案,增加了最大化揹包中物品的單位分散的約束條件。 – user845279
謝謝,是的。關於如何最好地將它作爲Solver基金會的約束的任何線索? – TheNextman
:)我知道你在想什麼,* thx船長明顯*。無論如何,你有沒有嘗試添加一個額外的擴散最大化目標?您可能必須編寫函數(可能爲方差)來計算給定經度和緯度參數上的色散。 – user845279