在我所在地区的数学和计算机图书馆阅读和研究4天并在线阅读后,我真的很茫然,需要一些明确的简单的外行人对我手头的问题的见解。
这是我的真实世界问题然后我将表明我理解了这个问题,但不知道如何正确地将其转换为C#MVC 5solution。
问题: 我已经构建了一个C#MVC 5解决方案来构建来自传入订单的托盘。我已完成订单并创建了订购到完整托盘或部分托盘中的所有物品的清单。然后我拿下部分托盘清单,看看小于2800磅的东西,看看我怎么能把一个混合托盘组合到总重达2800磅。我通过拆分托盘达到2800磅的总量来做得非常好。然而,这对于运输效率来说是很好的,但是,这不是客户友好的,不应该分开。
从这里开始,这就是我被困住的地方。我被告知要拿部分托盘列表和任何托盘组合最接近2800磅将所有这些放在一起,然后下一组(或其余部分)再次进入下一个托盘,直至2800。
然后我开始研究这种类型的算法,我明白这是一个子集和问题。我已经看到无限的堆栈溢出帖子指向WiKi页面,我必须告诉你我不是数学家,并且无法理解如何将其转化为真正的解决方案。
这是我目前已知的参数。
混合托盘应为2800磅。
项目列表可以在混合托盘上应该至少有2个项目,但我认为不再有20个项目(全部取决于项目或项目类型的重量)
这是当前演示的权重列表 2575,92,1200,640
接近2800磅的最佳组合是什么?将它们从该列表中删除,然后2800lbs的下一个最佳组合是什么?
这是我第一次解决这个问题
using System;
namespace TwoElementsWhoseSumIsClosestToZero
{
class Program
{
static void Main(string[] args)
{
var integerArray = new int[] { 2575, 92, 1200, 640 };
maxAbsSumPairs(integerArray, 4);
}
static void maxAbsSumPairs(int[] arr, int arrsize)
{
var sum = int.MaxValue;
var minSum = int.MaxValue;
var l = 0;
var r = arrsize - 1;
var minl = l;
var minr = arrsize - 1;
if (arrsize < 2)
{
Console.WriteLine("Invalid Input");
return;
}
Array.Sort(arr, l, r);
while (l < r)
{
sum = arr[l] + arr[r];
if (Math.Abs(sum) < Math.Abs(minSum))
{
minSum = sum;
minl = l;
minr = r;
}
if (sum < 2800)
{
l++;
}
else
{
r--;
}
}
Console.WriteLine(" The two elements whose sum is minimum are {0} and {1}", arr[minl], arr[minr]);
Console.ReadLine();
}
}
}
我在哪里错了?
答案 0 :(得分:0)
我删除了你的MVC标签,因为这是一个普遍的问题,与MVC无关。这可能有一个命令行或WinForm接口,要解决的问题是相同的。
话虽如此,我相信这与knapsack problem有关。总和子集需要精确匹配总和,同时背包问题可能会返回一个未满载的背包。我会尝试实现背包问题,这有利于最大限度地减少背包中装载的物品(对于重量相同的候选解决方案),这样你就不会得到一个装满很多小物品的托盘,然后几个大而重的物品,不能放在一起。
如果您在撰写此类算法时遇到任何问题,请发表评论并跟进一些示例代码。
答案 1 :(得分:0)
以下是与我上面评论中的解释相关的代码:
&#34;我认为最好的方法是根据权重按降序对数组进行排序(所以[2575,1200,640,92])。从最重的开始然后尝试添加下一个,除非它超过2800.如果它超过,继续向下移动列表,直到找到适合的列表。如果列表中没有更多内容或者您已达到20个项目,则该托盘已完成。并重复&#34;
我不能保证它没有错误,但是当我扩展输入数组时似乎也能正常工作。我确信它可以更有效地完成。欢迎提出建议。
using System;
using System.Linq;
using System.Collections.Generic;
namespace palletSorter
{
class MainClass
{
public static void Main(string[] args)
{
var integerArray = new int[] { 2575, 92, 1200, 640, 290, 730, 50, 23, 500};
CreateBestPallets(integerArray);
}
private static void CreateBestPallets(int[] items)
{
var sortedItems = items.OrderByDescending(c => c).ToList();
while (sortedItems.Count > 0)
{
var totalWeight = 0;
var pallet = new List<int>();
var removedItems = new List<int>();
foreach (var item in sortedItems)
{
if (pallet.Count == 20)
break;
if ((totalWeight + item) < 2800)
{
totalWeight += item;
pallet.Add(item);
removedItems.Add(item);
}
}
foreach (var item in removedItems)
{
sortedItems.Remove(item);
}
var printString = "";
foreach (var item in pallet)
{
printString += item + ",";
}
Console.WriteLine("Pallet Combination: " + printString + "\tTotal Weight: " + totalWeight);
}
}
}
}
这是一个示例输出(扩展数组):
托盘组合:2575,92,50,23,总重量:2740
托盘组合:1200,730,640,总重量:2570
托盘组合:500,290,总重量:790
示例输出(原始数组):
托盘组合:2575,92,总重量:2667
托盘组合:1200,640,总重量:1840