= 创作分享 =
技术讨论
GT5石化通解是怎样炼成的(其实还没炼好) ...
smilesadness

GT5石化通解是怎样炼成的(其实还没炼好)

smilesadness 于 2022-4-13 22:18 ( 2年前 ) 发表在 [讨论] 分类。 [复制链接] [只看楼主] [打印]
1323 2
本贴模组名片
格雷科技5 (GregTech 5)
[ban:title_menu][h1=格雷科技系列站内导航]格雷科技 0(1.2.5);格雷科技 1(1.2.5/1.3.2);格雷科技 2(1.4.7);格雷科技 3(1.5.2);格雷科技 4(1.6.2/1.6.4/1.7.2);格雷科技 5(1.7.2/1.7.10/1.10.2);格雷科技 6(1.7.10)。[h1=模组介绍]发布贴(非官方)BUG反馈百科推荐使..
本帖最后由 smilesadness 于 2022-4-13 22:18 编辑

观前注意:本文仅限内部交流使用,不同的版本、不同的分支、不同的cfg都可能导致最优路径的改变,盲目抄答案导致的产物损失由玩家自行承担。
5.09.33.02数字化草稿本镇楼

众所周知,GT5有3种原油,都可以在蒸馏塔处理成数量不等的3种燃油,3种燃油分别通过2种裂解、蒸馏后可以获得各式各样、数量不同的有机产物;反过来推敲,每种有机产物都有复数种生产方式。在寸土寸金的格雷公司,一朵阴云笼罩在每一位葛朗台的头顶:如何选择生产路线,使最少的原料产出最多的目标产物?
由于单一产物评估和多产物评估互为特殊与一般的关系,本着从特殊推广到一般的套路,本文仅讨论单一产物评估。

一、数据分析。
1.加氢裂解能使比较重的燃油裂解为比较轻的燃油,并产出链烷烃和甲烷;
2.蒸汽裂解能使3种燃油裂解为另外2种燃油,并产出芳香烃和不饱和链烃和甲烷;
3.加氢裂解能使链烷烃裂解为更短的链烷烃;
4.蒸汽裂解能使链烷烃裂解为不饱和链烃和甲烷。
瞪眼法得出以下结论:
1.把蒸汽裂解和加氢裂解分开讨论有助于降低难度;
2.芳香烃只能通过蒸汽蒸汽裂解3种燃油获得;
3.蒸汽裂解3种燃油裂解为另外2种燃油的比例相互共轭;
4.不饱和链烃有两种获得方式:蒸汽裂解燃油、加氢裂解燃油+蒸汽裂解链烷烃。
我们可以初步得出“芳香烃通过蒸汽裂解”的结论,但是不饱和链烃瞪眼法看不出来头,只能算一算。
由于加氢裂解“单向裂解”的特性,我们可以轻松计算出不饱和链烃的产量;受益于蒸汽裂解的高度共轭,我们也可通过简单的多项式加减轻松获得仅蒸汽裂解各种燃油完全处理后的各种不饱和链烃的产量。假如各产物的产量都是明显“加氢裂解燃油+蒸汽裂解链烷烃”多于“蒸汽裂解燃油”,那么受“蒸汽裂解和加氢裂解分开讨论”的影响(由于暴力分组,排列组合出现的情况大量减少),简单得出一个“想要芳香烃就蒸汽裂解,想要不饱和链烃就加氢裂解燃油+蒸汽裂解链烷烃”的结论,话题大概也终结了——石脑油产丁二烯是蒸汽裂解更多——葛朗台们睡不着了。

二、BUG越修越多。
由于蒸汽裂解石脑油产丁二烯更多,所以之前暴力分组而忽略的一些情况,我们需要捡回来重新讨论过:加氢裂解石脑油打不过别人,就不用了,但是另两个燃油如何选择?我们没有思路,只能全试一遍;2种燃油都可能作为原料,都要讨论。所以总共需要考虑2*2*2一共8种情况——熬夜总比失眠舒服。
由于各种组合情况不再共轭,消元的难度激增,我尝试使用逆矩阵的方法计算,结果发现学不会,只能老老实实设待定系数解不定方程,并比较出最优解但是不保证没算错

此时,新的BUG诞生了:其它2种燃油产芳香烃还是不是直接裂解呢?1B重燃油完全加氢能获取1.04B石脑油,产率还更高——瞪眼法的结论发生了一些变化。

