矩形颠倒算法
① 求两矩形是否重叠的算法,思路。答出再加50分
1.
计算宽度之和、高度之和,如果宽度和较大则先处理2.1,否则先处理2.2
2.1.
按照宽度从小到大排列,宽度相同的矩形拼成更大的矩形
2.2.
按照高度做相同的处理
3.
重复以上步骤,直到没有宽、高相同的矩形
1.
计算宽度之和、高度之和,如果宽度和较大则先处理2.1,否则先处理2.2
2.1.
按照宽度从小到大排列,找出两个矩形,使得拼接后的“矩形”面积中空缺部分最小(较可能是宽度相差较小的两个矩形)。
2.2.
按照高度做相同的处理
3.
重复以上步骤,直到只剩下一个矩形(最终解)
以上两段其实是一个意思:尽量用较小的“面积损失”最大限度的减少待处理矩形数。只是第一段是特例,也就是无“面积损失”的拼接。
不过,一般来说,这不会是最优解。
② 求利用遗传算法实现矩形件排样 的VC编程案例。。
变异算子
从遗传算法的观点来看,解的进化主要是靠选择机制和交叉策略来完成,变异只是产生
新个体的辅助方法, 它决定了遗传算法的局部搜索能力。交叉算子和变异算子相互配合,
共同完成对搜索空间的全局搜索和局部搜索, 从而使遗传算法能够以良好的搜索性能完成
最优化问题的寻优过程,变异概率一般取为0.0001~0.1。变异算子一般采用旋转变异或位置
变异,设要排放的零件总数为n。
旋转变异的思想是产生[1,n]之间的一个随机数num,将该数取其相反数。
例如:产生的随机数 num=5
染色体为:A={ -3 , 5 , 7 ,-1 , 6 , 8 ,-2 , 4}
变异后的结果为:A’={ -3 , 5 , 7 ,-1 ,-6, 8 ,-2 , 4}
位置变异的思想是产生[1,n]之间的两个随机数num1、num2,将两个位置颠倒。
例如:产生的随机数 num1=3,num2=6
染色体为:A={ -3 , 5 , 7 ,-1 , 6 , 8 ,-2 , 4}
变异后的结果为:A’={ -3 , 5 , 8 ,-1 ,6,7 ,-2 , 4}
2. 6 适应度函数
适应度函数定义的好坏对问题的求解效果有很大影响。常见的定义适应度函数的方法有
两种:一种从排样图的最大高度方面考虑,要求尽量使排样图的最大高度值小,一般用最大
高度值的倒数来表示。另一种是从废料再利用的角度进行考虑的,要求尽可能的提高可再利
用废料的利用率(可再利用废料是指处于排样图最高轮廓线和排样图最大高度水平线之间的
部分)。针对板材的两种情况,分别定义了不同的适应度函数,假设排入的矩形件的总面积
为area1[4]。
(1) 定宽无限长的板材情况
对于定宽无限长的板材,一般用排样高度来评价排样的优劣,适应度函数如下:
Fitness area1
h w
=
×
其中,h 为排样图的最大高度,w 为板材的宽度。
(2) 定宽定长的板材情况
这种情况下的适应度函数如下:
1
2
Fitness area
area h w
=
+ ×
其中,area2 为去掉最后一张板材的总面积,h 为最后一张板材的排样图的最大高度,w 为
http://www.paper.e.cn
- 5 -
最后一张板材的宽度。
这里适应度函数 Fitness 的物理意义就是板材的利用率。
2. 7 选择算子
在生物的遗传和自然进化过程中,对生存环境适应程度较高的物种将有更多的机会遗传
到下一代;而对生存环境适应程度较低的生物遗传到下一代的机会就相对较小。模仿这个过
程,遗传算法使用选择算子(或称复制算子,Reproction Operator)来对群体中的个体进
行优胜劣汰操作:适应度较高的个体被遗传到下一代群体的概率较大;适应度较低的个体被
遗传到下一代群体的概率较小。遗传算法中的选择操作就是用来确定如何从父代群体中按某
种方法选取哪些个体遗传到下一代群体中的一种遗传运算。
选择算子采用最优保存策略[3],即把当前群体中适应度最高的个体不
③ 判断两个矩形是否有重叠的算法
setInterval(函数名,1000); t: Timer = new Timer(1000, 5); t.addEventListener(TimerEvent.TIMER,函数名); t.addEventListener(TimerEvent.TIMER_COMPLETE, 函数名); t.start()
④ 求一算法,检测一平面坐标系内数量特别巨大的矩形互相是否重叠
对这些矩形按照坐标排序,然后再找出他们的位置的关系
⑤ 求一个排列算法,或者解决的思路!若干矩形拼凑成一个矩形,不能重叠,如何排列可以使最终面积最小
1. 计算宽度之和、高度之和,如果宽度和较大则先处理2.1,否则先处理2.2
2.1. 按照宽度从小到大排列,宽度相同的矩形拼成更大的矩形
2.2. 按照高度做相同的处理
3. 重复以上步骤,直到没有宽、高相同的矩形
1. 计算宽度之和、高度之和,如果宽度和较大则先处理2.1,否则先处理2.2
2.1. 按照宽度从小到大排列,找出两个矩形,使得拼接后的“矩形”面积中空缺部分最小(较可能是宽度相差较小的两个矩形)。
2.2. 按照高度做相同的处理
3. 重复以上步骤,直到只剩下一个矩形(最终解)
以上两段其实是一个意思:尽量用较小的“面积损失”最大限度的减少待处理矩形数。只是第一段是特例,也就是无“面积损失”的拼接。
不过,一般来说,这不会是最优解。
⑥ 矩形排样算法 易语言源代码
根据产品形状排列方法是不一样的。如果是标准方形、圆形可以用阵列工具;如果是异型,要么用专用的切割软件,上面都有排样,如果必须用cad,只能自己以最省的方式排出来,然后再阵列咯。
⑦ 判断两个矩形是否有重叠的算法解决方法
假设是确保有效的 RECT,不是无效的
RECT r1, r2;
...
RECT rCommon;
rCommon.left = max(r1.left, r2.left);
rCommon.top = max(r1.top, r2.top);
rCommon.right = min(r1.right, r2.right);
rCommon.bottom = min(r1.bottom, r2.bottom);
这个 rCommon 是这两个矩形的交集,判断交集部分是否是有效的矩形就可以了
⑧ VB 求算法 两个矩形重叠部分
假定第一个矩形的坐标为x1,y1,宽高为w1,h1,第二个矩形的坐标为x2,y2,宽高为w2,h2:
If X2 > X1 And X2 < X1 + w1 And Y2 > Y1 And Y2 < Y1 + h1 Then
MsgBox "两个矩形有重叠,重叠区域:x=" & X2 & " y=" & Y2 & " w=" & X1 + w1 - X2 & " h=" & Y1 + h1 - Y2
ElseIf X1 > X2 And X1 < X2 + w2 And Y2 > Y1 And Y2 < Y1 + h1 Then
MsgBox "两个矩形有重叠,重叠区域:x=" & X1 & " y=" & Y2 & " w=" & X2 + w2 - X1 & " h=" & Y1 + h1 - Y2
ElseIf X2 > X1 And X2 < X1 + w1 And Y1 > Y2 And Y1 < Y2 + h2 Then
MsgBox "两个矩形有重叠,重叠区域:x=" & X2 & " y=" & Y1 & " w=" & X1 + w1 - X2 & " h=" & Y2 + h2 - Y1
ElseIf X1 > X2 And X1 < X2 + w2 And Y1 > Y2 And Y1 < Y2 + h2 Then
MsgBox "两个矩形有重叠,重叠区域:x=" & X1 & " y=" & Y1 & " w=" & X2 + w2 - X1 & " h=" & Y2 + h2 - Y1
Else
MsgBox "两个矩形没有重叠"
End If
⑨ c语言,怎么将一个n行,每行m个数的矩形数组矩阵逆时针转动90度啊
#include<stdio.h>
#define M 3
#define N 5
int main(void)
{
int a[N][M],left[M][N],right[M][N];
int i,j,k;
for(i=0;i<N;i++)
{
printf(逗请输入第%d行%d个整数:地,i+1,M);
for(j=0;j<M;j++)scanf(逗%d地,&a[i][j]);
}
printf(逗原始数组:\n地);
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
printf(逗%5d地,a[i][j]);
left[j][i]=right[j][i]=a[i][j];
}
putchar('\n');
}
for(i=0;i<M/2;i++)
for(j=0;j<N;j++)
{
k=left[i][j];
left[i][j]=left[M-i][j];
left[M-i][j]=k;
}
for(i=0;i<M;i++)
for(j=0;j<N/2;j++)
{
k=right[i][j];
right[i][j]=right[i][N-j];
right[i][N-j]=k;
{
printf(逗左转90度:\n地);
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)printf(逗%5d地,left[i][j]);
putchar('\n');
}
printf(逗右转90度:\n地);
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)printf(逗%5d地,right[i][j]);
putchar('\n');
}
return 0;
}
⑩ 请问有什么高效简便的矩形碰撞算法
那个时轴对称aabb的碰撞,你旋转后就不灵了,旋转后只能视为两个多边形求了,要么利用物理引擎求,要么自己写算法求。如果要求效率不高,直接迭代边求交最简单的方法