Math 数学中的整数优化?

Math 数学中的整数优化?,math,wolfram-mathematica,mathematical-optimization,Math,Wolfram Mathematica,Mathematical Optimization,我有一个整数规划问题。我有一根10米长的管子。我想切下尽可能多的1.2米,然后把剩下的管子切成100毫米。我必须留下100毫米让机器抓取。如何在mathematica中对此进行优化?我想我可以把它当作一个等式来解决,但如果我只想直接得到答案的话。 基本上,尽可能多的y,然后x:es 最大化[{x*100+y*1200,x*100+y*1200使用x,yetc上的假设值>0 etc,您最终将能够获得/N Mathematica不会假设你在现实世界中!因为9900和1200都是100的倍数,所以算法

我有一个整数规划问题。我有一根10米长的管子。我想切下尽可能多的1.2米,然后把剩下的管子切成100毫米。我必须留下100毫米让机器抓取。如何在mathematica中对此进行优化?我想我可以把它当作一个等式来解决,但如果我只想直接得到答案的话。 基本上,尽可能多的y,然后x:es


最大化[{x*100+y*1200,x*100+y*1200使用
x,y
etc上的假设值
>0 etc
,您最终将能够获得
/N


Mathematica不会假设你在现实世界中!

因为9900和1200都是100的倍数,所以算法只是

TotLen = 9900;
numberOf1200pieces = IntegerPart[TotLen/1200];
numberOf100pieces  = IntegerPart[(TotLen - 1200 numberOf1200pieces)/100];

Print["Number of 1200mm pieces: ", numberOf1200pieces];
Print["Number of 100mm pieces: ", numberOf100pieces];
Print["Leftover: ", 9900 - numberOf1200pieces 1200 - numberOf100pieces 100,"mm"];

Number of 1200mm pieces: 8
Number of 100mm pieces: 3
Leftover: 0mm
您也可以尝试:

Maximize[{x*100 + y*1200, x*100 + y*1200 == 9900}, {x, y}, Integers]
->{9900, {x -> 3, y -> 8}}
Belisarius的方法是通过
最大化
最简单的方法。但是,它需要将不等式更改为等式,这并不反映您的意图。相反,使用第7节,我要添加第二个条件

Maximize[{x*100 + y*1200, x*100 + y*1200 <= 9900, y > x > 0}, 
         {x, y}, Integers] -> {9900, {y -> 8, x -> 3}} 
最大化[{x*100+y*1200,x*100+y*1200 x>0},
{x,y},整数]->{9900,{y->8,x->3}

新的条件(
y>x>0
)反映了您的意图,即首先选择较大的块更好。另外,请注意,我更改了不等式(
),以从表面上回答这个简单的问题,而不是推断它是优化的玩具示例,下面是一种“统一”数字的方法

Floor[ FoldList[Mod, #, Most@#2] / #2 ] &[ 9900, {1200, 100} ]

响应贝利萨里的暗示,我的回答太幼稚,我认为这可能是一个有效的,虽然效率较低的方法更复杂的情况。考虑分裂9950长度12, 75和1200。< /P>
i = 9950;

While[x = Quiet@IntegerPartitions[i--, All, {12, 75, 1200}, 1]; x === {}]

x[[1]] // Tally
decideOrderOfProduction[ItemStopProduce]:=
映射[#[[1]]和排序[itemsToProduce,#1[[2]]>#2[[2]]和]]
最小值[管道1,管道2]:={
最大化[{pipe1*x+pipe2*y,pipe1*x+pipe2*y=x>=0},{x,y},整数]
}
最小应力[管道]:={
最大化[{pipe*x,pipe*x=0},x,整数]
}
计划生产[项目停止生产]:={
productionOrder=decideOrderOfProduction[项目停止生产];
战略={};
当[Length[productionOrder]>=2时,
管道1=生产订单[[1]];
管道2=生产订单[[2]];
策略=
追加[strategy,{pipe1,pipe2,minimizeWaste[pipe1,pipe2]}];
productionOrder=删除[productionOrder,2];];
如果[Length[productionOrder]==1,
策略=
追加[strategy,{productionOrder[[1]],Null,
最小化存储[productionOrder[[1]]]}]];
策略
}
项目={99,1}、{200,12}、{1200,2}、{90,5}、{70,1200};
决定生产[项目]
生产计划[项目]
{70, 200, 90, 1200, 99} {{70200,{4900,{x->10,y->21}}},{90, 1200,{4890,{x->1,y->4}}},{99, 空,{4851,{x->49}
这是一个开始,但它不好,因为不知何故我需要更好地考虑优先级,我需要完成每个管道的数量。不知何故,我猜数量也需要考虑优先级。

最大化[{x*99+y*1200,{x*99+y*12000,y>0},y,整数]也不起作用。@johnny第二个参数必须指定所有变量。在我的机器中,你的等式给出
{9900,{x->3,y->8}
我在摆弄
这很好,但取决于系数,它仍然可能给出不太完美的结果。有没有办法指定一个双重最大化,其中y尽可能大?@先生,最大y总是
整数部分[TotLen/1200]
@belisarius是的;我想这是一个玩具示例,我想知道
最大化
的更一般的用法,因为我想是Johnny。通常的问题稍微微妙一点,因为你不想要剩菜。假设你有[16,{5,3}作为输入。你可以给出{3,0}或{2,2}因此,最后一个问题是没有剩余的。一般情况下,这是一个研究得很好的问题,有很多商业产品可以解决。几乎每个工厂在某些生产阶段都有这种问题。@belisarius这是OP可能想要解决的更深层次的问题,我希望看到使用Mathematica.Nev的解决方案然而,问题是:“我想尽可能多地切割1.2米的管道,然后将其余的管道切割成100毫米。”我认为我天真的代码就是这么做的。我错了吗?啊,你今天太敏感了:)!我只是想说,当你添加一些简单的约束条件时,问题变得非常奇怪,更不用说在现实世界中了。也许我的坚持来自几年前,当我参与解决埃弗里的一个大型纸卷切割网站的同一个问题时。这是一个相当大的项目。如果我在这方面冒犯了你,请接受我的道歉无论如何,因为这不是我的本意。@belisarius我当然没有生气。你能给我一个链接吗?你正在谈论的更高级的优化问题的一个例子?例如,看看什么是最大化[{y,{x*100+y*1200==9900,x>=0,y>=0},{x,y},整数]
decideOrderOfProduction[itemsToProduce_] := 
 Map[#[[1]] &, Sort[itemsToProduce, #1[[2]] > #2[[2]] &]]
minimizeWaste[pipe1_, pipe2_] := {
  Maximize[{pipe1*x + pipe2*y, pipe1*x + pipe2*y <= 4900, 
    y >= x >= 0}, {x, y}, Integers]
  }
minimizeWaste[pipe_] := {
  Maximize[{pipe*x, pipe*x <= 4900, x >= 0}, x, Integers]
  }
planProduction[itemsToProduce_] := {
  productionOrder = decideOrderOfProduction[itemsToProduce];
  strategy = {};
  While[Length[productionOrder] >= 2,
   pipe1 = productionOrder[[1]];
   pipe2 = productionOrder[[2]];
   strategy = 
    Append[strategy, {pipe1, pipe2, minimizeWaste[pipe1, pipe2]}];
   productionOrder = Drop[productionOrder, 2];];
  If[Length[productionOrder] == 1,
   strategy = 
    Append[strategy, {productionOrder[[1]], Null, 
      minimizeWaste[productionOrder[[1]]]}]];
  strategy
  }


items = {{99, 1}, {200, 12}, {1200, 2}, {90, 5}, {70, 1200}};
decideOrderOfProduction[items]
planProduction[items]
{70, 200, 90, 1200, 99} {{{70, 200, {{4900, {x -> 10, y -> 21}}}}, {90, 1200, {{4890, {x -> 1, y -> 4}}}}, {99, Null, {{4851, {x -> 49}}}}}}