三、数学老师真的教过
线性规划,高中数学内容,在多个一次多项式限制条件下寻找另一一次多项式最大值的方法,用此法解决问题应该再适合不过:限制条件都是一次式;自变量变成了3个应该问题不大;评估指标为某个单一产物的产量。我们先提前计算各种处理链的各种原料的消耗(允许负数)和目标产物的产量,每一种处理链变成1个4元数:3种原料的量和产物的量——等比缩放把产物的量变成1然后忽略:3元数——空间坐标系的一个向量。至此,问题变成了奇怪的样子:
空间坐标系内有复数个向量(例:向量A=(a1,b1,c1),向量B=(a2,b2,c2)),若向量A*d1+向量B*d2+…=(x,y,z),则函数G(x,y,z)=d1+d2+…,求函数G(1,0,0)、G(0,1,0)、G(0,0,1)的最大值,此时哪几个常数dn不为0?(为了保证不出现“逆反应”,d1、d2…均为非负数)
根据瞪眼法优秀的数学直觉可得最多只有3个dn不为0(3个不共面的向量可以作为单位向量描述空间里所有点并可与原坐标系稳定相互转换),系数非零的3个向量的顶点构成一个平面lx+my+nz=1,G(该平面上的点)=1恒成立,该平面与3条坐标轴的交点的刻度为l、m、n,l、m、n为系数非零的3个向量组成的3*3矩阵的逆矩阵(这句话可能不对,但是肯定和某一步有关),G(1,0,0)=1/l,G(0,1,0)=1/m,G(0,0,1)=1/n。另外,l、m、n应都>0,否则可能出现原料越消耗越多之类的情况。
至此,奇怪的线性规划问题变成奇怪的形状以后又莫名的圆回来了。

四、就要到终点了……等等,终点有多个?
至此,解题的思路大概出来了:
1.先随机抽取“合适的”3个向量,并求出这3个向量的定点确定的平面lx+my+nz=1;
2.把其中一个向量替换为对应组的一个待选向量,如果它的顶点与坐标原点在平面的同侧(即G(an,bn,cn)<1),则替换;
3.获得新的平面l'x+m'y+n'z=1;
4.通过以上的步骤,新的l、m、n中的2个值应较前减小,最后1个值的趋势需要讨论:未被替换的2个向量的连线有没有进入(+,+,+)区间:如果没有,最后一个值也变小;如果进入了,则变大;交于坐标轴则不变。判断也简单:忽略对应方向的坐标轴化简为平面问题,两点确定一条直线,常数项>0则进入(+,+,+)区间,否则反之。
通过上述步骤不断地缩小l、m、n的值,最终获得G(1,0,0)、G(0,1,0)、G(0,0,1)的最大值这时候应该已经遍历了所有的组合了吧。借助向量的加减,可以进一步获得一般情况G(a0,b0,c0)的值。
另外,当所有待选择的向量的定点在坐标原点的对侧时,我们认为这3个向量的组合是一个“热阱”(我在一个介绍旅行商问题和退火算法的视频里的字幕里认识的,但是百度不到相关介绍),即周围点的评估指标都不如这个点,但是它不一定是极值——多走两步可能会有另一个热阱。
反过来推敲,想获取G(a0,b0,c0)的最优解,亦可以此为法向量构建一簇平面,从-∞向+∞移动,以最先遇到的几个点——因为向量的选择要“合理”(一个象限只需要一个向量、(a0,b0,c0)应在3个向量定点围成的三角形中间、l、m、n均>0),如不符合,则应舍去)——的组合是否为最优解?就算不是最优解,至少也是一个不错的热阱。特别地,对于多个顶点在一个平面上的情况,瞪眼法可得离向量(a0,b0,c0)所在直线越远的点有优势。
此时,我的思维也掉进热阱了。

五、我的目标是星辰大海。
原题只有3种原料,各有2种处理途径。
GT5.09.33的石化是被简化过的,以前更有轻中重3种处理方式,我已尝试让算法支持任意数量的处理方式计算量爆炸解决不了
原料大于4种时,难以可视化,但是算法大概还能使用?至少有很多步骤不依赖几何运行,纯代数环境应该可以正常使用。
多产物评估时,产物不是单纯的计总量,不能将评估指标直接相加;独立求解时对于一个产生多种目标产物的处理途径的评分如何计算;同一个象限可能需要选择多个向量以改变产物的比例;最优解时某个产物可能产量溢出……
限制条件不再是线性时——这是非线性规划的内容,爷已经不会了,再往上深究爷更不会了。
假如有数学专业的大佬可以进一步讲解下去,我代表广大GT员工谢谢你,并送你一量子缸本来打算倒垃圾桶的链烷烃奖励你在GT石化的做出的卓越贡献。
发表于 2022-4-13 22:18:42 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

回复 | 举报

该帖共收到 2 条回复!
Irdium
矩阵法解石化产业链的相关说明(GTNH Wiki)
矩阵法的理论研究

