Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 微软解决方案基础位置分散目标 我试图使用微软解决方案基金会,这样我就可以选择3个最分散的位置。我在我的模型中增加了两个目标,一个是确保选择3个地点,另一个是确保它们是最分散的3个地点 static void Main(string[] args) { Location candidate1 = new Location(0, 43.432, -79.432); Location candidate2 = new Location(1, 43.0, -79.0); Location candidate3 = new Location(2, 23.0, 29.0); Location candidate4 = new Location(3, 43.0, -79.0); Location candidate5 = new Location(4, 43.0, -79.0); Location[] candidates = {candidate1, candidate2, candidate3, candidate4, candidate5}; SolverContext solver = new SolverContext(); Model model = solver.CreateModel(); model.Name = "LocationModel"; Set items = new Set(Domain.Any, "candidates"); Decision take = new Decision(Domain.Boolean, "candidate", items); model.AddDecision(take); Parameter locations = new Parameter(Domain.RealNonnegative, "locations", items); locations.SetBinding(candidates, "ID", "ID"); model.AddParameter(locations); var dist = from l1 in candidates from l2 in candidates select new { ID1 = l1.ID, ID2 = l2.ID, dist = Geography.GetDistance(l1.Latitude, l1.Longitude, l2.Latitude, l2.Longitude) }; Parameter distance = new Parameter(Domain.RealNonnegative, "Location", items, items); distance.SetBinding(dist, "dist", "ID1", "ID2"); model.AddParameter(distance); Term goal = Model.Sum(Model.ForEach(items, i => Model.ForEach(items, j => take[i]*take[j]* distance[i, j]))); model.AddConstraint("LocationsQuantityMax", Model.Sum(Model.ForEach(items, item => take[item])) == 3); model.AddGoal("Dispersion", GoalKind.Maximize, goal); Directive directive = new HybridLocalSearchDirective(); Solution solution = solver.Solve(directive); List<Location> locations1 = new List<Location>(); if (solution.Decisions.Any()) { var selections = solution.Decisions.First().GetValues() .Where(d => (bool) d[0]) .Select(d => Convert.ToInt32(d[1])); locations1.AddRange( from c in candidates join s in selections on c.ID equals s select c); } foreach (Location location in locations1) { Console.WriteLine("ID: {0}, Latitude: {1}, Longitude: {2}", location.ID, location.Latitude, location.Longitude); }_C#_Optimization_Ms Solver Foundation - Fatal编程技术网

C# 微软解决方案基础位置分散目标 我试图使用微软解决方案基金会,这样我就可以选择3个最分散的位置。我在我的模型中增加了两个目标,一个是确保选择3个地点,另一个是确保它们是最分散的3个地点 static void Main(string[] args) { Location candidate1 = new Location(0, 43.432, -79.432); Location candidate2 = new Location(1, 43.0, -79.0); Location candidate3 = new Location(2, 23.0, 29.0); Location candidate4 = new Location(3, 43.0, -79.0); Location candidate5 = new Location(4, 43.0, -79.0); Location[] candidates = {candidate1, candidate2, candidate3, candidate4, candidate5}; SolverContext solver = new SolverContext(); Model model = solver.CreateModel(); model.Name = "LocationModel"; Set items = new Set(Domain.Any, "candidates"); Decision take = new Decision(Domain.Boolean, "candidate", items); model.AddDecision(take); Parameter locations = new Parameter(Domain.RealNonnegative, "locations", items); locations.SetBinding(candidates, "ID", "ID"); model.AddParameter(locations); var dist = from l1 in candidates from l2 in candidates select new { ID1 = l1.ID, ID2 = l2.ID, dist = Geography.GetDistance(l1.Latitude, l1.Longitude, l2.Latitude, l2.Longitude) }; Parameter distance = new Parameter(Domain.RealNonnegative, "Location", items, items); distance.SetBinding(dist, "dist", "ID1", "ID2"); model.AddParameter(distance); Term goal = Model.Sum(Model.ForEach(items, i => Model.ForEach(items, j => take[i]*take[j]* distance[i, j]))); model.AddConstraint("LocationsQuantityMax", Model.Sum(Model.ForEach(items, item => take[item])) == 3); model.AddGoal("Dispersion", GoalKind.Maximize, goal); Directive directive = new HybridLocalSearchDirective(); Solution solution = solver.Solve(directive); List<Location> locations1 = new List<Location>(); if (solution.Decisions.Any()) { var selections = solution.Decisions.First().GetValues() .Where(d => (bool) d[0]) .Select(d => Convert.ToInt32(d[1])); locations1.AddRange( from c in candidates join s in selections on c.ID equals s select c); } foreach (Location location in locations1) { Console.WriteLine("ID: {0}, Latitude: {1}, Longitude: {2}", location.ID, location.Latitude, location.Longitude); }

C# 微软解决方案基础位置分散目标 我试图使用微软解决方案基金会,这样我就可以选择3个最分散的位置。我在我的模型中增加了两个目标,一个是确保选择3个地点,另一个是确保它们是最分散的3个地点 static void Main(string[] args) { Location candidate1 = new Location(0, 43.432, -79.432); Location candidate2 = new Location(1, 43.0, -79.0); Location candidate3 = new Location(2, 23.0, 29.0); Location candidate4 = new Location(3, 43.0, -79.0); Location candidate5 = new Location(4, 43.0, -79.0); Location[] candidates = {candidate1, candidate2, candidate3, candidate4, candidate5}; SolverContext solver = new SolverContext(); Model model = solver.CreateModel(); model.Name = "LocationModel"; Set items = new Set(Domain.Any, "candidates"); Decision take = new Decision(Domain.Boolean, "candidate", items); model.AddDecision(take); Parameter locations = new Parameter(Domain.RealNonnegative, "locations", items); locations.SetBinding(candidates, "ID", "ID"); model.AddParameter(locations); var dist = from l1 in candidates from l2 in candidates select new { ID1 = l1.ID, ID2 = l2.ID, dist = Geography.GetDistance(l1.Latitude, l1.Longitude, l2.Latitude, l2.Longitude) }; Parameter distance = new Parameter(Domain.RealNonnegative, "Location", items, items); distance.SetBinding(dist, "dist", "ID1", "ID2"); model.AddParameter(distance); Term goal = Model.Sum(Model.ForEach(items, i => Model.ForEach(items, j => take[i]*take[j]* distance[i, j]))); model.AddConstraint("LocationsQuantityMax", Model.Sum(Model.ForEach(items, item => take[item])) == 3); model.AddGoal("Dispersion", GoalKind.Maximize, goal); Directive directive = new HybridLocalSearchDirective(); Solution solution = solver.Solve(directive); List<Location> locations1 = new List<Location>(); if (solution.Decisions.Any()) { var selections = solution.Decisions.First().GetValues() .Where(d => (bool) d[0]) .Select(d => Convert.ToInt32(d[1])); locations1.AddRange( from c in candidates join s in selections on c.ID equals s select c); } foreach (Location location in locations1) { Console.WriteLine("ID: {0}, Latitude: {1}, Longitude: {2}", location.ID, location.Latitude, location.Longitude); },c#,optimization,ms-solver-foundation,C#,Optimization,Ms Solver Foundation,我的距离计算是: public static double ToRad(this double num) { return num * Math.PI / 180; } public static double GetDistance(double lat1, double lon1, double lat2, double lon2) { const int r = 6371; // Radius of earth in

我的距离计算是:

    public static double ToRad(this double num)
    {
        return num * Math.PI / 180;
    }

    public static double GetDistance(double lat1, double lon1, double lat2, double lon2)
    {
        const int r = 6371; // Radius of earth in KM

        // Convert to Radians
        lat1 = lat1.ToRad();
        lon1 = lon1.ToRad();
        lat2 = lat2.ToRad();
        lon2 = lon2.ToRad();

        // Spherical Law of Cosines
        var resultCos =
            Math.Acos(
                Math.Sin(lat1) * Math.Sin(lat2) +
                Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(lon2 - lon1)
                ) * r;

        return resultCos;
    } 
现在我的代码有两个问题,我不知道它们来自哪里

首先,

目前我的代码适用于5个位置的大多数排列,其中三个位置的经纬度相同(即,在本例中,候选2、候选4和候选5),但对于候选的某些排列,它不会返回最分散的3(例如,对于同一个问题,只需更改候选人声明的顺序)我不明白为什么

第二,

如果注释掉约束以选择至少3个位置,而不是像预期的那样选择所有位置,则会选择“无”

我的目标在大多数情况下都有效这一事实似乎表明它是正确的,有人知道为什么它有时会动摇吗


这不是家庭作业,非常感谢所有回复者。

我认为问题在于您指定的是
HybridLocalSearchDirective
。我从您发布的代码中删除了它,并得到了最佳答案:

ID: 0, Latitude: 43.432, Longitude: -79.432
ID: 1, Latitude: 43, Longitude: -79
ID: 2, Latitude: 23, Longitude: 29
重新排列术语,甚至添加新位置,仍然可以得到最佳解决方案

此外,我随后删除了约束,您的代码选择了所有五个
Location
对象作为解决方案

我希望我能解释一下为什么这样做有效,但对于无国界医生来说,我只是一个周末战士。我可以找到关于的以及它是如何达成解决方案的。重要的是,注意到的第一个限制是:

它不能保证最佳结果

这可能是您第一个问题的答案(为什么它不返回最大分散的位置)

至于你的第二个问题(为什么移除约束不会导致更多的选择位置),我不能确定。你的问题规范可能是该指令的退化情况,尽管我不知道为什么

这不是最好的答案,但我希望它有帮助

ID: 0, Latitude: 43.432, Longitude: -79.432
ID: 1, Latitude: 43, Longitude: -79
ID: 2, Latitude: 23, Longitude: 29