经过4天的阅读和研究,在数学和计算机科学图书馆在我的地方和在线阅读,我真的很茫然,需要一些明确的简单外行的见解,我手头的问题。
这是我的现实世界问题,然后我将表明我理解这个问题,但不知道如何将其转化为一个c mvc5解决方案。
问题:
我已经建立了一个c mvc 5解决方案,从一个新的订单建立托盘。我已经完成了订单,并创建了一个列表,列出了所有订购到完整货盘或部分货盘的物品。然后我拿部分货盘清单,看看什么小于2800磅,看看我如何才能把一个混合货盘放在一起,总重量达到2800磅。我做得很好,把货盘分开,总重量达到2800磅。然而,这是伟大的运输效率,但这不是客户友好的,不应该分开。
从这里开始我就被困在这里了。我被告知要采取部分托盘清单和任何一组托盘得到最接近2800磅把所有这些放在一起,然后下一组(或剩余)继续下一个托盘高达2800。
然后我开始研究这种算法的类型,我知道这是一个子集和问题。我看到了无数的堆栈溢出的帖子,指向wiki页面,我不得不告诉你,我不是数学家,不知道如何把这变成一个真正的解决方案。
以下是我目前已知的参数。
混合托盘应为2800磅。
货物清单可以放在一个混合托盘上,至少2件,但我认为不能超过20件(全部取决于货物重量或货物类型)
下面是当前演示的权重列表
2575,92,1200,640
接近2800磅的最佳组合是什么?把它们从列表中去掉,那么2800磅的下一个最佳组合是什么?
这是我第一次着手解决这个问题
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();
}
}
}
我哪里做错了?
最佳答案
以下是与我在上述评论中的解释相关的代码:
“我认为最好的方法是根据权重按降序排列数组(所以[25751200 64092])。从最重的开始,然后尝试添加下一个,除非它超过2800如果是,继续向下移动列表,直到找到一个合适的。如果列表中没有合适的货物,或者您已经达到20件,那么托盘就完成了再重复一遍”
我不能保证它没有bug,但当我扩展输入数组时,它似乎也能工作。我相信这样做会更有效率。欢迎提出建议。
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
托盘组合:1200730640,总重量:2570
托盘组合:500290,总重量:790
-
示例输出(原始数组):
托盘组合:2575,92,总重量:2667
托盘组合:1200640,总重量:1840