GTNH里基于轻中重三种裂化层次和氢汽两种裂化维度下的一些研究。基于矩阵算法也许更适合计算机编程解任意石化难题。
发表于 2022-4-13 22:39:43 | 只看该作者

回复 | 举报

smilesadness
本帖最后由 smilesadness 于 2022-4-17 13:32 编辑

番外:关于我不会编程遍历矩阵而使用了Excel遍历矩阵而且这玩意还能跑这件事
收到热心群友@坩埚(钨钢)的建议,我真就搞一个遍历矩阵暴力求解试试别人都在编程遍历求解我不会岂不是很没面子
但是我一门计算机语言都不会啊,但是我为什么不用Excel语言来写呢?

然后奇怪的屎山增加了(

本Excel基于智商运行,它的本质就是一个计算器,不提供任何“怎么怎么炼什么什么产物最多”的建议。
Sheet1:用于储存所有燃油的处理方式。以group分组,B列仅作为编号。9列用于多种原料混合的一般情况使用。
Sheet2:
A列:序号不解释
B列:=MOD(An,3)。MOD为求余函数。该列用于引导至Sheet1相应的group。
C列:(An-Bn)/3。该列同序号则为同一种处理组合。
D列:=(MOD($Cn,8)-MOD($Cn,4))/4+1;E列:=(MOD($Cn,4)-MOD($Cn,2))/2+1;F列:=MOD($Cn,2)+1。这3列将Cn转换成二进制数,+1则对应group的某个处理方式。
G列:B列为0时为=Bn*2+Dn;B列为1时为=Bn*2+En;B列为2时为=Bn*2+Fn。此列需在数据筛选后分3次粘贴,如有更好的函数请告诉我。该列将用于引导寻找Sheet1的某一列。
H列:=VLOOKUP($Gn,Sheet1!$B$2:$F$7,2,FALSE);I列:=VLOOKUP($Gn,Sheet1!$B$2:$F$7,3,FALSE);J列:=VLOOKUP($Gn,Sheet1!$B$2:$F$7,4,FALSE);K列:=VLOOKUP($Gn,Sheet1!$B$2:$F$7,5,FALSE)。VLOOKUP是一种纵向查找函数,由于参数较多,详细用法请百度。反正就通过G列把Sheet1对应列的数据抓取过来了。
L列、M列、N列:{=MINVERSE(Hn:Jn+2)}。MINVERSE为矩阵求逆函数。使用该函数需先选择容纳逆矩阵的区域,再输入大括号内的函数,再Ctrl+Shift+Enter确定。完成第一个逆矩阵后再应用至其他单元格。注意:这几列的值应≤0,否则为不合法。
O列:=MMULT(Ln:Nn+2,Kn:Kn+2)。MMULT为矩阵乘积函数。使用该函数需先选择容纳矩阵的积的区域,再输入大括号内的函数,再Ctrl+Shift+Enter确定。注意:矩阵乘积没有乘法交换律。完成第一个矩阵的积后再应用至其他单元格。
P列:=-On。换号。该列代表以1桶(B)B列这一行的值对应的组的燃油在C列这一行的值对应的组合中能炼出多少桶(B)的目标产物。
Q列:=MMULT(Sheet1!$C$9:$E$9,Sheet2!Pn:Pn+2)。多原料计算,指多种原料下该处理方式的组合的产物的值。1×1的矩阵可以不用Ctrl+Shift+Enter。
关于本表的改装:
1.假如你想让本表支持轻中重裂解,除了Sheet1收集18种处理方式、Sheet2序号扩大到648以外,还需要把DEF列都改为6进制,怎么改自己想。
2.假如有憨批删了某种燃油的某种处理方式(即3种燃油的处理方式不都是6种),则DEF不需要都为6进制,把其中某个改成5进制也行,这样序号就可以比648小一点,怎么改自己想,另外Sheet1的那个组要留相应的空行(想想我G列写了啥)。
3.假如你觉得链烷烃裂解制烯烃一头雾水,你可以把3种燃油换成3种链烷烃,计算出特定配比的链烷烃在哪种处理组合制烯烃的产量最高以后,再还原本表计算3种燃油哪种处理组合制烯烃产量更高。

GT石化最优解.rar

13.01 KB, 下载次数: 6

发表于 2022-4-17 13:28:10 | 只看该作者

回复 | 举报

百科目前不允许匿名发帖哦~ 请先 [ 登陆 ][ 注册 ] 吧~

本版积分规则

发新帖
  • 回复
  • 点评
  • 评分

[ MC百科(mcmod.cn) 除另有声明,所有开放公共编辑的内容均使用 BY-NC-SA 3.0 协议 ]

Minecraft百科CC协议
快速回复 返回顶部 返回列表