矩形顛倒演算法
① 求兩矩形是否重疊的演算法,思路。答出再加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的碰撞,你旋轉後就不靈了,旋轉後只能視為兩個多邊形求了,要麼利用物理引擎求,要麼自己寫演算法求。如果要求效率不高,直接迭代邊求交最簡單的方法