乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 229|回复: 14

-= { Challenge } =-FOB mini grid(Bin packing-Subset Sum)Lispers请加入

[复制链接]

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2014-12-5 09:56:26 | 显示全部楼层 |阅读模式
如果有人可以正确地对这个问题进行分类,请让我知道,但认为这是一个垃圾箱包装问题或子集总和问题,也许是背包问题的一个现实世界的例子,如果需要的话, 什么挑战,一个临时的军事基地在甜点中间,在国外必须自己发电,即使它是在一个地方连接到一个国家的电网基地,也不想依赖外国的电网,这些底座将具有许多不同的组件,每个组件需要不同的功率,例如,将有30个坯料@ 14.4kW,每个2个换尿布站@ 12.34kW4急救@ 15.3kW等..... 他们将拥有一个60kW的发电机,理想情况下,或者如果发电机并联为电网供电,您将获取总功率并除以60(如果剩余功率再加1),这将是所需的发电机总数,这些发电机直接为组件供电,因此,除非您以总和等于发电机总输出的方式组合组件,否则您不会使用所有发电机的可用功率,目标是将组件组合在一起,以便它们需要最少的生成器, 问题,Generator OutPut - 发电机可以产生的总功率。
每个组件都需要电源的集合,没有组件需要超过发电机输出,因此1组件功率永远不会超过发电机输出。
每个组件可以有 1 个或多个, 挑战在于获取组件的集合,并将它们放入总和等于或小于生成器输出的组中,以便组件需要最少数量的生成器。你可以只使用双打或实数的列表,。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2014-12-5 11:00:35 | 显示全部楼层
哦,是的,只是为了扔进去,
假设你的电脑每秒可以计算出1,000,000种不同的组合。
只需1秒即可计算20个项目的所有不同组合。
只需36年即可计算出50个项目的所有不同组合
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2014-12-5 15:02:20 | 显示全部楼层
嗨,这是一个简单的首次适合递减装箱C#实现。   静态列表 > BinPack(IEnumerable  source,double packSize)。
{。
var groups = source。
,GroupBy(x => x)。
,order by descending(g = > g . Key)。
,Select(g => g.ToList())。
,to list();。
var result = new List  >();。
while(组,Count > 0)。
{。
var List = new List ();。
var I = 0;。
while (i  0)。
{。
如果(列表,Sum() + groups[i][0] 。
{。
列表,添加(组[I][0]);。
组[i],remove at(0);。
if (groups[i].Count == 0)。
{。
组,remove at(I);。
}。
}。
否则。
{。
i++;。
}。
}。
结果,添加(列表);。
}。
返回结果;。
}。
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2014-12-5 16:57:02 | 显示全部楼层
谢谢gile!!
输出看起来很棒,需要多盯着它看一会儿才能让它吸收。
...
我希望我能每周借你一两次大脑。
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2014-12-5 17:35:53 | 显示全部楼层
谢谢杰夫
一次F#尝试:
让binPack打包源代码=
让rec添加lst x=
将lst与
匹配
|[]->[[x]]
当x+列表时,
|h::t。和h
(x:h)::t
|h::t->h::(添加tx)
源|>序列。sortBy(~-)|>Seq。折叠添加[]
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2014-12-5 17:52:55 | 显示全部楼层
尾部递归的:    let binPack packSize source = 。
让rec loop x acc = function。
|[]-->([x]::ACC)| > list . rev 。
| h::t when x+list . sum h > packSize-> loop x(h::ACC)t 。
| h::t-->((x::h)::ACC | > list . rev)@ t 。
source | > seq . sort by(~-)| > seq . fold(fun l x-> loop x[]l)[][]  。
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2014-12-6 04:04:39 | 显示全部楼层
一个LISP版本:
  1. (defun binPack (packsize source / insert result)
  2.   (defun insert (x lst)
  3.     (cond
  4.       ((null lst) (list (list x)))
  5.       ((
  6.        (cons (cons x (car lst)) (cdr lst))
  7.       )
  8.       (T (cons (car lst) (insert x (cdr lst))))
  9.     )
  10.   )
  11.   (foreach x (vl-sort source '>)
  12.     (setq result (insert x result))
  13.   )
  14. )

本地函数中的time循环也是如此,以避免递归(AutoLISP不优化尾部递归)。
  1. (defun binPack (packsize source / insert result)
  2.   (defun insert (x lst / done acc)
  3.     (while (not done)
  4.       (cond
  5.         ((null lst)
  6.          (setq acc  (reverse (cons (list x) acc))
  7.                done T
  8.          )
  9.         )
  10.         ((> (+ x (apply '+ (car lst))) packSize)
  11.          (setq acc (cons (car lst) acc)
  12.                lst (cdr lst)
  13.          )
  14.         )
  15.         (T
  16.          (setq acc  (append (reverse (cons (cons x (car lst)) acc)) (cdr lst))
  17.                done T
  18.          )
  19.         )
  20.       )
  21.     )
  22.     acc
  23.   )
  24.   (foreach x (vl-sort source '>)
  25.     (setq result (insert x result))
  26.   )
  27. )
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2014-12-6 05:47:37 | 显示全部楼层
一个更简单的C#实现:
私有静态列表
>BinPacking(IEnumerable
源代码,双packSize)
{
var结果=新列表
>()
foreach(source.OrderByDescending中的var项(x=>x))
{
var done=false
用于(int i=0;i
{
var list=结果[i]
if(item+list.Sum()
{
列表。添加(项)
done=true
中断
}
}
如果(!完成)
{
<div>var list=新列表<double>({item})
结果。添加(列表)
}
}
返回结果
}
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2014-12-6 07:22:35 | 显示全部楼层
好东西 gile
一个小问题,但我认为:
  1. (loop x (cdr lst))

应该是
  1. (insert x (cdr lst))
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2014-12-6 07:55:47 | 显示全部楼层
哎呀!...
谢谢李。现已更正。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-5-26 10:07 , Processed in 4.949914 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表